From e4d37ac8b9848292f1af2de118258a093b104cc8 Mon Sep 17 00:00:00 2001 From: Context Git Mirror Bot Date: Wed, 29 Oct 2014 01:15:04 +0100 Subject: 2014-10-29 00:20:00 --- tex/context/base/back-exp.lua | 42 ++++++----- tex/context/base/cont-new.mkiv | 2 +- tex/context/base/context-version.pdf | Bin 4405 -> 4383 bytes tex/context/base/context.mkiv | 2 +- tex/context/base/publ-dat.lua | 81 ++++++++++++++------- tex/context/base/publ-reg.lua | 31 ++++++-- tex/context/base/publ-tra.lua | 58 ++++++++++----- tex/context/base/status-files.pdf | Bin 24707 -> 24687 bytes tex/context/base/status-lua.pdf | Bin 333730 -> 333711 bytes tex/generic/context/luatex/luatex-fonts-merged.lua | 2 +- 10 files changed, 145 insertions(+), 73 deletions(-) diff --git a/tex/context/base/back-exp.lua b/tex/context/base/back-exp.lua index ca5cd5889..76b95e388 100644 --- a/tex/context/base/back-exp.lua +++ b/tex/context/base/back-exp.lua @@ -195,6 +195,8 @@ local p_attribute = lpeg.replacer(attribentities) local p_stripper = lpeg.patterns.stripper local p_escaped = lpeg.patterns.xml.escaped +local f_id = formatters["%s-%s"] + local alignmapping = { flushright = "right", middle = "center", @@ -418,9 +420,9 @@ local usedimages = { } do local imagetemplate = [[ -%element%[id="%detail%"], div.%element%[id="%detail%"] { +%element%[id="%id%"], div.%element%[id="%id%"] { display : block ; - background-image : url(%name%) ; + background-image : url(%url%) ; background-size : 100%% auto ; background-repeat : no-repeat ; width : %width% ; @@ -444,21 +446,18 @@ local imagetemplate = [[ for element, details in sortedhash(usedimages) do for detail, data in sortedhash(details) do local name = data.name - local full = url.addscheme(substitute(name)) - result[#result+1] = replacetemplate(imagetemplate,{ + local spec = { element = element, - detail = detail, - name = full, - width = data.width, - height = data.height, - }) - collected[detail] = { - name = full, + id = data.id, + name = name, + url = url.addscheme(substitute(name)), width = data.width, height = data.height, - page = data.page, used = data.used, + page = data.page, } + result[#result+1] = replacetemplate(imagetemplate,spec) + collected[detail] = spec end end return concat(result,"\n\n") @@ -718,10 +717,14 @@ do usedimages.image = image function structurestags.setfigure(name,used,page,width,height) - image[locatedtag("image")] = { + local fulltag = locatedtag("image") + local spec = specifications[fulltag] + local page = tonumber(page) + image[fulltag] = { + id = f_id(spec.tagname,spec.tagindex), name = name, used = used, - page = page, + page = page and page > 1 and page or nil, width = todimen(width, "cm","%0.3Fcm"), height = todimen(height,"cm","%0.3Fcm"), } @@ -731,11 +734,8 @@ do local data = image[fulltag] if data then setattribute(di,"name",data.name) - local page = tonumber(data.page) - if page and page > 1 then - setattribute(di,"page",page) - end - setattribute(di,"id",fulltag) + setattribute(di,"page",data.page) + setattribute(di,"id",data.id) setattribute(di,"width",data.width) setattribute(di,"height",data.height) end @@ -3058,7 +3058,9 @@ local htmltemplate = [[ result = { tg } end for k, v in next, at do - result[#result+1] = k .. "-" .. v + if not private[k] then + result[#result+1] = k .. "-" .. v + end end return concat(result, " ") end diff --git a/tex/context/base/cont-new.mkiv b/tex/context/base/cont-new.mkiv index 7c79c017b..4b417bda2 100644 --- a/tex/context/base/cont-new.mkiv +++ b/tex/context/base/cont-new.mkiv @@ -11,7 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\newcontextversion{2014.10.27 15:16} +\newcontextversion{2014.10.29 00:18} %D This file is loaded at runtime, thereby providing an excellent place for %D hacks, patches, extensions and new features. diff --git a/tex/context/base/context-version.pdf b/tex/context/base/context-version.pdf index 4abb589f6..dec3b2f57 100644 Binary files a/tex/context/base/context-version.pdf and b/tex/context/base/context-version.pdf differ diff --git a/tex/context/base/context.mkiv b/tex/context/base/context.mkiv index 22ce6c50e..26a00b8a5 100644 --- a/tex/context/base/context.mkiv +++ b/tex/context/base/context.mkiv @@ -28,7 +28,7 @@ %D up and the dependencies are more consistent. \edef\contextformat {\jobname} -\edef\contextversion{2014.10.27 15:16} +\edef\contextversion{2014.10.29 00:18} \edef\contextkind {beta} %D For those who want to use this: diff --git a/tex/context/base/publ-dat.lua b/tex/context/base/publ-dat.lua index a9007fa9c..67ab81e9f 100644 --- a/tex/context/base/publ-dat.lua +++ b/tex/context/base/publ-dat.lua @@ -42,8 +42,11 @@ local P, R, S, V, C, Cc, Cs, Ct, Carg, Cmt = lpeg.P, lpeg.R, lpeg.S, lpeg.V, lpe local p_whitespace = lpegpatterns.whitespace -local trace = false trackers.register("publications", function(v) trace = v end) +local trace = false trackers.register("publications", function(v) trace = v end) +local trace_duplicates = true trackers.register("publications.duplicates", function(v) trace = v end) + local report = logs.reporter("publications") +local report_duplicates = logs.reporter("publications","duplicates") publications = publications or { } local publications = publications @@ -96,6 +99,9 @@ local extrafields = { category = "implicit", tag = "implicit", key = "implicit", + keywords = "implicit", + language = "implicit", + crossref = "implicit", } local default = { @@ -318,40 +324,63 @@ publications.getindex = getindex -- todo: categories : metatable that lowers and also counts -- todo: fields : metatable that lowers +local tags = table.setmetatableindex("table") + local function do_definition(category,tag,tab,dataset) publicationsstats.nofdefinitions = publicationsstats.nofdefinitions + 1 local fields = dataset.fields local luadata = dataset.luadata - local found = luadata[tag] - local index = getindex(dataset,luadata,tag) - local entries = { - category = lower(category), - tag = tag, - index = index, - } - for i=1,#tab,2 do - local original = tab[i] - local normalized = fields[original] - if not normalized then - normalized = lower(original) -- we assume ascii fields - fields[original] = normalized - end - local value = tab[i+1] - value = textoutf(value) - if lpegmatch(filter_1,value) then - value = lpegmatch(filter_2,value,1,dataset.commands) -- we need to start at 1 for { } + if luadata[tag] then + local t = tags[tag] + local d = dataset.name + local n = (t[n] or 0) + 1 + t[d] = n + if trace_duplicates then + local p = { } + for k, v in sortedhash(t) do + p[#p+1] = formatters["%s:%s"](k,v) + end + report_duplicates("tag %a is present multiple times: % t",tag,p) end - if normalized == "crossref" then - local parent = luadata[value] - if parent then - setmetatableindex(entries,parent) + else + local found = luadata[tag] + local index = getindex(dataset,luadata,tag) + local entries = { + category = lower(category), + tag = tag, + index = index, + } + for i=1,#tab,2 do + local original = tab[i] + local normalized = fields[original] + if not normalized then + normalized = lower(original) -- we assume ascii fields + fields[original] = normalized + end + -- if entries[normalized] then + if rawget(entries,normalized) then + if trace_duplicates then + report_duplicates("redundant field %a is ignored for tag %a in dataset %a",normalized,tag,dataset.name) + end else - -- warning + local value = tab[i+1] + value = textoutf(value) + if lpegmatch(filter_1,value) then + value = lpegmatch(filter_2,value,1,dataset.commands) -- we need to start at 1 for { } + end + if normalized == "crossref" then + local parent = luadata[value] + if parent then + setmetatableindex(entries,parent) + else + -- warning + end + end + entries[normalized] = value end end - entries[normalized] = value + luadata[tag] = entries end - luadata[tag] = entries end local function resolve(s,dataset) diff --git a/tex/context/base/publ-reg.lua b/tex/context/base/publ-reg.lua index 6b9cc9234..ee2bd6f47 100644 --- a/tex/context/base/publ-reg.lua +++ b/tex/context/base/publ-reg.lua @@ -8,6 +8,7 @@ if not modules then modules = { } end modules ['publ-reg'] = { local formatters = string.formatters local sortedhash = table.sortedhash +local lpegmatch = lpeg.match local context = context local commands = commands @@ -103,16 +104,17 @@ end local ctx_dosetfastregisterentry = context.dosetfastregisterentry -- register entry key -local f_field = formatters[ [[\dobtxindexedfield{%s}{%s}{%s}{%s}{%s}]] ] -local f_author = formatters[ [[\dobtxindexedauthor{%s}{%s}{%s}{%s}{%s}]] ] +local f_field = formatters[ [[\dobtxindexedfield{%s}{%s}{%s}{%s}{%s}]] ] +local f_author = formatters[ [[\dobtxindexedauthor{%s}{%s}{%s}{%s}{%s}]] ] -local writer = publications.serializeauthor +local p_keywords = lpeg.tsplitat(lpeg.patterns.whitespace^0 * lpeg.P(";") * lpeg.patterns.whitespace^0) +local writer = publications.serializeauthor function flushers.default(register,dataset,tag,field,alternative,current,entry,detail) - local value = detail[field] or entry[field] - if value then - local e = f_field(dataset,tag,field,alternative,value) - ctx_dosetfastregisterentry(register,e,value) -- last value can be "" + local k = detail[field] or entry[field] + if k then + local e = f_field(dataset,tag,field,alternative,k) + ctx_dosetfastregisterentry(register,e,k) end end @@ -129,3 +131,18 @@ function flushers.author(register,dataset,tag,field,alternative,current,entry,de end end end + +function flushers.keywords(register,dataset,tag,field,alternative,current,entry,detail) + if entry then + -- we don't split keywords in details (yet) ... could be an alternative some day + local keywords = entry[field] + if keywords then + keywords = lpegmatch(p_keywords,keywords) + for i=1,#keywords do + local k = keywords[i] + local e = f_field(dataset,tag,field,alternative,k) + ctx_dosetfastregisterentry(register,e,k) + end + end + end +end diff --git a/tex/context/base/publ-tra.lua b/tex/context/base/publ-tra.lua index 7dc5d5703..cd4ebca1a 100644 --- a/tex/context/base/publ-tra.lua +++ b/tex/context/base/publ-tra.lua @@ -23,12 +23,20 @@ local ctx_bold, ctx_rotate, ctx_llap = context.bold, context.rotate, context.lla local ctx_darkgreen, ctx_darkred, ctx_darkblue = context.darkgreen, context.darkred, context.darkblue local ctx_starttabulate, ctx_stoptabulate = context.starttabulate, context.stoptabulate -local private = { +local privates = { category = true, tag = true, index = true, } +local specials = { + key = true, + crossref = true, + keywords = true, + language = true, + comment = true, +} + function tracers.showdatasetfields(settings) local dataset = settings.dataset local current = datasets[dataset] @@ -51,7 +59,11 @@ function tracers.showdatasetfields(settings) ctx_NC() context(category) ctx_NC() for k, v in sortedhash(v) do - if not private[k] then + if privates[k] then + -- skip + elseif specials[k] then + ctx_darkblue(k) + else local f = fields[k] if f == "required" then ctx_darkgreen(k) @@ -106,6 +118,17 @@ function tracers.showdatasetcompleteness(settings) foundfields[key] = nil end + local function optional(foundfields,key,value,indirect) + ctx_NC() context(key) + ctx_NC() if indirect then + ctx_darkblue(lpegmatch(texescape,value)) + elseif value then + context(lpegmatch(texescape,value)) + end + ctx_NC() ctx_NR() + foundfields[key] = nil + end + local function identified(tag,category,crossref) ctx_NC() context(category) ctx_NC() if crossref then @@ -116,6 +139,12 @@ function tracers.showdatasetcompleteness(settings) ctx_NC() ctx_NR() end + local function special(key,value) + ctx_NC() ctx_darkblue(key) + ctx_NC() context(lpegmatch(texescape,value)) + ctx_NC() ctx_NR() + end + local function extra(key,value) ctx_NC() ctx_llap("+") context(key) ctx_NC() context(lpegmatch(texescape,value)) @@ -186,7 +215,11 @@ function tracers.showdatasetcompleteness(settings) end end for k, v in sortedhash(foundfields) do - if not private[k] then + if privates[k] then + -- skip + elseif specials[k] then + special(k,entry[k]) + else extra(k,entry[k]) end end @@ -202,22 +235,11 @@ function tracers.showfields(settings) local fielddata = kind and specifications[kind] or specifications.apa local categories = fielddata.categories local fieldspecs = fielddata.fields - local swapped = { } local validfields = { } for category, fields in next, categories do - local categoryfields = { } for name, list in next, fields do for i=1,#list do - local field = list[i] - if type(field) == "table" then - field = table.concat(field," + ") - end - validfields[field] = true - if swapped[field] then - swapped[field][category] = true - else - swapped[field] = { [category] = true } - end + validfields[list[i]] = true end end end @@ -242,12 +264,14 @@ function tracers.showfields(settings) ctx_FL() for i=1,#s_fields do local field = s_fields[i] - local fields = swapped[field] ctx_NC() ctx_bold(field) for j=1,#s_categories do ctx_NC() - if fields[s_categories[j]] then + local kind = fieldspecs[s_categories[j]][field] + if kind == "required" then + ctx_darkgreen("*") + elseif kind == "optional" then context("*") end end diff --git a/tex/context/base/status-files.pdf b/tex/context/base/status-files.pdf index 21f151a50..634787db2 100644 Binary files a/tex/context/base/status-files.pdf and b/tex/context/base/status-files.pdf differ diff --git a/tex/context/base/status-lua.pdf b/tex/context/base/status-lua.pdf index 9298c71a6..3ad31abd0 100644 Binary files a/tex/context/base/status-lua.pdf and b/tex/context/base/status-lua.pdf differ diff --git a/tex/generic/context/luatex/luatex-fonts-merged.lua b/tex/generic/context/luatex/luatex-fonts-merged.lua index 43734d206..891650e5c 100644 --- a/tex/generic/context/luatex/luatex-fonts-merged.lua +++ b/tex/generic/context/luatex/luatex-fonts-merged.lua @@ -1,6 +1,6 @@ -- merged file : luatex-fonts-merged.lua -- parent file : luatex-fonts.lua --- merge date : 10/27/14 15:16:33 +-- merge date : 10/29/14 00:18:00 do -- begin closure to overcome local limits and interference -- cgit v1.2.3