summaryrefslogtreecommitdiff
path: root/biblio/citation-style-language/citeproc-ir-node.lua
diff options
context:
space:
mode:
Diffstat (limited to 'biblio/citation-style-language/citeproc-ir-node.lua')
-rw-r--r--biblio/citation-style-language/citeproc-ir-node.lua153
1 files changed, 153 insertions, 0 deletions
diff --git a/biblio/citation-style-language/citeproc-ir-node.lua b/biblio/citation-style-language/citeproc-ir-node.lua
new file mode 100644
index 0000000000..01cca4abf6
--- /dev/null
+++ b/biblio/citation-style-language/citeproc-ir-node.lua
@@ -0,0 +1,153 @@
+--
+-- Copyright (c) 2021-2022 Zeping Lee
+-- Released under the MIT license.
+-- Repository: https://github.com/zepinglee/citeproc-lua
+--
+
+local irnode = {}
+
+local util = require("citeproc-util")
+
+
+local IrNode = {
+ _element = nil,
+ _type = "IrNode",
+ _base_class = "IrNode",
+ text = nil,
+ formatting = nil,
+ affixes = nil,
+ children = nil,
+ delimiter = nil,
+}
+
+function IrNode:new(children, element)
+ local o = {
+ _element = element.element_name,
+ _type = self._type,
+ children = children,
+ group_var = "plain",
+ }
+
+ o.group_var = "missing"
+ for _, child_ir in ipairs(children) do
+ if child_ir.group_var == "important" then
+ o.group_var = "important"
+ break
+ elseif child_ir.group_var == "plain" then
+ o.group_var = "plain"
+ end
+ end
+
+ o.person_name_irs = {}
+ if children then
+ for _, child in ipairs(children) do
+ if child.person_name_irs then
+ util.extend(o.person_name_irs, child.person_name_irs)
+ end
+ end
+ end
+
+ setmetatable(o, self)
+ self.__index = self
+ return o
+end
+
+function IrNode:derive(type)
+ local o = {
+ _type = type,
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+end
+
+function IrNode:flatten(format)
+ return format:flatten_ir(self)
+end
+
+function IrNode:capitalize_first_term()
+ -- util.debug(self)
+ if self._type == "Rendered" and self.element and (self.element.term == "ibid" or self.element.term == "and") then
+ self.inlines[1]:capitalize_first_term()
+ elseif self._type == "SeqIr" and self.children[1] then
+ self.children[1]:capitalize_first_term()
+ end
+end
+
+
+
+local Rendered = IrNode:derive("Rendered")
+
+function Rendered:new(inlines, element)
+ local o = {
+ _element = element.element_name,
+ _type = self._type,
+ element = element, -- required for capitalizing first term
+ inlines = inlines,
+ group_var = "plain",
+ }
+
+ setmetatable(o, self)
+ self.__index = self
+ return o
+end
+
+
+local YearSuffix = IrNode:derive("YearSuffix")
+
+function YearSuffix:new(inlines, element)
+ local o = {
+ _element = element.element_name,
+ _type = self._type,
+ element = element,
+ inlines = inlines,
+ group_var = "plain",
+ }
+
+ setmetatable(o, self)
+ self.__index = self
+ return o
+end
+
+
+local NameIr = IrNode:derive("NameIr")
+
+
+local PersonNameIr = IrNode:derive("PersonNameIr")
+
+function PersonNameIr:new(inlines, element)
+ local o = {
+ _element = element.element_name,
+ _type = self._type,
+ inlines = inlines,
+ group_var = "plain",
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+end
+
+
+local SeqIr = IrNode:derive("SeqIr")
+
+-- function SeqIr:new(children)
+-- o = IrNode.new(self, children)
+-- local o = {
+-- children = children,
+-- group_var = "plain",
+-- }
+-- setmetatable(o, self)
+-- self.__index = self
+-- return o
+-- end
+
+
+
+irnode.IrNode = IrNode
+irnode.Rendered = Rendered
+irnode.YearSuffix = YearSuffix
+irnode.NameIr = NameIr
+irnode.PersonNameIr = PersonNameIr
+irnode.SeqIr = SeqIr
+
+return irnode