diff options
Diffstat (limited to 'tex/context/base/publ-ini.lua')
-rw-r--r-- | tex/context/base/publ-ini.lua | 814 |
1 files changed, 429 insertions, 385 deletions
diff --git a/tex/context/base/publ-ini.lua b/tex/context/base/publ-ini.lua index dae93b000..f415faf4a 100644 --- a/tex/context/base/publ-ini.lua +++ b/tex/context/base/publ-ini.lua @@ -34,6 +34,7 @@ local trace_cite = false trackers.register("publications.cite", local trace_missing = false trackers.register("publications.cite.missing", function(v) trace_missing = v end) local trace_references = false trackers.register("publications.cite.references", function(v) trace_references = v end) +publications = publications or { } local datasets = publications.datasets local writers = publications.writers @@ -186,87 +187,91 @@ local tobesaved = allocate() -- we use a a dedicated (and efficient as it know what it deals with) serializer, -- also because we need to ignore the 'details' field -local function serialize(t) - local f_key_table = formatters[" [%q] = {"] - local f_key_string = formatters[" %s = %q,"] - local r = { "return {" } - local m = 1 - for tag, entry in sortedhash(t) do - m = m + 1 - r[m] = f_key_table(tag) - local s = sortedkeys(entry) - for i=1,#s do - local k = s[i] +do + + local function serialize(t) + local f_key_table = formatters[" [%q] = {"] + local f_key_string = formatters[" %s = %q,"] + local r = { "return {" } + local m = 1 + for tag, entry in sortedhash(t) do m = m + 1 - r[m] = f_key_string(k,entry[k]) - end - m = m + 1 - r[m] = " }," - end - r[m] = "}" - return concat(r,"\n") -end - -local function finalizer() - local prefix = tex.jobname -- or environment.jobname - local setnames = sortedkeys(datasets) - for i=1,#setnames do - local name = setnames[i] - local dataset = datasets[name] - local userdata = dataset.userdata - local checksum = nil - local username = file.addsuffix(file.robustname(formatters["%s-btx-%s"](prefix,name)),"lua") - if userdata and next(userdata) then - if job.passes.first then - local newdata = serialize(userdata) - checksum = md5.HEX(newdata) - io.savedata(username,newdata) + r[m] = f_key_table(tag) + local s = sortedkeys(entry) + for i=1,#s do + local k = s[i] + m = m + 1 + r[m] = f_key_string(k,entry[k]) end - else - os.remove(username) - username = nil + m = m + 1 + r[m] = " }," end - local loaded = dataset.loaded - local sources = dataset.sources - local used = { } - for i=1,#sources do - local source = sources[i] - -- if loaded[source.filename] ~= "previous" then -- needs checking - if loaded[source.filename] ~= "previous" or loaded[source.filename] == "current" then - used[#used+1] = source + r[m] = "}" + return concat(r,"\n") + end + + local function finalizer() + local prefix = tex.jobname -- or environment.jobname + local setnames = sortedkeys(datasets) + for i=1,#setnames do + local name = setnames[i] + local dataset = datasets[name] + local userdata = dataset.userdata + local checksum = nil + local username = file.addsuffix(file.robustname(formatters["%s-btx-%s"](prefix,name)),"lua") + if userdata and next(userdata) then + if job.passes.first then + local newdata = serialize(userdata) + checksum = md5.HEX(newdata) + io.savedata(username,newdata) + end + else + os.remove(username) + username = nil + end + local loaded = dataset.loaded + local sources = dataset.sources + local used = { } + for i=1,#sources do + local source = sources[i] + -- if loaded[source.filename] ~= "previous" then -- needs checking + if loaded[source.filename] ~= "previous" or loaded[source.filename] == "current" then + used[#used+1] = source + end end + tobesaved[name] = { + usersource = { + filename = username, + checksum = checksum, + }, + datasources = used, + } end - tobesaved[name] = { - usersource = { - filename = username, - checksum = checksum, - }, - datasources = used, - } end -end -local function initializer() - statistics.starttiming(publications) - for name, state in next, collected do - local dataset = datasets[name] - local datasources = state.datasources - local usersource = state.usersource - if datasources then - for i=1,#datasources do - local filename = datasources[i].filename - publications.load(dataset,filename,"previous") + local function initializer() + statistics.starttiming(publications) + for name, state in next, collected do + local dataset = datasets[name] + local datasources = state.datasources + local usersource = state.usersource + if datasources then + for i=1,#datasources do + local filename = datasources[i].filename + publications.load(dataset,filename,"previous") + end + end + if usersource then + dataset.userdata = table.load(usersource.filename) or { } end end - if usersource then - dataset.userdata = table.load(usersource.filename) or { } - end + statistics.stoptiming(publications) + function initializer() end -- will go, for now, runtime loaded end - statistics.stoptiming(publications) - function initializer() end -- will go, for now, runtime loaded -end -job.register('publications.collected',tobesaved,initializer,finalizer) + job.register('publications.collected',tobesaved,initializer,finalizer) + +end if not publications.authors then initializer() -- for now, runtime loaded @@ -283,9 +288,10 @@ local nofcitations = 0 setmetatableindex(usedentries,function(t,k) if not initialized then - usedentries = { } - citetolist = { } - listtocite = { } + usedentries = allocate { } + citetolist = allocate { } + listtocite = allocate { } +local names = { } local internals = structures.references.internals local p_collect = (C(R("09")^1) * Carg(1) / function(s,entry) listtocite[tonumber(s)] = entry end + P(1))^0 for i=1,#internals do @@ -322,6 +328,26 @@ setmetatableindex(usedentries,function(t,k) listtocite[int] = entry end end +local detail = datasets[set].details[tag] +if detail then + local author = detail.author + if author then + for i=1,#author do + local a = author[i] + local s = a.surnames + if s then + local c = concat(s,"+") + local n = names[c] + if n then + n[#n+1] = a + break + else + names[c] = { a } + end + end + end + end +end end end elseif kind == "userdata" then @@ -331,7 +357,6 @@ setmetatableindex(usedentries,function(t,k) local int = tonumber(userdata.btxint) if int then citetolist[int] = entry --- xx[dataset][tag] = { entry, ... } end end end @@ -345,6 +370,13 @@ setmetatableindex(usedentries,function(t,k) -- setmetatableindex(citetolist,"table") -- setmetatableindex(listtocite,"table") -- +for k, v in next, names do + if #v > 1 then + for i=1,#v do + v[i].state = 1 + end + end +end return usedentries[k] end end) @@ -870,13 +902,6 @@ function commands.btxfield(name,tag,field) local manipulator, field = splitmanipulation(field) local value = fields[field] if type(value) == "string" then --- local suffixes = dataset.suffixes[tag] --- if suffixes then --- local suffix = suffixes[field] --- if suffix then --- value = value .. converters.characters(suffix) --- end --- end context(manipulator and applymanipulation(manipulator,value) or value) else report("unknown field %a of tag %a in dataset %a",field,tag,name) @@ -1800,172 +1825,200 @@ end -- short -local function setter(dataset,tag,entry,internal) - return { - tag = tag, - internal = internal, - short = getdetail(dataset,tag,"short"), - suffix = getdetail(dataset,tag,"suffix"), - } -end +do -local function getter(first,last) -- last not used - local short = first.short - if short then - local suffix = first.suffix - if suffix then - ctx_btxsetfirst(short .. suffix) - else - ctx_btxsetfirst(short) + local function setter(dataset,tag,entry,internal) + return { + tag = tag, + internal = internal, + short = getdetail(dataset,tag,"short"), + suffix = getdetail(dataset,tag,"suffix"), + } + end + + local function getter(first,last) -- last not used + local short = first.short + if short then + local suffix = first.suffix + if suffix then + ctx_btxsetfirst(short .. suffix) + else + ctx_btxsetfirst(short) + end + return true end - return true end -end -function citevariants.short(dataset,reference,mark,compress,variant,internal) - processcite(dataset,reference,mark,false,"short",internal,setter,getter) + function citevariants.short(dataset,reference,mark,compress,variant,internal) + processcite(dataset,reference,mark,false,"short",internal,setter,getter) + end + end -- pages (no compress) -local function setter(dataset,tag,entry,internal) - return { - dataset = dataset, - tag = tag, - internal = internal, - pages = getdetail(dataset,tag,"pages"), - } -end +do -local function getter(first,last) - local pages = first.pages - if pages then - if type(pages) == "table" then - ctx_btxsetfirst(pages[1]) - ctx_btxsetsecond(pages[2]) - else - ctx_btxsetfirst(pages) + local function setter(dataset,tag,entry,internal) + return { + dataset = dataset, + tag = tag, + internal = internal, + pages = getdetail(dataset,tag,"pages"), + } + end + + local function getter(first,last) + local pages = first.pages + if pages then + if type(pages) == "table" then + ctx_btxsetfirst(pages[1]) + ctx_btxsetsecond(pages[2]) + else + ctx_btxsetfirst(pages) + end + return true end - return true end -end -function citevariants.page(dataset,reference,mark,compress,variant,internal) - processcite(dataset,reference,mark,compress,"page",internal,setter,getter) + function citevariants.page(dataset,reference,mark,compress,variant,internal) + processcite(dataset,reference,mark,compress,"page",internal,setter,getter) + end + end -- num -local function setter(dataset,tag,entry,internal) - local entries = entry.entries - local text = entries and entries.text or "?" - return { - tag = tag, - internal = internal, - num = text, - sortkey = text, - } -end +do -local function getter(first,last) - return simplegetter(first,last,"num") -end + local function setter(dataset,tag,entry,internal) + local entries = entry.entries + local text = entries and entries.text or "?" + return { + tag = tag, + internal = internal, + num = text, + sortkey = text, + } + end + + local function getter(first,last) + return simplegetter(first,last,"num") + end + + function citevariants.num(dataset,reference,mark,compress,variant,internal) + processcite(dataset,reference,mark,compress,"num",internal,setter,getter) + -- processcite(dataset,reference,mark,false,"num",internal,setter,getter) + end -function citevariants.num(dataset,reference,mark,compress,variant,internal) - processcite(dataset,reference,mark,compress,"num",internal,setter,getter) --- processcite(dataset,reference,mark,false,"num",internal,setter,getter) end -- year -local function setter(dataset,tag,entry,internal) - return { - dataset = dataset, - tag = tag, - internal = internal, - year = getfield(dataset,tag,"year"), - suffix = getdetail(dataset,tag,"suffix"), - sortkey = getdetail(dataset,tag,"suffixedyear"), - } -end +do -local function getter(first,last) - return simplegetter(first,last,"year") -end + local function setter(dataset,tag,entry,internal) + return { + dataset = dataset, + tag = tag, + internal = internal, + year = getfield(dataset,tag,"year"), + suffix = getdetail(dataset,tag,"suffix"), + sortkey = getdetail(dataset,tag,"suffixedyear"), + } + end + + local function getter(first,last) + return simplegetter(first,last,"year") + end + + function citevariants.year(dataset,reference,mark,compress,variant,internal) + processcite(dataset,reference,mark,compress,"year",internal,setter,getter) + end -function citevariants.year(dataset,reference,mark,compress,variant,internal) - processcite(dataset,reference,mark,compress,"year",internal,setter,getter) end -- index | serial -local function setter(dataset,tag,entry,internal) - local index = getfield(dataset,tag,"index") - return { - dataset = dataset, - tag = tag, - internal = internal, - index = index, - sortkey = index, - } -end +do -local function getter(first,last) - return simplegetter(first,last,"index") -end + local function setter(dataset,tag,entry,internal) + local index = getfield(dataset,tag,"index") + return { + dataset = dataset, + tag = tag, + internal = internal, + index = index, + sortkey = index, + } + end -function citevariants.index(dataset,reference,mark,compress,variant,internal) - processcite(dataset,reference,mark,compress,"index",internal,setter,getter) -end + local function getter(first,last) + return simplegetter(first,last,"index") + end + + function citevariants.index(dataset,reference,mark,compress,variant,internal) + processcite(dataset,reference,mark,compress,"index",internal,setter,getter) + end + + function citevariants.serial(dataset,reference,mark,compress,variant,internal) + processcite(dataset,reference,mark,compress,"serial",internal,setter,getter) + end -function citevariants.serial(dataset,reference,mark,compress,variant,internal) - processcite(dataset,reference,mark,compress,"serial",internal,setter,getter) end -- category | type -local function setter(dataset,tag,entry,internal) - return { - dataset = dataset, - tag = tag, - internal = internal, - category = getfield(dataset,tag,"category"), - } -end +do -local function getter(first,last) - return simplegetter(first,last,"category") -end + local function setter(dataset,tag,entry,internal) + return { + dataset = dataset, + tag = tag, + internal = internal, + category = getfield(dataset,tag,"category"), + } + end -function citevariants.category(dataset,reference,mark,compress,variant,internal) - processcite(dataset,reference,mark,compress,"category",internal,setter,getter) -end + local function getter(first,last) + return simplegetter(first,last,"category") + end + + function citevariants.category(dataset,reference,mark,compress,variant,internal) + processcite(dataset,reference,mark,compress,"category",internal,setter,getter) + end + + function citevariants.type(dataset,reference,mark,compress,variant,internal) + processcite(dataset,reference,mark,compress,"type",internal,setter,getter) + end -function citevariants.type(dataset,reference,mark,compress,variant,internal) - processcite(dataset,reference,mark,compress,"type",internal,setter,getter) end -- key | tag -local function setter(dataset,tag,entry,internal) - return { - dataset = dataset, - tag = tag, - internal = internal, - } -end +do -local function getter(first,last) - ctx_btxsetfirst(first.tag) - return true -end + local function setter(dataset,tag,entry,internal) + return { + dataset = dataset, + tag = tag, + internal = internal, + } + end -function citevariants.key(dataset,reference,mark,compress,variant,internal) - return processcite(dataset,reference,mark,compress,"key",internal,setter,getter) -end + local function getter(first,last) + ctx_btxsetfirst(first.tag) + return true + end + + function citevariants.key(dataset,reference,mark,compress,variant,internal) + return processcite(dataset,reference,mark,compress,"key",internal,setter,getter) + end + + function citevariants.tag(dataset,reference,mark,compress,variant,internal) + return processcite(dataset,reference,mark,compress,"tag",internal,setter,getter) + end -function citevariants.tag(dataset,reference,mark,compress,variant,internal) - return processcite(dataset,reference,mark,compress,"tag",internal,setter,getter) end -- todo : sort @@ -1978,217 +2031,208 @@ end -- common -local currentbtxciteauthor = function() - context.currentbtxciteauthor() - return true -- needed? -end +do -local function authorcompressor(found) - local result = { } - local entries = { } - for i=1,#found do - local entry = found[i] - local author = entry.author - local aentries = entries[author] - if aentries then - aentries[#aentries+1] = entry - else - entries[author] = { entry } - end + local currentbtxciteauthor = function() + context.currentbtxciteauthor() + return true -- needed? end - for i=1,#found do - local entry = found[i] - local author = entry.author - local aentries = entries[author] - if not aentries then - result[#result+1] = entry - elseif aentries == true then - -- already done - else - result[#result+1] = entry - entry.entries = aentries - entries[author] = true + + local function authorcompressor(found) + local result = { } + local entries = { } + for i=1,#found do + local entry = found[i] + local author = entry.author + local aentries = entries[author] + if aentries then + aentries[#aentries+1] = entry + else + entries[author] = { entry } + end end + for i=1,#found do + local entry = found[i] + local author = entry.author + local aentries = entries[author] + if not aentries then + result[#result+1] = entry + elseif aentries == true then + -- already done + else + result[#result+1] = entry + entry.entries = aentries + entries[author] = true + end + end + -- todo: add letters (should we then tag all?) + return result end - -- todo: add letters (should we then tag all?) - return result -end -local function authorconcat(target,key,setup) - ctx_btxstartsubcite(setup) - local nofcollected = #target - if nofcollected == 0 then - unknowncite(tag) - else - for i=1,nofcollected do - local entry = target[i] - local first = entry.first - local tag = entry.tag - local currentcitation = markcite(entry.dataset,tag) - ctx_btxstartciteauthor() - ctx_btxsettag(tag) - ctx_btxsetbacklink(currentcitation) - local bl = listtocite[currentcitation] - ctx_btxsetinternal(bl and bl.references.internal or "") - if first then - ctx_btxsetfirst(first[key] or f_missing(first.tag)) - local suffix = entry.suffix - local value = entry.last[key] - ctx_btxsetsecond(value) - if suffix then - ctx_btxsetthird(suffix) - end - else - local suffix = entry.suffix - local value = entry[key] or f_missing(tag) - ctx_btxsetfirst(value) - if suffix then - ctx_btxsetthird(suffix) + local function authorconcat(target,key,setup) + ctx_btxstartsubcite(setup) + local nofcollected = #target + if nofcollected == 0 then + unknowncite(tag) + else + for i=1,nofcollected do + local entry = target[i] + local first = entry.first + local tag = entry.tag + local currentcitation = markcite(entry.dataset,tag) + ctx_btxstartciteauthor() + ctx_btxsettag(tag) + ctx_btxsetbacklink(currentcitation) + local bl = listtocite[currentcitation] + ctx_btxsetinternal(bl and bl.references.internal or "") + if first then + ctx_btxsetfirst(first[key] or f_missing(first.tag)) + local suffix = entry.suffix + local value = entry.last[key] + ctx_btxsetsecond(value) + if suffix then + ctx_btxsetthird(suffix) + end + else + local suffix = entry.suffix + local value = entry[key] or f_missing(tag) + ctx_btxsetfirst(value) + if suffix then + ctx_btxsetthird(suffix) + end end + ctx_btxsetconcat(concatstate(i,nofcollected)) + ctx_btxcitesetup(setup) + ctx_btxstopciteauthor() end - ctx_btxsetconcat(concatstate(i,nofcollected)) - ctx_btxcitesetup(setup) - ctx_btxstopciteauthor() end + ctx_btxstopsubcite() end - ctx_btxstopsubcite() -end -local function authorsingle(entry,key,setup) - ctx_btxstartsubcite(setup) - ctx_btxstartciteauthor() - local tag = entry.tag - ctx_btxsettag(tag) - -- local currentcitation = markcite(entry.dataset,tag) - -- ctx_btxsetbacklink(currentcitation) - -- local bl = listtocite[currentcitation] - -- ctx_btxsetinternal(bl and bl.references.internal or "") - ctx_btxsetfirst(entry[key] or f_missing(tag)) - ctx_btxsetthird(entry.suffix) - ctx_btxcitesetup(setup) - ctx_btxstopciteauthor() - ctx_btxstopsubcite() -end - -local partialinteractive = false - -local function authorgetter(first,last,key,setup) -- only first - -- ctx_btxsetfirst(first.author) -- unformatted - ctx_btxsetfirst(currentbtxciteauthor) -- formatter (much slower) - local entries = first.entries - -- alternatively we can use a concat with one ... so that we can only make the - -- year interactive, as with the concat - if partialinteractive and not entries then - entries = { first } - end - if entries then - local c = compresslist(entries) - local f = function() authorconcat(c,key,setup) return true end -- indeed return true? - ctx_btxsetcount(#c) - ctx_btxsetsecond(f) - else - local f = function() authorsingle(first,key,setup) return true end -- indeed return true? - ctx_btxsetcount(0) - ctx_btxsetsecond(f) + local function authorsingle(entry,key,setup) + ctx_btxstartsubcite(setup) + ctx_btxstartciteauthor() + local tag = entry.tag + ctx_btxsettag(tag) + -- local currentcitation = markcite(entry.dataset,tag) + -- ctx_btxsetbacklink(currentcitation) + -- local bl = listtocite[currentcitation] + -- ctx_btxsetinternal(bl and bl.references.internal or "") + ctx_btxsetfirst(entry[key] or f_missing(tag)) + ctx_btxsetthird(entry.suffix) + ctx_btxcitesetup(setup) + ctx_btxstopciteauthor() + ctx_btxstopsubcite() + end + + local partialinteractive = false + + local function authorgetter(first,last,key,setup) -- only first + -- ctx_btxsetfirst(first.author) -- unformatted + ctx_btxsetfirst(currentbtxciteauthor) -- formatter (much slower) + local entries = first.entries + -- alternatively we can use a concat with one ... so that we can only make the + -- year interactive, as with the concat + if partialinteractive and not entries then + entries = { first } + end + if entries then + local c = compresslist(entries) + local f = function() authorconcat(c,key,setup) return true end -- indeed return true? + ctx_btxsetcount(#c) + ctx_btxsetsecond(f) + else + local f = function() authorsingle(first,key,setup) return true end -- indeed return true? + ctx_btxsetcount(0) + ctx_btxsetsecond(f) + end + return true end - return true -end --- author + -- author -local function setter(dataset,tag,entry,internal) - return { - dataset = dataset, - tag = tag, - internal = internal, - author = getfield(dataset,tag,"author"), - } -end + local function setter(dataset,tag,entry,internal) + return { + dataset = dataset, + tag = tag, + internal = internal, + author = getfield(dataset,tag,"author"), + } + end -local function getter(first,last,_,setup) - -- ctx_btxsetfirst(first.author) -- unformatted - ctx_btxsetfirst(currentbtxciteauthor) -- formatter (much slower) - return true -end + local function getter(first,last,_,setup) + -- ctx_btxsetfirst(first.author) -- unformatted + ctx_btxsetfirst(currentbtxciteauthor) -- formatter (much slower) + return true + end -function citevariants.author(dataset,reference,mark,compress,variant,internal) - processcite(dataset,reference,mark,false,"author",internal,setter,getter) -end + function citevariants.author(dataset,reference,mark,compress,variant,internal) + processcite(dataset,reference,mark,false,"author",internal,setter,getter) + end --- authornum + -- authornum -local function setter(dataset,tag,entry,internal) - local text = entry.entries.text - return { - dataset = dataset, - tag = tag, - internal = internal, - author = getfield(dataset,tag,"author"), - num = text, - sortkey = text and lpegmatch(numberonly,text), - } -end + local function setter(dataset,tag,entry,internal) + local text = entry.entries.text + return { + dataset = dataset, + tag = tag, + internal = internal, + author = getfield(dataset,tag,"author"), + num = text, + sortkey = text and lpegmatch(numberonly,text), + } + end -local function getter(first,last) - authorgetter(first,last,"num","author:num") - return true -end + local function getter(first,last) + authorgetter(first,last,"num","author:num") + return true + end -local function compressor(found) - return authorcompressor(found) -- can be just an alias -end + local function compressor(found) + return authorcompressor(found) -- can be just an alias + end -function citevariants.authornum(dataset,reference,mark,compress,variant,internal) - processcite(dataset,reference,mark,compress,"authornum",internal,setter,getter,compressor) -end + function citevariants.authornum(dataset,reference,mark,compress,variant,internal) + processcite(dataset,reference,mark,compress,"authornum",internal,setter,getter,compressor) + end --- authoryear | authoryears + -- authoryear | authoryears --- local function setter(dataset,tag,entry,internal) --- local year = getfield(dataset,tag,"year") --- return { --- dataset = dataset, --- tag = tag, --- internal = internal, --- author = getfield(dataset,tag,"author"), --- year = year, --- sortkey = year and lpegmatch(numberonly,year), --- sortfld = "year", --- } --- end + local function setter(dataset,tag,entry,internal) + return { + dataset = dataset, + tag = tag, + internal = internal, + author = getfield(dataset,tag,"author"), + year = getfield(dataset,tag,"year"), + suffix = getdetail(dataset,tag,"suffix"), + sortkey = getdetail(dataset,tag,"suffixedyear"), + } + end -local function setter(dataset,tag,entry,internal) - return { - dataset = dataset, - tag = tag, - internal = internal, - author = getfield(dataset,tag,"author"), - year = getfield(dataset,tag,"year"), - suffix = getdetail(dataset,tag,"suffix"), - sortkey = getdetail(dataset,tag,"suffixedyear"), - } -end + local function getter(first,last) + authorgetter(first,last,"year","author:year") + return true + end -local function getter(first,last) - authorgetter(first,last,"year","author:year") - return true -end + local function compressor(found) + return authorcompressor(found) + end -local function compressor(found) - return authorcompressor(found) -end + function citevariants.authoryear(dataset,reference,mark,compress,variant,internal) + processcite(dataset,reference,mark,compress,"authoryear",internal,setter,getter,compressor) + end -function citevariants.authoryear(dataset,reference,mark,compress,variant,internal) - processcite(dataset,reference,mark,compress,"authoryear",internal,setter,getter,compressor) -end + local function getter(first,last) + authorgetter(first,last,"year","author:years") + return true + end -local function getter(first,last) - authorgetter(first,last,"year","author:years") - return true -end + function citevariants.authoryears(dataset,reference,mark,compress,variant,internal) + processcite(dataset,reference,mark,compress,"authoryears",internal,setter,getter,compressor) + end -function citevariants.authoryears(dataset,reference,mark,compress,variant,internal) - processcite(dataset,reference,mark,compress,"authoryears",internal,setter,getter,compressor) end -- List variants |