diff options
Diffstat (limited to 'tex/context/base/publ-aut.lua')
-rw-r--r-- | tex/context/base/publ-aut.lua | 200 |
1 files changed, 145 insertions, 55 deletions
diff --git a/tex/context/base/publ-aut.lua b/tex/context/base/publ-aut.lua index f30902ae6..9f100ec42 100644 --- a/tex/context/base/publ-aut.lua +++ b/tex/context/base/publ-aut.lua @@ -452,73 +452,163 @@ local compare = sorters.comparers.basic -- (a,b) local strip = sorters.strip local splitter = sorters.splitters.utf -function authors.preparedsort(dataset,list,sorttype_a,sorttype_b,sorttype_c) - local luadata = datasets[dataset].luadata - local details = datasets[dataset].details - local valid = { } - local splitted = { } - table.setmetatableindex(splitted,function(t,k) -- could be done in the sorter but seldom that many shared - local v = splitter(k,true) -- in other cases +-- authors(s) | year | journal | title | pages + +local pubsorters = { } +authors.sorters = pubsorters + +-- local function assemble(snippets,key) +-- -- maybe an option is to also sort the authors first +-- if not key then +-- return "" +-- end +-- local n = #key +-- if n == 0 then +-- return "" +-- end +-- local s = 0 +-- for i=1,n do +-- local k = key[i] +-- local vons = k.vons +-- local surnames = k.surnames +-- local initials = k.initials +-- if vons and #vons > 0 then +-- s = s + 1 ; snippets[s] = concat(vons," ") +-- end +-- if surnames and #surnames > 0 then +-- s = s + 1 ; snippets[s] = concat(surnames," ") +-- end +-- if initials and #initials > 0 then +-- s = s + 1 ; snippets[s] = concat(initials," ") +-- end +-- end +-- local result = concat(snippets," ",1,s) +-- return strip(result) +-- end + +-- local function byauthor(dataset,list,sorttype_a,sorttype_b,sorttype_c) +-- local luadata = datasets[dataset].luadata +-- local details = datasets[dataset].details +-- local valid = { } +-- local splitted = { } +-- table.setmetatableindex(splitted,function(t,k) -- could be done in the sorter but seldom that many shared +-- local v = splitter(k,true) -- in other cases +-- t[k] = v +-- return v +-- end) +-- local snippets = { } +-- for i=1,#list do +-- -- either { tag, tag, ... } or { { tag, index }, { tag, index } } +-- local li = list[i] +-- local tag = type(li) == "string" and li or li[1] +-- local entry = luadata[tag] +-- local detail = details[tag] +-- local suffix = tostring(i) +-- local year = nil +-- local assembled = nil +-- if entry and detail then +-- assembled = assemble(snippets,detail.author or detail.editor) +-- year = entry.year or "9998" +-- else +-- assembled = "" +-- year = "9999" +-- end +-- valid[i] = { +-- index = i, +-- split = { +-- splitted[strip(assembled)], +-- splitted[year], +-- splitted[suffix], +-- splitted[entry.journal or ""], +-- splitted[entry.title or ""], +-- splitted[entry.pages or ""], +-- }, +-- } +-- end +-- return valid +-- end + +local function writer(snippets,key) + if not key then + return "" + end + local n = #key + if n == 0 then + return "" + end + local s = 0 + for i=1,n do + local k = key[i] + local vons = k.vons + local surnames = k.surnames + local initials = k.initials + if vons and #vons > 0 then + s = s + 1 ; snippets[s] = concat(vons," ") + end + if surnames and #surnames > 0 then + s = s + 1 ; snippets[s] = concat(surnames," ") + end + if initials and #initials > 0 then + s = s + 1 ; snippets[s] = concat(initials," ") + end + end + local result = concat(snippets," ",1,s) + return strip(result) +end + +local function newsplitter(splitter) + return table.setmetatableindex({},function(t,k) -- could be done in the sorter but seldom that many shared + local v = splitter(k,true) -- in other cases t[k] = v return v end) - local snippets = { } +end + +local function byauthor(dataset,list,method) -- todo: yearsuffix + local luadata = datasets[dataset].luadata + local details = datasets[dataset].details + local result = { } + local splitted = newsplitter(splitter) -- saves mem + local snippets = { } -- saves mem for i=1,#list do -- either { tag, tag, ... } or { { tag, index }, { tag, index } } - local li = list[i] - local tag = type(li) == "string" and li or li[1] - local entry = luadata[tag] - local detail = details[tag] - local suffix = tostring(i) - local year = nil - local assembled = nil + local li = list[i] + local tag = type(li) == "string" and li or li[1] + local entry = luadata[tag] + local detail = details[tag] if entry and detail then - local key = detail[sorttype_a] or detail[sorttype_b] or detail[sorttype_c] - if key then - -- maybe an option is to also sort the authors first - local n = #key - local s = 0 - for i=1,n do - local k = key[i] - local vons = k.vons - local surnames = k.surnames - local initials = k.initials - if vons and #vons > 0 then - s = s + 1 ; snippets[s] = concat(vons," ") - end - if surnames and #surnames > 0 then - s = s + 1 ; snippets[s] = concat(surnames," ") - end - if initials and #initials > 0 then - s = s + 1 ; snippets[s] = concat(initials," ") - end - end - assembled = concat(snippets," ",1,s) - else - assembled = "" - end - year = entry.year or "9998" + result[i] = { + index = i, + split = { + splitted[writer(snippets,detail.author or detail.editor or "")], + splitted[entry.year or "9998"], + splitted[entry.journal or ""], + splitted[entry.title or ""], + splitted[entry.pages or ""], + splitted[tostring(i)], + }, + } else - assembled = "" - year = "9999" + result[i] = { + index = i, + split = { + splitted[""], + splitted["9999"], + splitted[""], + splitted[""], + splitted[""], + splitted[tostring(i)], + }, + } end - valid[i] = { - index = i, - split = { - splitted[strip(assembled)], - splitted[year], - splitted[suffix], - }, --- names = assembled, --- year = year, --- suffix = suffix, - } end - return valid + return result end +authors.sorters.author = byauthor + function authors.sorted(dataset,list,sorttype) -- experimental - local valid = authors.preparedsort(dataset,list,sorttype) + local valid = byauthor(dataset,list,sorttype) if #valid == 0 or #valid ~= #list then return list else |