diff options
Diffstat (limited to 'tex/context/base/publ-tra.lua')
-rw-r--r-- | tex/context/base/publ-tra.lua | 241 |
1 files changed, 203 insertions, 38 deletions
diff --git a/tex/context/base/publ-tra.lua b/tex/context/base/publ-tra.lua index 90bae67e9..98c81d800 100644 --- a/tex/context/base/publ-tra.lua +++ b/tex/context/base/publ-tra.lua @@ -10,11 +10,14 @@ local sortedhash = table.sortedhash local tracers = { } publications.tracers = tracers +local datasets = publications.datasets local context = context -local NC, NR, bold = context.NC, context.NR, context.bold +local NC, NR = context.NC, context.NR +local bold = context.bold +local darkgreen, darkred, darkblue = context.darkgreen, context.darkred, context.darkblue -publications.tracers.fields = table.sorted { +local fields = table.sorted { "abstract", "address", "annotate", @@ -63,7 +66,7 @@ publications.tracers.fields = table.sorted { "revision", } -publications.tracers.citevariants = table.sorted { +local citevariants = table.sorted { "author", "authoryear", "authoryears", @@ -80,52 +83,214 @@ publications.tracers.citevariants = table.sorted { "num", } -publications.tracers.listvariants = table.sorted { +local listvariants = table.sorted { "author", "editor", "artauthor", } -publications.tracers.categories = table.sorted { - "article", - "book", - "booklet", - "conference", - "inbook", - "incollection", - "inproceedings", - "manual", - "mastersthesis", - "misc", - "phdthesis", - "proceedings", - "techreport", - "unpublished", +-- local categories = table.sorted { +-- "article", +-- "book", +-- "booklet", +-- "conference", +-- "inbook", +-- "incollection", +-- "inproceedings", +-- "manual", +-- "mastersthesis", +-- "misc", +-- "phdthesis", +-- "proceedings", +-- "techreport", +-- "unpublished", +-- } + +local categories = { + article = { + required = { "author", "title", "journal", "year" }, + optional = { "volume", "number", "pages", "month", "note" }, + }, + book = { + required = { { "author", "editor" }, "title", "publisher", "year" }, + optional = { { "volume", "number" }, "series", "address", "edition", "month","note" }, + }, + booklet = { + required = { "title" }, + optional = { "author", "howpublished", "address", "month", "year", "note" }, + }, + inbook = { + required = { { "author", "editor" }, "title", { "chapter", "pages" }, "publisher","year" }, + optional = { { "volume", "number" }, "series", "type", "address", "edition", "month", "note" }, + }, + incollection = { + required = { "author", "title", "booktitle", "publisher", "year" }, + optional = { "editor", { "volume", "number" }, "series", "type", "chapter", "pages", "address", "edition", "month", "note" }, + }, + inproceedings = { + required = { "author", "title", "booktitle", "year" }, + optional = { "editor", { "volume", "number" }, "series", "pages", "address", "month","organization", "publisher", "note" }, + }, + manual = { + required = { "title" }, + optional = { "author", "organization", "address", "edition", "month", "year", "note" }, + }, + mastersthesis = { + required = { "author", "title", "school", "year" }, + optional = { "type", "address", "month", "note" }, + }, + misc = { + required = { "author", "title", "howpublished", "month", "year", "note" }, + optional = { "author", "title", "howpublished", "month", "year", "note" }, + }, + phdthesis = { + required = { "author", "title", "school", "year" }, + optional = { "type", "address", "month", "note" }, + }, + proceedings = { + required = { "title", "year" }, + optional = { "editor", { "volume", "number" }, "series", "address", "month", "organization", "publisher", "note" }, + }, + techreport = { + required = { "author", "title", "institution", "year" }, + optional = { "type", "number", "address", "month", "note" }, + }, + unpublished = { + required = { "author", "title", "note" }, + optional = { "month", "year" }, + }, } -function tracers.showdatasetfields(name) - if name and name ~= "" then - local luadata = publications.datasets[name].luadata - if next(luadata) then - context.starttabulate { "|lT|lT|pT|" } - NC() bold("tag") - NC() bold("category") - NC() bold("fields") - NC() NR() context.FL() -- HL() - for k, v in sortedhash(luadata) do - NC() context(k) - NC() context(v.category) - NC() - for k, v in sortedhash(v) do - if k ~= "details" and k ~= "tag" and k ~= "category" then - context("%s ",k) + +publications.tracers.fields = fields +publications.tracers.categories = categories +publications.tracers.citevariants = citevariants +publications.tracers.listvariants = listvariants +-- -- -- + +function tracers.showdatasetfields(dataset) + local luadata = datasets[dataset].luadata + if next(luadata) then + context.starttabulate { "|lT|lT|pT|" } + NC() bold("tag") + NC() bold("category") + NC() bold("fields") + NC() NR() context.FL() -- HL() + for k, v in sortedhash(luadata) do + NC() context(k) + NC() context(v.category) + NC() + for k, v in sortedhash(v) do + if k ~= "details" and k ~= "tag" and k ~= "category" then + context("%s ",k) + end + end + NC() NR() + end + context.stoptabulate() + end +end + +function tracers.showdatasetcompleteness(dataset) + + dataset = datasets[dataset] + + local preamble = { "|lBTw(10em)|p|" } + + local function required(key,value,indirect) + NC() darkgreen(key) + NC() if indirect then + darkblue(value) + elseif value then + context(value) + else + darkred("\\tttf [missing]") + end + NC() NR() + end + + local function optional(key,value,indirect) + NC() context(key) + NC() if indirect then + darkblue(value) + elseif value then + context(value) + end + NC() NR() + end + + local function identified(tag,crossref) + NC() context("tag") + NC() if crossref then + context("\\tttf %s\\hfill\\darkblue => %s",tag,crossref) + else + context("\\tttf %s",tag) + end + NC() NR() + end + + local luadata = datasets[dataset].luadata + + if next(luadata) then + for tag, entry in table.sortedhash(luadata) do + local category = entry.category + local fields = categories[category] + if fields then + context.starttabulate(preamble) + identified(tag,entry.crossref) + context.HL() + local requiredfields = fields.required + local optionalfields = fields.optional + for i=1,#requiredfields do + local r = requiredfields[i] + if type(r) == "table" then + local okay = true + for i=1,#r do + local ri = r[i] + if rawget(entry,ri) then + required(ri,entry[ri]) + okay = true + elseif entry[ri] then + required(ri,entry[ri],true) + okay = true + end end + if not okay then + required(table.concat(r,"\\letterbar ")) + end + elseif rawget(entry,r) then + required(r,entry[r]) + elseif entry[r] then + required(r,entry[r],true) + else + required(r) end - NC() NR() end - context.stoptabulate() + for i=1,#optionalfields do + local o = optionalfields[i] + if type(o) == "table" then + for i=1,#o do + local oi = o[i] + if rawget(entry,oi) then + optional(oi,entry[oi]) + elseif entry[oi] then + optional(oi,entry[oi],true) + end + end + elseif rawget(entry,o) then + optional(o,entry[o]) + elseif entry[o] then + optional(o,entry[o],true) + end + end + context.stoptabulate() + else + -- error + end end end + end -commands.showbtxdatasetfields = tracers.showdatasetfields +commands.showbtxdatasetfields = tracers.showdatasetfields +commands.showbtxdatasetcompleteness = tracers.showdatasetcompleteness |