diff options
Diffstat (limited to 'biblio/citation-style-language/citeproc-node-locale.lua')
-rw-r--r-- | biblio/citation-style-language/citeproc-node-locale.lua | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/biblio/citation-style-language/citeproc-node-locale.lua b/biblio/citation-style-language/citeproc-node-locale.lua new file mode 100644 index 0000000000..e324c3502e --- /dev/null +++ b/biblio/citation-style-language/citeproc-node-locale.lua @@ -0,0 +1,130 @@ +local locale = {} + +local element = require("citeproc-element") + + +local Locale = element.Element:new() + +function Locale:get_option (key) + local query = string.format("style-options[%s]", key) + local option = self:query_selector(query)[1] + if option then + local value = option:get_attribute(key) + if self.option_type[key] == "integer" then + value = tonumber(value) + elseif self.option_type[key] == "boolean" then + value = (value == "true") + end + return value + else + return nil + end +end + +function Locale:get_term (name, form, number, gender) + + if form == "long" then + form = nil + end + + local match_last + local match_last_two + local match_whole + if number then + assert(type(number) == "number") + match_last = string.format("%s-%02d", name, number % 10) + match_last_two = string.format("%s-%02d", name, number % 100) + match_whole = string.format("%s-%02s", name, number) + end + + local res = nil + for _, term in ipairs(self:query_selector("term")) do + -- Use get_path? + local match_name = name + + if number then + local term_match = term:get_attribute("last-two-digits") + if term_match == "whole-number" then + match_name = match_whole + elseif term_match == "last-two-digits" then + match_name = match_last_two + elseif number < 10 then + -- "13" can match only "ordinal-13" not "ordinal-03" + -- It is sliced to "3" in a later checking pass. + match_name = match_last_two + else + match_name = match_last + end + end + + local term_name = term:get_attribute("name") + local term_form = term:get_attribute("form") + if term_form == "long" then + term_form = nil + end + local term_gender = term:get_attribute("gender-form") + + if term_name == match_name and term_form == form and term_gender == gender then + return term + end + + end + + -- Fallback + if form == "verb-sort" then + return self:get_term(name, "verb") + elseif form == "symbol" then + return self:get_term(name, "short") + elseif form == "verb" then + return self:get_term(name, "long") + elseif form == "short" then + return self:get_term(name, "long") + end + + if number and number > 10 then + return self:get_term(name, nil, number % 10, gender) + end + + if gender then + return self:get_term(name, nil, number, nil) + end + + if number then + return self:get_term(name, nil, nil, nil) + end + + return nil +end + + +local Term = element.Element:new() + +function Term:render (context, is_plural) + self:debug_info(context) + context = self:process_context(context) + + local output = { + single = self:get_text(), + } + for _, child in ipairs(self:get_children()) do + if child:is_element() then + output[child:get_element_name()] = self:escape(child:get_text()) + end + end + local res = output.single + if is_plural then + if output.multiple then + res = output.multiple + end + end + if res == "" then + return nil + end + return res +end + + +locale.Locale = Locale +locale.Term = Term + +return locale |