diff options
author | Norbert Preining <norbert@preining.info> | 2022-01-22 03:01:16 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2022-01-22 03:01:16 +0000 |
commit | 26bfc07f2b7829213356de43cf5b81c3ba99e338 (patch) | |
tree | efb3037df2c42c45c904ad131334e8fc626cea19 /biblio/citation-style-language/csl.lua | |
parent | 5d5f239204f5c0d1f7573c9ebc64b5ad1ae75b49 (diff) |
CTAN sync 202201220301
Diffstat (limited to 'biblio/citation-style-language/csl.lua')
-rw-r--r-- | biblio/citation-style-language/csl.lua | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/biblio/citation-style-language/csl.lua b/biblio/citation-style-language/csl.lua new file mode 100644 index 0000000000..701102319b --- /dev/null +++ b/biblio/citation-style-language/csl.lua @@ -0,0 +1,141 @@ +--[[ + Copyright (C) 2021 Zeping Lee +--]] + +local csl = {} + +local citeproc = require("citeproc") +local util = citeproc.util +require("lualibs") +local core = require("csl-core") + + +csl.initialized = "false" +csl.citations = {} +csl.citations_pre = {} + + +function csl.error(str) + luatexbase.module_error("csl", str) +end +function csl.warning(str) + luatexbase.module_warning("csl", str) +end +function csl.info(str) + luatexbase.module_info("csl", str) +end + + +function csl.init(style_name, bib_files, lang) + bib_files = util.split(util.strip(bib_files), "%s*,%s*") + + csl.engine = core.init(style_name, bib_files, lang) + + if csl.engine then + csl.initialized = "true" + else + return + end + + -- csl.init is called via \AtBeginDocument and it's executed after + -- loading .aux file. The csl.ids are already registered. + csl.citation_strings = core.process_citations(csl.engine, csl.citations) + csl.style_class = csl.engine:get_style_class() + + for _, citation in ipairs(csl.citations) do + local citation_id = citation.citationID + local citation_str = csl.citation_strings[citation_id] + local bibcite_command = string.format("\\bibcite{%s}{{%s}{%s}}", citation.citationID, csl.style_class, citation_str) + tex.sprint(bibcite_command) + end + +end + + +function csl.register_citation_info(citation_info) + local citation = core.make_citation(citation_info) + table.insert(csl.citations, citation) +end + + +function csl.enable_linking() + csl.engine:enable_linking() +end + + +function csl.cite(citation_info) + if not csl.engine then + csl.error("CSL engine is not initialized.") + end + + local citation = core.make_citation(citation_info) + + local res = csl.engine:processCitationCluster(citation, csl.citations_pre, {}) + + local citation_str + for _, citation_res in ipairs(res[2]) do + local citation_id = citation_res[3] + -- csl.citation_strings[citation_id] = citation_res[2] + if citation_id == citation.citationID then + citation_str = citation_res[2] + end + end + tex.sprint(citation_str) + + table.insert(csl.citations_pre, {citation.citationID, citation.properties.noteIndex}) +end + + +function csl.nocite(ids_string) + local cite_ids = util.split(ids_string, "%s*,%s*") + if csl.engine then + local ids = {} + for _, cite_id in ipairs(cite_ids) do + if cite_id == "*" then + for item_id, _ in pairs(core.bib) do + table.insert(ids, item_id) + end + else + table.insert(ids, cite_id) + end + end + csl.engine:updateUncitedItems(ids) + else + -- `\nocite` in preamble, where csl.engine is not initialized yet + for _, cite_id in ipairs(cite_ids) do + if cite_id == "*" then + core.uncite_all_items = true + else + if not core.loaded_ids[cite_id] then + table.insert(core.ids, cite_id) + core.loaded_ids[cite_id] = true + end + end + end + end +end + + +function csl.bibliography() + if not csl.engine then + csl.error("CSL engine is not initialized.") + return + end + + -- if csl.include_all_items then + -- for id, _ in pairs(csl.bib) do + -- if not csl.loaded_ids[id] then + -- table.insert(csl.ids, id) + -- csl.loaded_ids[id] = true + -- end + -- end + -- end + -- csl.engine:updateItems(csl.ids) + + local result = core.make_bibliography(csl.engine) + + tex.print(util.split(result, "\n")) +end + + +return csl |