summaryrefslogtreecommitdiff
path: root/biblio/citation-style-language/citeproc-node-number.lua
diff options
context:
space:
mode:
Diffstat (limited to 'biblio/citation-style-language/citeproc-node-number.lua')
-rw-r--r--biblio/citation-style-language/citeproc-node-number.lua118
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