summaryrefslogtreecommitdiff
path: root/paper/lua-filters/cito/cito.lua
diff options
context:
space:
mode:
Diffstat (limited to 'paper/lua-filters/cito/cito.lua')
-rw-r--r--paper/lua-filters/cito/cito.lua138
1 files changed, 138 insertions, 0 deletions
diff --git a/paper/lua-filters/cito/cito.lua b/paper/lua-filters/cito/cito.lua
new file mode 100644
index 0000000..a1a3421
--- /dev/null
+++ b/paper/lua-filters/cito/cito.lua
@@ -0,0 +1,138 @@
+-- Copyright © 2017–2019 Albert Krewinkel, Robert Winkler
+--
+-- This library is free software; you can redistribute it and/or modify it
+-- under the terms of the MIT license. See LICENSE for details.
+
+local _version = '1.0.0'
+local properties_and_aliases = {
+ agrees_with = {
+ 'agree_with'
+ },
+ citation = {
+ },
+ cites = {
+ },
+ cites_as_authority = {
+ 'as_authority',
+ 'authority'
+ },
+ cites_as_data_source = {
+ "as_data_source",
+ "data_source"
+ },
+ cites_as_evidence = {
+ 'as_evidence',
+ 'evidence'
+ },
+ cites_as_metadata_document = {
+ 'as_metadata_document',
+ 'metadata_document',
+ 'metadata'
+ },
+ cites_as_recommended_reading = {
+ 'as_recommended_reading',
+ 'recommended_reading'
+ },
+ disagrees_with = {
+ 'disagree',
+ 'disagrees'
+ },
+ disputes = {
+ },
+ documents = {
+ },
+ extends = {
+ },
+ includes_excerpt_from = {
+ 'excerpt',
+ 'excerpt_from'
+ },
+ includes_quotation_from = {
+ 'quotation',
+ 'quotation_from'
+ },
+ obtains_background_from = {
+ 'background',
+ 'background_from'
+ },
+ refutes = {
+ },
+ replies_to = {
+ },
+ updates = {
+ },
+ uses_data_from = {
+ 'data',
+ 'data_from'
+ },
+ uses_method_in = {
+ 'method',
+ 'method_in'
+ },
+}
+
+local default_cito_property = 'citation'
+
+--- Map from cito aliases to the actual cito property.
+local properties_by_alias = {}
+for property, aliases in pairs(properties_and_aliases) do
+ -- every property is an alias for itself
+ properties_by_alias[property] = property
+ for _, alias in pairs(aliases) do
+ properties_by_alias[alias] = property
+ end
+end
+
+--- Split citation ID into cito property and the actual citation ID. If
+--- the ID does not seem to contain a CiTO property, the
+--- `default_cito_property` will be returned, together with the
+--- unchanged input ID.
+local function split_cito_from_id (citation_id)
+ local pattern = '^(.+):(.+)$'
+ local prop_alias, split_citation_id = citation_id:match(pattern)
+
+ if properties_by_alias[prop_alias] then
+ return properties_by_alias[prop_alias], split_citation_id
+ end
+
+ return default_cito_property, citation_id
+end
+
+--- Citations by CiTO properties.
+local function store_cito (cito_cites, prop, cite_id)
+ if not prop then
+ return
+ end
+ if not cito_cites[prop] then
+ cito_cites[prop] = {}
+ end
+ table.insert(cito_cites[prop], cite_id)
+end
+
+--- Returns a Cite filter function which extracts CiTO information and
+--- add it to the given collection table.
+local function extract_cito (cito_cites)
+ return function (cite)
+ for k, citation in pairs(cite.citations) do
+ local cito_prop, cite_id = split_cito_from_id(citation.id)
+ store_cito(cito_cites, cito_prop, cite_id)
+ citation.id = cite_id
+ end
+ return cite
+ end
+end
+
+--- Lists of citation IDs, indexed by CiTO properties.
+local citations_by_property = {}
+
+return {
+ {
+ Cite = extract_cito(citations_by_property)
+ },
+ {
+ Meta = function (meta)
+ meta.cito_cites = citations_by_property
+ return meta
+ end
+ }
+}