diff options
Diffstat (limited to 'biblio/citation-style-language/citeproc-node-number.lua')
-rw-r--r-- | biblio/citation-style-language/citeproc-node-number.lua | 118 |
1 files changed, 42 insertions, 76 deletions
diff --git a/biblio/citation-style-language/citeproc-node-number.lua b/biblio/citation-style-language/citeproc-node-number.lua index ba096157aa..4ef308e3d0 100644 --- a/biblio/citation-style-language/citeproc-node-number.lua +++ b/biblio/citation-style-language/citeproc-node-number.lua @@ -6,97 +6,63 @@ local number_module = {} -local element = require("citeproc-element") -local util = require("citeproc-util") - - -local Number = element.Element:new() - -function Number:render (item, context) - self:debug_info(context) - context = self:process_context(context) - local variable = context.options["variable"] - local content = self:get_variable(item, variable, context) +local Element = require("citeproc-element").Element - table.insert(context.variable_attempt, content ~= nil) +local Rendered = require("citeproc-ir-node").Rendered - if not content then - return nil - end - - local numbers = {} - local punct_list = {} - local last_position = 1 - for number, punct, pos in string.gmatch(content, "(.-)%s*([-,&])%s*()") do - table.insert(numbers, number) - table.insert(punct_list, punct) - last_position = pos - end - table.insert(numbers, string.sub(content, last_position)) +local util = require("citeproc-util") - local res = "" - for i, number in ipairs(numbers) do - local punct = punct_list[i] - number = self:_format_single_number(number, context) - res = res .. number - if punct == "-" then - res = res .. punct - elseif punct == "," then - res = res .. punct .. " " - elseif punct == "&" then - res = res .. " " .. punct .. " " - end - end +local Number = Element:derive("number") - res = self:case(res, context) - res = self:wrap(res, context) - res = self:display(res, context) +function Number:new(node) + local o = { + element_name = "number", + form = "numeric", + } + setmetatable(o, self) + self.__index = self + return o +end - return res +function Number:from_node(node) + local o = Number:new() + o:set_attribute(node, "variable") + o:set_attribute(node, "form") + o:set_affixes_attributes(node) + o:set_display_attribute(node) + o:set_formatting_attributes(node) + o:set_text_case_attribute(node) + return o end -function Number:_format_single_number(number, context) - local form = context.options["form"] or "numeric" - if form == "numeric" or not string.match(number, "^%d+$") then - return number +function Number:build_ir(engine, state, context) + local number + if not state.suppressed[self.variable] then + number = context:get_variable(self.variable, self.form) end - number = tonumber(number) - if form == "ordinal" or form == "long-ordinal" then - return self:_format_oridinal(number, form, context) - elseif form == "roman" then - return util.convert_roman(number) + if not number then + local ir = Rendered:new({}, self) + ir.group_var = "missing" + return ir end -end - -function Number:_format_oridinal(number, form, context) - assert(type(number) == "number") - local variable = context.options["variable"] - if form == "long-ordinal" then - if number < 1 or number > 10 then - form = "ordinal" - end + if type(number) == "number" then + number = tostring(number) + number = self:format_number(number, self.variable, self.form, context) + elseif util.is_numeric(number) then + number = self:format_number(number, self.variable, self.form, context) end - local gender = nil - local term = self:get_term(variable) - if term then - gender = term:get_attribute("gender") - end + local inlines = self:render_text_inlines(number, context) + local ir = Rendered:new(inlines, self) + ir.group_var = "important" - term = self:get_term(form, nil, number, gender) - local res = term:render(context) - if form == "ordinal" then - if res then - return tostring(number) .. res - else - res = tostring(number) - end - else - return res + -- Suppress substituted name variable + if state.name_override and not context.sort_key then + state.suppressed[self.variable] = true end - return res + return ir end |