summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans Hagen <pragma@wxs.nl>2014-07-26 13:05:00 +0200
committerHans Hagen <pragma@wxs.nl>2014-07-26 13:05:00 +0200
commitb7fbedf4562261860ffdef92af2cf9cf576373b0 (patch)
treeb8908b45db8018bcf707609a93d6ffdc9aee5886
parent552aceb88e5e5e77a9263144180139a6ac95646c (diff)
downloadcontext-b7fbedf4562261860ffdef92af2cf9cf576373b0.tar.gz
beta 2014.07.26 13:05
-rw-r--r--scripts/context/lua/mtxrun.lua94
-rw-r--r--scripts/context/stubs/mswin/mtxrun.lua94
-rwxr-xr-xscripts/context/stubs/unix/mtxrun94
-rw-r--r--scripts/context/stubs/win64/mtxrun.lua94
-rw-r--r--tex/context/base/back-exp.lua72
-rw-r--r--tex/context/base/back-exp.mkiv20
-rw-r--r--tex/context/base/cldf-ini.lua4
-rw-r--r--tex/context/base/cont-new.mkiv2
-rw-r--r--tex/context/base/context-version.pdfbin4434 -> 4435 bytes
-rw-r--r--tex/context/base/context.mkiv2
-rw-r--r--tex/context/base/data-ini.lua41
-rw-r--r--tex/context/base/data-pre.lua11
-rw-r--r--tex/context/base/data-res.lua98
-rw-r--r--tex/context/base/file-job.lua38
-rw-r--r--tex/context/base/grph-inc.lua10
-rw-r--r--tex/context/base/lpdf-tag.lua35
-rw-r--r--tex/context/base/math-ini.mkiv2
-rw-r--r--tex/context/base/mult-def.mkiv1
-rw-r--r--tex/context/base/status-files.pdfbin24921 -> 24897 bytes
-rw-r--r--tex/context/base/status-lua.pdfbin326542 -> 326825 bytes
-rw-r--r--tex/context/base/strc-ref.mkvi82
-rw-r--r--tex/context/base/strc-tag.lua95
-rw-r--r--tex/context/base/strc-tag.mkiv34
-rw-r--r--tex/generic/context/luatex/luatex-fonts-merged.lua2
24 files changed, 644 insertions, 281 deletions
diff --git a/scripts/context/lua/mtxrun.lua b/scripts/context/lua/mtxrun.lua
index a9e563117..06db6c54e 100644
--- a/scripts/context/lua/mtxrun.lua
+++ b/scripts/context/lua/mtxrun.lua
@@ -12649,7 +12649,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-ini"] = package.loaded["data-ini"] or true
--- original size: 10598, stripped down to: 7341
+-- original size: 11085, stripped down to: 7662
if not modules then modules={} end modules ['data-ini']={
version=1.001,
@@ -12803,6 +12803,7 @@ local prefixes=utilities.storage.allocate()
resolvers.prefixes=prefixes
local resolved={}
local abstract={}
+local dynamic={}
function resolvers.resetresolve(str)
resolved,abstract={},{}
end
@@ -12826,11 +12827,15 @@ end
function resolvers.unresolve(str)
return abstract[str] or str
end
+function resolvers.setdynamic(str)
+ dynamic[str]=true
+end
local pattern=Cs((C(R("az")^2)*P(":")*C((1-S(" \"\';,"))^1)/_resolve_+P(1))^0)
local prefix=C(R("az")^2)*P(":")
local target=C((1-S(" \"\';,"))^1)
local notarget=(#S(";,")+P(-1))*Cc("")
-local pattern=Cs(((prefix*(target+notarget))/_resolve_+P(1))^0)
+local p_resolve=Cs(((prefix*(target+notarget))/_resolve_+P(1))^0)
+local p_simple=prefix*P(-1)
local function resolve(str)
if type(str)=="table" then
local res={}
@@ -12838,15 +12843,25 @@ local function resolve(str)
res[i]=resolve(str[i])
end
return res
- else
- local res=resolved[str]
- if not res then
- res=lpegmatch(pattern,str)
- resolved[str]=res
- abstract[res]=str
+ end
+ local res=resolved[str]
+ if res then
+ return res
+ end
+ local simple=lpegmatch(p_simple,str)
+ local action=prefixes[simple]
+ if action then
+ local res=action(res)
+ if not dynamic[simple] then
+ resolved[simple]=res
+ abstract[res]=simple
end
return res
end
+ res=lpegmatch(p_resolve,str)
+ resolved[str]=res
+ abstract[res]=str
+ return res
end
resolvers.resolve=resolve
if type(osuname)=="function" then
@@ -14048,7 +14063,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-res"] = package.loaded["data-res"] or true
--- original size: 63245, stripped down to: 43315
+-- original size: 64069, stripped down to: 44444
if not modules then modules={} end modules ['data-res']={
version=1.001,
@@ -14058,7 +14073,7 @@ if not modules then modules={} end modules ['data-res']={
license="see context related readme files",
}
local gsub,find,lower,upper,match,gmatch=string.gsub,string.find,string.lower,string.upper,string.match,string.gmatch
-local concat,insert,sortedkeys,sortedhash=table.concat,table.insert,table.sortedkeys,table.sortedhash
+local concat,insert,remove,sortedkeys,sortedhash=table.concat,table.insert,table.remove,table.sortedkeys,table.sortedhash
local next,type,rawget=next,type,rawget
local os=os
local P,S,R,C,Cc,Cs,Ct,Carg=lpeg.P,lpeg.S,lpeg.R,lpeg.C,lpeg.Cc,lpeg.Cs,lpeg.Ct,lpeg.Carg
@@ -14083,6 +14098,7 @@ local luasuffixes=utilities.lua.suffixes
local trace_locating=false trackers .register("resolvers.locating",function(v) trace_locating=v end)
local trace_detail=false trackers .register("resolvers.details",function(v) trace_detail=v end)
local trace_expansions=false trackers .register("resolvers.expansions",function(v) trace_expansions=v end)
+local trace_paths=false trackers .register("resolvers.paths",function(v) trace_paths=v end)
local resolve_otherwise=true directives.register("resolvers.otherwise",function(v) resolve_otherwise=v end)
local report_resolving=logs.reporter("resolvers","resolving")
local resolvers=resolvers
@@ -14185,6 +14201,7 @@ function resolvers.newinstance()
savelists=true,
pattern=nil,
force_suffixes=true,
+ pathstack={},
}
setmetatableindex(variables,function(t,k)
local v
@@ -14573,6 +14590,32 @@ end
function resolvers.unexpandedpath(str)
return joinpath(resolvers.unexpandedpathlist(str))
end
+function resolvers.pushpath(name)
+ local pathstack=instance.pathstack
+ local lastpath=pathstack[#pathstack]
+ local pluspath=filedirname(name)
+ if lastpath then
+ lastpath=collapsepath(filejoin(lastpath,pluspath))
+ else
+ lastpath=collapsepath(pluspath)
+ end
+ insert(pathstack,lastpath)
+ if trace_paths then
+ report_resolving("pushing path %a",lastpath)
+ end
+end
+function resolvers.poppath()
+ local pathstack=instance.pathstack
+ if trace_paths and #pathstack>0 then
+ report_resolving("popping path %a",pathstack[#pathstack])
+ end
+ remove(pathstack)
+end
+function resolvers.stackpath()
+ local pathstack=instance.pathstack
+ local currentpath=pathstack[#pathstack]
+ return currentpath~="" and currentpath or nil
+end
local done={}
function resolvers.resetextrapath()
local ep=instance.extra_paths
@@ -14743,8 +14786,8 @@ local function isreadable(name)
end
return readable
end
-local function collect_files(names)
- local filelist={}
+local function collect_files(names)
+ local filelist={}
local noffiles=0
local function check(hash,root,pathname,path,name)
if not pathname or find(path,pathname) then
@@ -14778,7 +14821,7 @@ local function collect_files(names)
local content=hashname and instance.files[hashname]
if content then
if trace_detail then
- report_resolving("deep checking %a, base %a, pattern %a",blobpath,basename,pathname)
+ report_resolving("deep checking %a, base %a, pattern %a",hashname,basename,pathname)
end
local path,name=lookup(content,basename)
if path then
@@ -14964,7 +15007,7 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
local pathlist=resolvers.expandedpathlist(typespec,filetype and usertypes[filetype])
local method="intree"
if pathlist and #pathlist>0 then
- local filelist=collect_files(wantedfiles)
+ local filelist=collect_files(wantedfiles)
local dirlist={}
if filelist then
for i=1,#filelist do
@@ -14972,7 +15015,7 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
end
end
if trace_detail then
- report_resolving("checking filename %a",filename)
+ report_resolving("checking filename %a in tree",filename)
end
local result={}
for k=1,#pathlist do
@@ -15021,6 +15064,9 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
local pname=gsub(pathname,"%.%*$",'')
if not find(pname,"*",1,true) then
if can_be_dir(pname) then
+ if trace_detail then
+ report_resolving("quick root scan for %a",pname)
+ end
for k=1,#wantedfiles do
local w=wantedfiles[k]
local fname=check_subpath(filejoin(pname,w))
@@ -15033,6 +15079,9 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
end
end
if not done and doscan then
+ if trace_detail then
+ report_resolving("scanning filesystem for %a",pname)
+ end
local files=resolvers.simplescanfiles(pname,false,true)
for k=1,#wantedfiles do
local w=wantedfiles[k]
@@ -15489,7 +15538,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-pre"] = package.loaded["data-pre"] or true
--- original size: 3106, stripped down to: 2563
+-- original size: 3346, stripped down to: 2779
if not modules then modules={} end modules ['data-pre']={
version=1.001,
@@ -15587,6 +15636,15 @@ prefixes.kpse=prefixes.locate
prefixes.full=prefixes.locate
prefixes.file=prefixes.filename
prefixes.path=prefixes.pathname
+prefixes.jobfile=function(str)
+ local path=resolvers.stackpath() or "."
+ if str and str~="" then
+ return cleanpath(joinpath(path,str))
+ else
+ return cleanpath(path)
+ end
+end
+resolvers.setdynamic("jobfile")
end -- of closure
@@ -17303,8 +17361,8 @@ end -- of closure
-- used libraries : l-lua.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-sto.lua util-prs.lua util-fmt.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-mrg.lua util-tpl.lua util-env.lua luat-env.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua
-- skipped libraries : -
--- original bytes : 712790
--- stripped bytes : 253465
+-- original bytes : 714341
+-- stripped bytes : 253350
-- end library merge
diff --git a/scripts/context/stubs/mswin/mtxrun.lua b/scripts/context/stubs/mswin/mtxrun.lua
index a9e563117..06db6c54e 100644
--- a/scripts/context/stubs/mswin/mtxrun.lua
+++ b/scripts/context/stubs/mswin/mtxrun.lua
@@ -12649,7 +12649,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-ini"] = package.loaded["data-ini"] or true
--- original size: 10598, stripped down to: 7341
+-- original size: 11085, stripped down to: 7662
if not modules then modules={} end modules ['data-ini']={
version=1.001,
@@ -12803,6 +12803,7 @@ local prefixes=utilities.storage.allocate()
resolvers.prefixes=prefixes
local resolved={}
local abstract={}
+local dynamic={}
function resolvers.resetresolve(str)
resolved,abstract={},{}
end
@@ -12826,11 +12827,15 @@ end
function resolvers.unresolve(str)
return abstract[str] or str
end
+function resolvers.setdynamic(str)
+ dynamic[str]=true
+end
local pattern=Cs((C(R("az")^2)*P(":")*C((1-S(" \"\';,"))^1)/_resolve_+P(1))^0)
local prefix=C(R("az")^2)*P(":")
local target=C((1-S(" \"\';,"))^1)
local notarget=(#S(";,")+P(-1))*Cc("")
-local pattern=Cs(((prefix*(target+notarget))/_resolve_+P(1))^0)
+local p_resolve=Cs(((prefix*(target+notarget))/_resolve_+P(1))^0)
+local p_simple=prefix*P(-1)
local function resolve(str)
if type(str)=="table" then
local res={}
@@ -12838,15 +12843,25 @@ local function resolve(str)
res[i]=resolve(str[i])
end
return res
- else
- local res=resolved[str]
- if not res then
- res=lpegmatch(pattern,str)
- resolved[str]=res
- abstract[res]=str
+ end
+ local res=resolved[str]
+ if res then
+ return res
+ end
+ local simple=lpegmatch(p_simple,str)
+ local action=prefixes[simple]
+ if action then
+ local res=action(res)
+ if not dynamic[simple] then
+ resolved[simple]=res
+ abstract[res]=simple
end
return res
end
+ res=lpegmatch(p_resolve,str)
+ resolved[str]=res
+ abstract[res]=str
+ return res
end
resolvers.resolve=resolve
if type(osuname)=="function" then
@@ -14048,7 +14063,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-res"] = package.loaded["data-res"] or true
--- original size: 63245, stripped down to: 43315
+-- original size: 64069, stripped down to: 44444
if not modules then modules={} end modules ['data-res']={
version=1.001,
@@ -14058,7 +14073,7 @@ if not modules then modules={} end modules ['data-res']={
license="see context related readme files",
}
local gsub,find,lower,upper,match,gmatch=string.gsub,string.find,string.lower,string.upper,string.match,string.gmatch
-local concat,insert,sortedkeys,sortedhash=table.concat,table.insert,table.sortedkeys,table.sortedhash
+local concat,insert,remove,sortedkeys,sortedhash=table.concat,table.insert,table.remove,table.sortedkeys,table.sortedhash
local next,type,rawget=next,type,rawget
local os=os
local P,S,R,C,Cc,Cs,Ct,Carg=lpeg.P,lpeg.S,lpeg.R,lpeg.C,lpeg.Cc,lpeg.Cs,lpeg.Ct,lpeg.Carg
@@ -14083,6 +14098,7 @@ local luasuffixes=utilities.lua.suffixes
local trace_locating=false trackers .register("resolvers.locating",function(v) trace_locating=v end)
local trace_detail=false trackers .register("resolvers.details",function(v) trace_detail=v end)
local trace_expansions=false trackers .register("resolvers.expansions",function(v) trace_expansions=v end)
+local trace_paths=false trackers .register("resolvers.paths",function(v) trace_paths=v end)
local resolve_otherwise=true directives.register("resolvers.otherwise",function(v) resolve_otherwise=v end)
local report_resolving=logs.reporter("resolvers","resolving")
local resolvers=resolvers
@@ -14185,6 +14201,7 @@ function resolvers.newinstance()
savelists=true,
pattern=nil,
force_suffixes=true,
+ pathstack={},
}
setmetatableindex(variables,function(t,k)
local v
@@ -14573,6 +14590,32 @@ end
function resolvers.unexpandedpath(str)
return joinpath(resolvers.unexpandedpathlist(str))
end
+function resolvers.pushpath(name)
+ local pathstack=instance.pathstack
+ local lastpath=pathstack[#pathstack]
+ local pluspath=filedirname(name)
+ if lastpath then
+ lastpath=collapsepath(filejoin(lastpath,pluspath))
+ else
+ lastpath=collapsepath(pluspath)
+ end
+ insert(pathstack,lastpath)
+ if trace_paths then
+ report_resolving("pushing path %a",lastpath)
+ end
+end
+function resolvers.poppath()
+ local pathstack=instance.pathstack
+ if trace_paths and #pathstack>0 then
+ report_resolving("popping path %a",pathstack[#pathstack])
+ end
+ remove(pathstack)
+end
+function resolvers.stackpath()
+ local pathstack=instance.pathstack
+ local currentpath=pathstack[#pathstack]
+ return currentpath~="" and currentpath or nil
+end
local done={}
function resolvers.resetextrapath()
local ep=instance.extra_paths
@@ -14743,8 +14786,8 @@ local function isreadable(name)
end
return readable
end
-local function collect_files(names)
- local filelist={}
+local function collect_files(names)
+ local filelist={}
local noffiles=0
local function check(hash,root,pathname,path,name)
if not pathname or find(path,pathname) then
@@ -14778,7 +14821,7 @@ local function collect_files(names)
local content=hashname and instance.files[hashname]
if content then
if trace_detail then
- report_resolving("deep checking %a, base %a, pattern %a",blobpath,basename,pathname)
+ report_resolving("deep checking %a, base %a, pattern %a",hashname,basename,pathname)
end
local path,name=lookup(content,basename)
if path then
@@ -14964,7 +15007,7 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
local pathlist=resolvers.expandedpathlist(typespec,filetype and usertypes[filetype])
local method="intree"
if pathlist and #pathlist>0 then
- local filelist=collect_files(wantedfiles)
+ local filelist=collect_files(wantedfiles)
local dirlist={}
if filelist then
for i=1,#filelist do
@@ -14972,7 +15015,7 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
end
end
if trace_detail then
- report_resolving("checking filename %a",filename)
+ report_resolving("checking filename %a in tree",filename)
end
local result={}
for k=1,#pathlist do
@@ -15021,6 +15064,9 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
local pname=gsub(pathname,"%.%*$",'')
if not find(pname,"*",1,true) then
if can_be_dir(pname) then
+ if trace_detail then
+ report_resolving("quick root scan for %a",pname)
+ end
for k=1,#wantedfiles do
local w=wantedfiles[k]
local fname=check_subpath(filejoin(pname,w))
@@ -15033,6 +15079,9 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
end
end
if not done and doscan then
+ if trace_detail then
+ report_resolving("scanning filesystem for %a",pname)
+ end
local files=resolvers.simplescanfiles(pname,false,true)
for k=1,#wantedfiles do
local w=wantedfiles[k]
@@ -15489,7 +15538,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-pre"] = package.loaded["data-pre"] or true
--- original size: 3106, stripped down to: 2563
+-- original size: 3346, stripped down to: 2779
if not modules then modules={} end modules ['data-pre']={
version=1.001,
@@ -15587,6 +15636,15 @@ prefixes.kpse=prefixes.locate
prefixes.full=prefixes.locate
prefixes.file=prefixes.filename
prefixes.path=prefixes.pathname
+prefixes.jobfile=function(str)
+ local path=resolvers.stackpath() or "."
+ if str and str~="" then
+ return cleanpath(joinpath(path,str))
+ else
+ return cleanpath(path)
+ end
+end
+resolvers.setdynamic("jobfile")
end -- of closure
@@ -17303,8 +17361,8 @@ end -- of closure
-- used libraries : l-lua.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-sto.lua util-prs.lua util-fmt.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-mrg.lua util-tpl.lua util-env.lua luat-env.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua
-- skipped libraries : -
--- original bytes : 712790
--- stripped bytes : 253465
+-- original bytes : 714341
+-- stripped bytes : 253350
-- end library merge
diff --git a/scripts/context/stubs/unix/mtxrun b/scripts/context/stubs/unix/mtxrun
index a9e563117..06db6c54e 100755
--- a/scripts/context/stubs/unix/mtxrun
+++ b/scripts/context/stubs/unix/mtxrun
@@ -12649,7 +12649,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-ini"] = package.loaded["data-ini"] or true
--- original size: 10598, stripped down to: 7341
+-- original size: 11085, stripped down to: 7662
if not modules then modules={} end modules ['data-ini']={
version=1.001,
@@ -12803,6 +12803,7 @@ local prefixes=utilities.storage.allocate()
resolvers.prefixes=prefixes
local resolved={}
local abstract={}
+local dynamic={}
function resolvers.resetresolve(str)
resolved,abstract={},{}
end
@@ -12826,11 +12827,15 @@ end
function resolvers.unresolve(str)
return abstract[str] or str
end
+function resolvers.setdynamic(str)
+ dynamic[str]=true
+end
local pattern=Cs((C(R("az")^2)*P(":")*C((1-S(" \"\';,"))^1)/_resolve_+P(1))^0)
local prefix=C(R("az")^2)*P(":")
local target=C((1-S(" \"\';,"))^1)
local notarget=(#S(";,")+P(-1))*Cc("")
-local pattern=Cs(((prefix*(target+notarget))/_resolve_+P(1))^0)
+local p_resolve=Cs(((prefix*(target+notarget))/_resolve_+P(1))^0)
+local p_simple=prefix*P(-1)
local function resolve(str)
if type(str)=="table" then
local res={}
@@ -12838,15 +12843,25 @@ local function resolve(str)
res[i]=resolve(str[i])
end
return res
- else
- local res=resolved[str]
- if not res then
- res=lpegmatch(pattern,str)
- resolved[str]=res
- abstract[res]=str
+ end
+ local res=resolved[str]
+ if res then
+ return res
+ end
+ local simple=lpegmatch(p_simple,str)
+ local action=prefixes[simple]
+ if action then
+ local res=action(res)
+ if not dynamic[simple] then
+ resolved[simple]=res
+ abstract[res]=simple
end
return res
end
+ res=lpegmatch(p_resolve,str)
+ resolved[str]=res
+ abstract[res]=str
+ return res
end
resolvers.resolve=resolve
if type(osuname)=="function" then
@@ -14048,7 +14063,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-res"] = package.loaded["data-res"] or true
--- original size: 63245, stripped down to: 43315
+-- original size: 64069, stripped down to: 44444
if not modules then modules={} end modules ['data-res']={
version=1.001,
@@ -14058,7 +14073,7 @@ if not modules then modules={} end modules ['data-res']={
license="see context related readme files",
}
local gsub,find,lower,upper,match,gmatch=string.gsub,string.find,string.lower,string.upper,string.match,string.gmatch
-local concat,insert,sortedkeys,sortedhash=table.concat,table.insert,table.sortedkeys,table.sortedhash
+local concat,insert,remove,sortedkeys,sortedhash=table.concat,table.insert,table.remove,table.sortedkeys,table.sortedhash
local next,type,rawget=next,type,rawget
local os=os
local P,S,R,C,Cc,Cs,Ct,Carg=lpeg.P,lpeg.S,lpeg.R,lpeg.C,lpeg.Cc,lpeg.Cs,lpeg.Ct,lpeg.Carg
@@ -14083,6 +14098,7 @@ local luasuffixes=utilities.lua.suffixes
local trace_locating=false trackers .register("resolvers.locating",function(v) trace_locating=v end)
local trace_detail=false trackers .register("resolvers.details",function(v) trace_detail=v end)
local trace_expansions=false trackers .register("resolvers.expansions",function(v) trace_expansions=v end)
+local trace_paths=false trackers .register("resolvers.paths",function(v) trace_paths=v end)
local resolve_otherwise=true directives.register("resolvers.otherwise",function(v) resolve_otherwise=v end)
local report_resolving=logs.reporter("resolvers","resolving")
local resolvers=resolvers
@@ -14185,6 +14201,7 @@ function resolvers.newinstance()
savelists=true,
pattern=nil,
force_suffixes=true,
+ pathstack={},
}
setmetatableindex(variables,function(t,k)
local v
@@ -14573,6 +14590,32 @@ end
function resolvers.unexpandedpath(str)
return joinpath(resolvers.unexpandedpathlist(str))
end
+function resolvers.pushpath(name)
+ local pathstack=instance.pathstack
+ local lastpath=pathstack[#pathstack]
+ local pluspath=filedirname(name)
+ if lastpath then
+ lastpath=collapsepath(filejoin(lastpath,pluspath))
+ else
+ lastpath=collapsepath(pluspath)
+ end
+ insert(pathstack,lastpath)
+ if trace_paths then
+ report_resolving("pushing path %a",lastpath)
+ end
+end
+function resolvers.poppath()
+ local pathstack=instance.pathstack
+ if trace_paths and #pathstack>0 then
+ report_resolving("popping path %a",pathstack[#pathstack])
+ end
+ remove(pathstack)
+end
+function resolvers.stackpath()
+ local pathstack=instance.pathstack
+ local currentpath=pathstack[#pathstack]
+ return currentpath~="" and currentpath or nil
+end
local done={}
function resolvers.resetextrapath()
local ep=instance.extra_paths
@@ -14743,8 +14786,8 @@ local function isreadable(name)
end
return readable
end
-local function collect_files(names)
- local filelist={}
+local function collect_files(names)
+ local filelist={}
local noffiles=0
local function check(hash,root,pathname,path,name)
if not pathname or find(path,pathname) then
@@ -14778,7 +14821,7 @@ local function collect_files(names)
local content=hashname and instance.files[hashname]
if content then
if trace_detail then
- report_resolving("deep checking %a, base %a, pattern %a",blobpath,basename,pathname)
+ report_resolving("deep checking %a, base %a, pattern %a",hashname,basename,pathname)
end
local path,name=lookup(content,basename)
if path then
@@ -14964,7 +15007,7 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
local pathlist=resolvers.expandedpathlist(typespec,filetype and usertypes[filetype])
local method="intree"
if pathlist and #pathlist>0 then
- local filelist=collect_files(wantedfiles)
+ local filelist=collect_files(wantedfiles)
local dirlist={}
if filelist then
for i=1,#filelist do
@@ -14972,7 +15015,7 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
end
end
if trace_detail then
- report_resolving("checking filename %a",filename)
+ report_resolving("checking filename %a in tree",filename)
end
local result={}
for k=1,#pathlist do
@@ -15021,6 +15064,9 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
local pname=gsub(pathname,"%.%*$",'')
if not find(pname,"*",1,true) then
if can_be_dir(pname) then
+ if trace_detail then
+ report_resolving("quick root scan for %a",pname)
+ end
for k=1,#wantedfiles do
local w=wantedfiles[k]
local fname=check_subpath(filejoin(pname,w))
@@ -15033,6 +15079,9 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
end
end
if not done and doscan then
+ if trace_detail then
+ report_resolving("scanning filesystem for %a",pname)
+ end
local files=resolvers.simplescanfiles(pname,false,true)
for k=1,#wantedfiles do
local w=wantedfiles[k]
@@ -15489,7 +15538,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-pre"] = package.loaded["data-pre"] or true
--- original size: 3106, stripped down to: 2563
+-- original size: 3346, stripped down to: 2779
if not modules then modules={} end modules ['data-pre']={
version=1.001,
@@ -15587,6 +15636,15 @@ prefixes.kpse=prefixes.locate
prefixes.full=prefixes.locate
prefixes.file=prefixes.filename
prefixes.path=prefixes.pathname
+prefixes.jobfile=function(str)
+ local path=resolvers.stackpath() or "."
+ if str and str~="" then
+ return cleanpath(joinpath(path,str))
+ else
+ return cleanpath(path)
+ end
+end
+resolvers.setdynamic("jobfile")
end -- of closure
@@ -17303,8 +17361,8 @@ end -- of closure
-- used libraries : l-lua.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-sto.lua util-prs.lua util-fmt.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-mrg.lua util-tpl.lua util-env.lua luat-env.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua
-- skipped libraries : -
--- original bytes : 712790
--- stripped bytes : 253465
+-- original bytes : 714341
+-- stripped bytes : 253350
-- end library merge
diff --git a/scripts/context/stubs/win64/mtxrun.lua b/scripts/context/stubs/win64/mtxrun.lua
index a9e563117..06db6c54e 100644
--- a/scripts/context/stubs/win64/mtxrun.lua
+++ b/scripts/context/stubs/win64/mtxrun.lua
@@ -12649,7 +12649,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-ini"] = package.loaded["data-ini"] or true
--- original size: 10598, stripped down to: 7341
+-- original size: 11085, stripped down to: 7662
if not modules then modules={} end modules ['data-ini']={
version=1.001,
@@ -12803,6 +12803,7 @@ local prefixes=utilities.storage.allocate()
resolvers.prefixes=prefixes
local resolved={}
local abstract={}
+local dynamic={}
function resolvers.resetresolve(str)
resolved,abstract={},{}
end
@@ -12826,11 +12827,15 @@ end
function resolvers.unresolve(str)
return abstract[str] or str
end
+function resolvers.setdynamic(str)
+ dynamic[str]=true
+end
local pattern=Cs((C(R("az")^2)*P(":")*C((1-S(" \"\';,"))^1)/_resolve_+P(1))^0)
local prefix=C(R("az")^2)*P(":")
local target=C((1-S(" \"\';,"))^1)
local notarget=(#S(";,")+P(-1))*Cc("")
-local pattern=Cs(((prefix*(target+notarget))/_resolve_+P(1))^0)
+local p_resolve=Cs(((prefix*(target+notarget))/_resolve_+P(1))^0)
+local p_simple=prefix*P(-1)
local function resolve(str)
if type(str)=="table" then
local res={}
@@ -12838,15 +12843,25 @@ local function resolve(str)
res[i]=resolve(str[i])
end
return res
- else
- local res=resolved[str]
- if not res then
- res=lpegmatch(pattern,str)
- resolved[str]=res
- abstract[res]=str
+ end
+ local res=resolved[str]
+ if res then
+ return res
+ end
+ local simple=lpegmatch(p_simple,str)
+ local action=prefixes[simple]
+ if action then
+ local res=action(res)
+ if not dynamic[simple] then
+ resolved[simple]=res
+ abstract[res]=simple
end
return res
end
+ res=lpegmatch(p_resolve,str)
+ resolved[str]=res
+ abstract[res]=str
+ return res
end
resolvers.resolve=resolve
if type(osuname)=="function" then
@@ -14048,7 +14063,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-res"] = package.loaded["data-res"] or true
--- original size: 63245, stripped down to: 43315
+-- original size: 64069, stripped down to: 44444
if not modules then modules={} end modules ['data-res']={
version=1.001,
@@ -14058,7 +14073,7 @@ if not modules then modules={} end modules ['data-res']={
license="see context related readme files",
}
local gsub,find,lower,upper,match,gmatch=string.gsub,string.find,string.lower,string.upper,string.match,string.gmatch
-local concat,insert,sortedkeys,sortedhash=table.concat,table.insert,table.sortedkeys,table.sortedhash
+local concat,insert,remove,sortedkeys,sortedhash=table.concat,table.insert,table.remove,table.sortedkeys,table.sortedhash
local next,type,rawget=next,type,rawget
local os=os
local P,S,R,C,Cc,Cs,Ct,Carg=lpeg.P,lpeg.S,lpeg.R,lpeg.C,lpeg.Cc,lpeg.Cs,lpeg.Ct,lpeg.Carg
@@ -14083,6 +14098,7 @@ local luasuffixes=utilities.lua.suffixes
local trace_locating=false trackers .register("resolvers.locating",function(v) trace_locating=v end)
local trace_detail=false trackers .register("resolvers.details",function(v) trace_detail=v end)
local trace_expansions=false trackers .register("resolvers.expansions",function(v) trace_expansions=v end)
+local trace_paths=false trackers .register("resolvers.paths",function(v) trace_paths=v end)
local resolve_otherwise=true directives.register("resolvers.otherwise",function(v) resolve_otherwise=v end)
local report_resolving=logs.reporter("resolvers","resolving")
local resolvers=resolvers
@@ -14185,6 +14201,7 @@ function resolvers.newinstance()
savelists=true,
pattern=nil,
force_suffixes=true,
+ pathstack={},
}
setmetatableindex(variables,function(t,k)
local v
@@ -14573,6 +14590,32 @@ end
function resolvers.unexpandedpath(str)
return joinpath(resolvers.unexpandedpathlist(str))
end
+function resolvers.pushpath(name)
+ local pathstack=instance.pathstack
+ local lastpath=pathstack[#pathstack]
+ local pluspath=filedirname(name)
+ if lastpath then
+ lastpath=collapsepath(filejoin(lastpath,pluspath))
+ else
+ lastpath=collapsepath(pluspath)
+ end
+ insert(pathstack,lastpath)
+ if trace_paths then
+ report_resolving("pushing path %a",lastpath)
+ end
+end
+function resolvers.poppath()
+ local pathstack=instance.pathstack
+ if trace_paths and #pathstack>0 then
+ report_resolving("popping path %a",pathstack[#pathstack])
+ end
+ remove(pathstack)
+end
+function resolvers.stackpath()
+ local pathstack=instance.pathstack
+ local currentpath=pathstack[#pathstack]
+ return currentpath~="" and currentpath or nil
+end
local done={}
function resolvers.resetextrapath()
local ep=instance.extra_paths
@@ -14743,8 +14786,8 @@ local function isreadable(name)
end
return readable
end
-local function collect_files(names)
- local filelist={}
+local function collect_files(names)
+ local filelist={}
local noffiles=0
local function check(hash,root,pathname,path,name)
if not pathname or find(path,pathname) then
@@ -14778,7 +14821,7 @@ local function collect_files(names)
local content=hashname and instance.files[hashname]
if content then
if trace_detail then
- report_resolving("deep checking %a, base %a, pattern %a",blobpath,basename,pathname)
+ report_resolving("deep checking %a, base %a, pattern %a",hashname,basename,pathname)
end
local path,name=lookup(content,basename)
if path then
@@ -14964,7 +15007,7 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
local pathlist=resolvers.expandedpathlist(typespec,filetype and usertypes[filetype])
local method="intree"
if pathlist and #pathlist>0 then
- local filelist=collect_files(wantedfiles)
+ local filelist=collect_files(wantedfiles)
local dirlist={}
if filelist then
for i=1,#filelist do
@@ -14972,7 +15015,7 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
end
end
if trace_detail then
- report_resolving("checking filename %a",filename)
+ report_resolving("checking filename %a in tree",filename)
end
local result={}
for k=1,#pathlist do
@@ -15021,6 +15064,9 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
local pname=gsub(pathname,"%.%*$",'')
if not find(pname,"*",1,true) then
if can_be_dir(pname) then
+ if trace_detail then
+ report_resolving("quick root scan for %a",pname)
+ end
for k=1,#wantedfiles do
local w=wantedfiles[k]
local fname=check_subpath(filejoin(pname,w))
@@ -15033,6 +15079,9 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
end
end
if not done and doscan then
+ if trace_detail then
+ report_resolving("scanning filesystem for %a",pname)
+ end
local files=resolvers.simplescanfiles(pname,false,true)
for k=1,#wantedfiles do
local w=wantedfiles[k]
@@ -15489,7 +15538,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-pre"] = package.loaded["data-pre"] or true
--- original size: 3106, stripped down to: 2563
+-- original size: 3346, stripped down to: 2779
if not modules then modules={} end modules ['data-pre']={
version=1.001,
@@ -15587,6 +15636,15 @@ prefixes.kpse=prefixes.locate
prefixes.full=prefixes.locate
prefixes.file=prefixes.filename
prefixes.path=prefixes.pathname
+prefixes.jobfile=function(str)
+ local path=resolvers.stackpath() or "."
+ if str and str~="" then
+ return cleanpath(joinpath(path,str))
+ else
+ return cleanpath(path)
+ end
+end
+resolvers.setdynamic("jobfile")
end -- of closure
@@ -17303,8 +17361,8 @@ end -- of closure
-- used libraries : l-lua.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-sto.lua util-prs.lua util-fmt.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-mrg.lua util-tpl.lua util-env.lua luat-env.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua
-- skipped libraries : -
--- original bytes : 712790
--- stripped bytes : 253465
+-- original bytes : 714341
+-- stripped bytes : 253350
-- end library merge
diff --git a/tex/context/base/back-exp.lua b/tex/context/base/back-exp.lua
index 54a42085d..12fec5e40 100644
--- a/tex/context/base/back-exp.lua
+++ b/tex/context/base/back-exp.lua
@@ -133,6 +133,7 @@ local userdata = structurestags.userdata -- might be combines with tagl
local tagdata = structurestags.data
local tagmetadata = structurestags.metadata
local detailedtag = structurestags.detailedtag
+local userproperties = structurestags.userproperties
local starttiming = statistics.starttiming
local stoptiming = statistics.stoptiming
@@ -159,6 +160,7 @@ local dashsplitter = lpeg.splitat("-")
local threshold = 65536
local indexing = false
local keephyphens = false
+local exportproperties = false
local finetuning = { }
@@ -211,6 +213,7 @@ end)
local f_entity = formatters["&#x%X;"]
local f_attribute = formatters[" %s=%q"]
+local f_property = formatters[" %s%s=%q"]
setmetatableindex(specialspaces, function(t,k)
local v = utfchar(k)
@@ -341,7 +344,7 @@ document {
]] ]
local f_style = formatters [ [[
-%s[detail='%s'] {
+%s[detail="%s"] {
font-style : %s ;
font-variant : %s ;
font-weight : %s ;
@@ -544,8 +547,8 @@ do
local itemgroups = { }
- local f_symbol = formatters[" symbol='%s'"]
- local s_packed = " packed='yes'"
+ local f_symbol = formatters[' symbol="%s"']
+ local s_packed = ' packed="yes"'
function structurestags.setitemgroup(current,packed,symbol)
itemgroups[detailedtag("itemgroup",current)] = {
@@ -575,7 +578,7 @@ do
local synonyms = { }
local sortings = { }
- local f_tag = formatters[" tag='%s'"]
+ local f_tag = formatters[' tag="%s"']
function structurestags.setsynonym(current,tag)
synonyms[detailedtag("synonym",current)] = tag
@@ -621,7 +624,7 @@ do
local symbols = { }
local linked = { }
- local f_insert = formatters[" insert='%s'"]
+ local f_insert = formatters[' insert="%s"']
function structurestags.setdescription(tag,n)
local nd = structures.notes.get(tag,n) -- todo: use listdata instead
@@ -678,8 +681,8 @@ do
local image = { }
usedimages.image = image
- local f_imagespec = formatters[" id='%s' width='%s' height='%s'"]
- local f_imagepage = formatters[" page='%s'"]
+ local f_imagespec = formatters[' id="%s" width="%s" height="%s"']
+ local f_imagepage = formatters[' page="%s"']
function structurestags.setfigure(name,page,width,height)
image[detailedtag("image")] = {
@@ -708,7 +711,7 @@ do
local combinations = { }
- local f_combispec = formatters[" nx='%s' ny='%s'"]
+ local f_combispec = formatters[' nx="%s" ny="%s"']
function structurestags.setcombination(nx,ny)
combinations[detailedtag("combination")] = {
@@ -773,12 +776,12 @@ do
evaluators["special operation"] = evaluators.special
evaluators["special operation with arguments"] = evaluators.special
- local f_location = formatters[" location='aut:%s'"]
- local f_prefix = formatters[" prefix='%s'"]
- local f_destination = formatters[" destination='%s'"]
- local f_reference = formatters[" reference='%s'"]
- local f_url = formatters[" url='%s'"]
- local f_file = formatters[" file='%s'"]
+ local f_location = formatters[' location="aut:%s"']
+ local f_prefix = formatters[' prefix="%s"']
+ local f_destination = formatters[' destination="%s"']
+ local f_reference = formatters[' reference="%s"']
+ local f_url = formatters[' url="%s"']
+ local f_file = formatters[' file="%s"']
function specials.url(result,var)
local url = references.checkedurl(var.operation)
@@ -1279,12 +1282,12 @@ do
local tabledata = { }
- local f_columns = formatters[" columns='%s'"]
- local f_rows = formatters[" rows='%s'"]
+ local f_columns = formatters[' columns="%s"']
+ local f_rows = formatters[' rows="%s"']
- local s_flushright = " align='flushright'"
- local s_middle = " align='middle'"
- local s_flushleft = " align='flushleft'"
+ local s_flushright = ' align="flushright"'
+ local s_middle = ' align="middle"'
+ local s_flushleft = ' align="flushleft"'
local function hascontent(data)
for i=1,#data do
@@ -1378,9 +1381,9 @@ end
do
- local f_detail = formatters[" detail='%s'"]
- local f_index = formatters[" n='%s'"]
- local f_spacing = formatters["<c n='%s'>%s</c>"]
+ local f_detail = formatters[' detail="%s"']
+ local f_index = formatters[' n="%s"']
+ local f_spacing = formatters['<c n="%s">%s</c>']
local f_empty_inline = formatters["<%s/>"]
local f_empty_mixed = formatters["%w<%s/>\n"]
@@ -1506,6 +1509,22 @@ do
r[n] = f_attribute(k,v)
end
end
+ if exportproperties then
+ local p = userproperties[fulltag]
+ if not p then
+ -- skip
+ elseif exportproperties == v_yes then
+ for k, v in next, p do
+ n = n + 1
+ r[n] = f_attribute(k,v)
+ end
+ else
+ for k, v in next, p do
+ n = n + 1
+ r[n] = f_property(exportproperties,k,v)
+ end
+ end
+ end
local a = di.attributes
if a then
for k, v in next, a do
@@ -2372,12 +2391,12 @@ function builders.paragraphs.tag(head)
return false
end
--- encoding='utf-8'
+-- encoding="utf-8"
do
local xmlpreamble = [[
-<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!-- input filename : %- 17s -->
<!-- processing date : %- 17s -->
@@ -2498,7 +2517,7 @@ local f_d_template = formatters [ [[
end
return xmltree
else
- return xml.convert("<?xml version='1.0'?>\n<error>invalid xhtml tree</error>")
+ return xml.convert('<?xml version="1.0"?>\n<error>invalid xhtml tree</error>')
end
end
@@ -2689,7 +2708,8 @@ local f_d_template = formatters [ [[
function commands.setupexport(t)
table.merge(finetuning,t)
- keephyphens = finetuning.hyphen == v_yes
+ keephyphens = finetuning.hyphen == v_yes
+ exportproperties = finetuning.properties == v_no and false or finetuning.properties
end
local function startexport(v)
diff --git a/tex/context/base/back-exp.mkiv b/tex/context/base/back-exp.mkiv
index 4b91636b7..d1cd42f15 100644
--- a/tex/context/base/back-exp.mkiv
+++ b/tex/context/base/back-exp.mkiv
@@ -141,20 +141,22 @@
% \c!firstpage=, % imagename
% \c!lastpage=, % imagename
\c!alternative=, % html, div
+ \c!properties=\v!no, % no: ignore, yes: as attribute, otherwise: use as prefix
\c!hyphen=\v!no]
\def\dosynchronizeexport
{\let\currentexport\empty
\ctxcommand{setupexport{
- align = "\exportparameter\c!align",
- bodyfont = \number\dimexpr\exportparameter\c!bodyfont,
- width = \number\dimexpr\exportparameter\c!width,
- hyphen = "\exportparameter\c!hyphen",
- title = \!!bs\exportparameter\c!title\!!es,
- subtitle = \!!bs\exportparameter\c!subtitle\!!es,
- author = \!!bs\exportparameter\c!author\!!es,
- firstpage = "\exportparameter\c!firstpage",
- lastpage = "\exportparameter\c!lastpage",
+ align = "\exportparameter\c!align",
+ bodyfont = \number\dimexpr\exportparameter\c!bodyfont,
+ width = \number\dimexpr\exportparameter\c!width,
+ properties = "\exportparameter\c!properties",
+ hyphen = "\exportparameter\c!hyphen",
+ title = \!!bs\exportparameter\c!title\!!es,
+ subtitle = \!!bs\exportparameter\c!subtitle\!!es,
+ author = \!!bs\exportparameter\c!author\!!es,
+ firstpage = "\exportparameter\c!firstpage",
+ lastpage = "\exportparameter\c!lastpage",
}}}
\appendtoks
diff --git a/tex/context/base/cldf-ini.lua b/tex/context/base/cldf-ini.lua
index 0a0f71266..ff466586f 100644
--- a/tex/context/base/cldf-ini.lua
+++ b/tex/context/base/cldf-ini.lua
@@ -28,6 +28,10 @@ if not modules then modules = { } end modules ['cldf-ini'] = {
-- the the differences between the lua and luajit hashers can lead to quite a slowdown
-- in some cases.
+-- context(lpeg.match(lpeg.patterns.texescape,"${}"))
+-- context(string.formatters["%!tex!"]("${}"))
+-- context("%!tex!","${}")
+
local tex = tex
context = context or { }
diff --git a/tex/context/base/cont-new.mkiv b/tex/context/base/cont-new.mkiv
index 0845e92fd..74fe145a3 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.07.25 12:57}
+\newcontextversion{2014.07.26 13:05}
%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 a7b446132..522a5ac6d 100644
--- a/tex/context/base/context-version.pdf
+++ b/tex/context/base/context-version.pdf
Binary files differ
diff --git a/tex/context/base/context.mkiv b/tex/context/base/context.mkiv
index 831a76c7f..644439e54 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.07.25 12:57}
+\edef\contextversion{2014.07.26 13:05}
\edef\contextkind {beta}
%D For those who want to use this:
diff --git a/tex/context/base/data-ini.lua b/tex/context/base/data-ini.lua
index ab5668c0b..c74ff2e04 100644
--- a/tex/context/base/data-ini.lua
+++ b/tex/context/base/data-ini.lua
@@ -233,6 +233,7 @@ resolvers.prefixes = prefixes
local resolved = { }
local abstract = { }
+local dynamic = { }
function resolvers.resetresolve(str)
resolved, abstract = { }, { }
@@ -261,15 +262,20 @@ function resolvers.unresolve(str)
return abstract[str] or str
end
+function resolvers.setdynamic(str)
+ dynamic[str] = true
+end
+
-- home:xx;selfautoparent:xx;
-local pattern = Cs((C(R("az")^2) * P(":") * C((1-S(" \"\';,"))^1) / _resolve_ + P(1))^0)
+local pattern = Cs((C(R("az")^2) * P(":") * C((1-S(" \"\';,"))^1) / _resolve_ + P(1))^0)
-local prefix = C(R("az")^2) * P(":")
-local target = C((1-S(" \"\';,"))^1)
-local notarget = (#S(";,") + P(-1)) * Cc("")
+local prefix = C(R("az")^2) * P(":")
+local target = C((1-S(" \"\';,"))^1)
+local notarget = (#S(";,") + P(-1)) * Cc("")
-local pattern = Cs(((prefix * (target + notarget)) / _resolve_ + P(1))^0)
+local p_resolve = Cs(((prefix * (target + notarget)) / _resolve_ + P(1))^0)
+local p_simple = prefix * P(-1)
local function resolve(str) -- use schemes, this one is then for the commandline only
if type(str) == "table" then
@@ -278,15 +284,28 @@ local function resolve(str) -- use schemes, this one is then for the commandline
res[i] = resolve(str[i])
end
return res
- else
- local res = resolved[str]
- if not res then
- res = lpegmatch(pattern,str)
- resolved[str] = res
- abstract[res] = str
+ end
+ -- already resolved
+ local res = resolved[str]
+ if res then
+ return res
+ end
+ -- simple resolving of (dynamic) methods
+ local simple = lpegmatch(p_simple,str)
+ local action = prefixes[simple]
+ if action then
+ local res = action(res)
+ if not dynamic[simple] then
+ resolved[simple] = res
+ abstract[res] = simple
end
return res
end
+ -- more extensive resolving (multiple too)
+ res = lpegmatch(p_resolve,str)
+ resolved[str] = res
+ abstract[res] = str
+ return res
end
resolvers.resolve = resolve
diff --git a/tex/context/base/data-pre.lua b/tex/context/base/data-pre.lua
index edfe53dab..ae4477ac6 100644
--- a/tex/context/base/data-pre.lua
+++ b/tex/context/base/data-pre.lua
@@ -113,3 +113,14 @@ prefixes.kpse = prefixes.locate
prefixes.full = prefixes.locate
prefixes.file = prefixes.filename
prefixes.path = prefixes.pathname
+
+prefixes.jobfile = function(str)
+ local path = resolvers.stackpath() or "."
+ if str and str ~= "" then
+ return cleanpath(joinpath(path,str))
+ else
+ return cleanpath(path)
+ end
+end
+
+resolvers.setdynamic("jobfile")
diff --git a/tex/context/base/data-res.lua b/tex/context/base/data-res.lua
index 69bdc508c..b3ec90898 100644
--- a/tex/context/base/data-res.lua
+++ b/tex/context/base/data-res.lua
@@ -18,7 +18,7 @@ if not modules then modules = { } end modules ['data-res'] = {
-- todo: cache:/// home:/// selfautoparent:/// (sometime end 2012)
local gsub, find, lower, upper, match, gmatch = string.gsub, string.find, string.lower, string.upper, string.match, string.gmatch
-local concat, insert, sortedkeys, sortedhash = table.concat, table.insert, table.sortedkeys, table.sortedhash
+local concat, insert, remove, sortedkeys, sortedhash = table.concat, table.insert, table.remove, table.sortedkeys, table.sortedhash
local next, type, rawget = next, type, rawget
local os = os
@@ -49,6 +49,7 @@ local luasuffixes = utilities.lua.suffixes
local trace_locating = false trackers .register("resolvers.locating", function(v) trace_locating = v end)
local trace_detail = false trackers .register("resolvers.details", function(v) trace_detail = v end)
local trace_expansions = false trackers .register("resolvers.expansions", function(v) trace_expansions = v end)
+local trace_paths = false trackers .register("resolvers.paths", function(v) trace_paths = v end)
local resolve_otherwise = true directives.register("resolvers.otherwise", function(v) resolve_otherwise = v end)
local report_resolving = logs.reporter("resolvers","resolving")
@@ -251,6 +252,7 @@ function resolvers.newinstance() -- todo: all vars will become lowercase and alp
savelists = true,
pattern = nil, -- lists
force_suffixes = true,
+ pathstack = { },
}
setmetatableindex(variables,function(t,k)
@@ -697,6 +699,35 @@ function resolvers.unexpandedpath(str)
return joinpath(resolvers.unexpandedpathlist(str))
end
+function resolvers.pushpath(name)
+ local pathstack = instance.pathstack
+ local lastpath = pathstack[#pathstack]
+ local pluspath = filedirname(name)
+ if lastpath then
+ lastpath = collapsepath(filejoin(lastpath,pluspath))
+ else
+ lastpath = collapsepath(pluspath)
+ end
+ insert(pathstack,lastpath)
+ if trace_paths then
+ report_resolving("pushing path %a",lastpath)
+ end
+end
+
+function resolvers.poppath()
+ local pathstack = instance.pathstack
+ if trace_paths and #pathstack > 0 then
+ report_resolving("popping path %a",pathstack[#pathstack])
+ end
+ remove(pathstack)
+end
+
+function resolvers.stackpath()
+ local pathstack = instance.pathstack
+ local currentpath = pathstack[#pathstack]
+ return currentpath ~= "" and currentpath or nil
+end
+
local done = { }
function resolvers.resetextrapath()
@@ -769,49 +800,6 @@ function resolvers.registerextrapath(paths,subpaths)
end
end
--- local function made_list(instance,list,extra_too)
--- if not extra_too then
--- return list
--- end
--- local ep = instance.extra_paths
--- if not ep or #ep == 0 then
--- return list
--- end
--- local done, new, newn = { }, { }, 0
--- -- honour . .. ../.. but only when at the start
--- for k=1,#list do
--- local v = list[k]
--- if not done[v] then
--- if find(v,"^[%.%/]$") then
--- done[v] = true
--- newn = newn + 1
--- new[newn] = v
--- else
--- break
--- end
--- end
--- end
--- -- first the extra paths
--- for k=1,#ep do
--- local v = ep[k]
--- if not done[v] then
--- done[v] = true
--- newn = newn + 1
--- new[newn] = v
--- end
--- end
--- -- next the formal paths
--- for k=1,#list do
--- local v = list[k]
--- if not done[v] then
--- done[v] = true
--- newn = newn + 1
--- new[newn] = v
--- end
--- end
--- return new
--- end
-
local function made_list(instance,list,extra_too)
local done, new, newn = { }, { }, 0
-- honour . .. ../.. but only when at the start
@@ -930,8 +918,8 @@ end
-- name | name/name
-local function collect_files(names)
- local filelist = { }
+local function collect_files(names) -- potential files .. sort of too much when asking for just one file
+ local filelist = { } -- but we need it for pattern matching later on
local noffiles = 0
local function check(hash,root,pathname,path,name)
if not pathname or find(path,pathname) then
@@ -965,7 +953,7 @@ local function collect_files(names)
local content = hashname and instance.files[hashname]
if content then
if trace_detail then
- report_resolving("deep checking %a, base %a, pattern %a",blobpath,basename,pathname)
+ report_resolving("deep checking %a, base %a, pattern %a",hashname,basename,pathname)
end
local path, name = lookup(content,basename)
if path then
@@ -1193,7 +1181,7 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
local method = "intree"
if pathlist and #pathlist > 0 then
-- list search
- local filelist = collect_files(wantedfiles)
+ local filelist = collect_files(wantedfiles) -- okay, a bit over the top when we just look relative to the current path
local dirlist = { }
if filelist then
for i=1,#filelist do
@@ -1201,7 +1189,7 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
end
end
if trace_detail then
- report_resolving("checking filename %a",filename)
+ report_resolving("checking filename %a in tree",filename)
end
local result = { }
-- pathlist : resolved
@@ -1257,7 +1245,14 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
local pname = gsub(pathname,"%.%*$",'')
if not find(pname,"*",1,true) then
if can_be_dir(pname) then
- -- quick root scan first
+ -- hm, rather useless as we don't go deeper and if we would we could also
+ -- auto generate the file database .. however, we need this for extra paths
+ -- that are not hashed (like sources on my machine) .. so, this is slightly
+ -- out of order but at least fast (anbd we seldom end up here, only when a file
+ -- is not already found
+ if trace_detail then
+ report_resolving("quick root scan for %a",pname)
+ end
for k=1,#wantedfiles do
local w = wantedfiles[k]
local fname = check_subpath(filejoin(pname,w))
@@ -1271,6 +1266,9 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
end
if not done and doscan then
-- collect files in path (and cache the result)
+ if trace_detail then
+ report_resolving("scanning filesystem for %a",pname)
+ end
local files = resolvers.simplescanfiles(pname,false,true)
for k=1,#wantedfiles do
local w = wantedfiles[k]
diff --git a/tex/context/base/file-job.lua b/tex/context/base/file-job.lua
index 85fa996de..3b67057e0 100644
--- a/tex/context/base/file-job.lua
+++ b/tex/context/base/file-job.lua
@@ -165,6 +165,11 @@ end
--
+local typestack = { }
+local currenttype = v_text
+
+--
+
local action = function(name,foundname) input(foundname) end
local failure = function(name,foundname) report_jobfiles("unknown %s file %a","tex",name) end
@@ -241,6 +246,7 @@ local suffixes = {
local function useanyfile(name,onlyonce)
local s = suffixes[suffixonly(name)]
+ context(function() resolvers.pushpath(name) end)
if s then
-- s(removesuffix(name),onlyonce)
s(name,onlyonce) -- so, first with suffix, then without
@@ -248,6 +254,7 @@ local function useanyfile(name,onlyonce)
usetexfile(name,onlyonce) -- e.g. ctx file
-- resolvers.readfilename(name)
end
+ context(resolvers.poppath)
end
commands.useanyfile = useanyfile
@@ -344,14 +351,6 @@ function commands.processfilenone(name)
-- skip file
end
---
-
-local typestack = { }
-local pathstack = { }
-
-local currenttype = v_text
-local currentpath = "."
-
local tree = { type = "text", name = "", branches = { } }
local treestack = { }
local top = tree.branches
@@ -442,14 +441,18 @@ local context_processfilemany = context.processfilemany
local context_processfileonce = context.processfileonce
local context_processfilenone = context.processfilenone
+-- we need a plug in the nested loaded, push pop pseudo current dir
+
local function processfilecommon(name,action)
- if not hasscheme(name) then
- local path = dirname(name)
- if path ~= "" then
- registerextrapath(path)
- report_jobfiles("adding search path %a",path)
- end
- end
+ -- experiment, might go away
+-- if not hasscheme(name) then
+-- local path = dirname(name)
+-- if path ~= "" then
+-- registerextrapath(path)
+-- report_jobfiles("adding search path %a",path)
+-- end
+-- end
+ -- till here
action(name)
end
@@ -554,7 +557,7 @@ function jobresolvers.currentcomponent () return topofstack(v_component ) end
function jobresolvers.currentenvironment() return topofstack(v_environment) end
local done = { }
-local tolerant = false -- too messy, mkii user with the wrong sructure should adapt
+local tolerant = false -- too messy, mkii user with the wrong structure should adapt
local function process(what,name)
local depth = #typestack
@@ -639,9 +642,7 @@ local stop = {
local function gotonextlevel(what,name) -- todo: something with suffix name
insert(stacks[what],name)
insert(typestack,currenttype)
- insert(pathstack,currentpath)
currenttype = what
- currentpath = dirname(name)
pushtree(what,name)
if start[what] then
start[what]()
@@ -653,7 +654,6 @@ local function gotopreviouslevel(what)
stop[what]()
end
poptree()
- currentpath = remove(pathstack) or "."
currenttype = remove(typestack) or v_text
remove(stacks[what]) -- not currenttype ... weak recovery
-- context.endinput() -- does not work
diff --git a/tex/context/base/grph-inc.lua b/tex/context/base/grph-inc.lua
index 9ee5c6199..d42d8b225 100644
--- a/tex/context/base/grph-inc.lua
+++ b/tex/context/base/grph-inc.lua
@@ -60,6 +60,8 @@ local images = img
local hasscheme = url.hasscheme
local urlhashed = url.hashed
+local resolveprefix = resolvers.resolve
+
local texgetbox = tex.getbox
local texsetbox = tex.setbox
@@ -869,7 +871,7 @@ local function locate(request) -- name, format, cache
else
-- type given
for i=1,#figure_paths do
- local path = figure_paths[i]
+ local path = resolveprefix(figure_paths[i]) -- we resolve (e.g. jobfile:)
local check = path .. "/" .. askedname
-- we pass 'true' as it can be an url as well, as the type
-- is given we don't waste much time
@@ -935,7 +937,7 @@ local function locate(request) -- name, format, cache
-- local name = file.replacesuffix(askedbase,suffix)
local name = file.replacesuffix(askedname,suffix)
for i=1,#figure_paths do
- local path = figure_paths[i]
+ local path = resolveprefix(figure_paths[i]) -- we resolve (e.g. jobfile:)
local check = path .. "/" .. name
local isfile = internalschemes[urlhashed(check).scheme]
if not isfile then
@@ -963,7 +965,7 @@ local function locate(request) -- name, format, cache
report_inclusion("unknown format, using path strategy")
end
for i=1,#figure_paths do
- local path = figure_paths[i]
+ local path = resolveprefix(figure_paths[i]) -- we resolve (e.g. jobfile:)
for j=1,#figures_order do
local format = figures_order[j]
local list = figures_formats[format].list or { format }
@@ -1588,7 +1590,7 @@ local function bases_find(basename,askedlabel)
if base[2] == nil then
-- no yet located
for i=1,#figure_paths do
- local path = figure_paths[i]
+ local path = resolveprefix(figure_paths[i]) -- we resolve (e.g. jobfile:)
local xmlfile = path .. "/" .. basename
if io.exists(xmlfile) then
base[2] = xmlfile
diff --git a/tex/context/base/lpdf-tag.lua b/tex/context/base/lpdf-tag.lua
index 22d20784e..5f0d35b53 100644
--- a/tex/context/base/lpdf-tag.lua
+++ b/tex/context/base/lpdf-tag.lua
@@ -8,8 +8,9 @@ if not modules then modules = { } end modules ['lpdf-tag'] = {
local next = next
local format, match, concat = string.format, string.match, table.concat
-local lpegmatch = lpeg.match
+local lpegmatch, P, S, C = lpeg.match, lpeg.P, lpeg.S, lpeg.C
local utfchar = utf.char
+local settings_to_hash = utilities.parsers.settings_to_hash
local trace_tags = false trackers.register("structures.tags", function(v) trace_tags = v end)
@@ -78,9 +79,14 @@ local root = { pref = pdfreference(structure_ref), kids = structu
local tree = { }
local elements = { }
local names = pdfarray()
-local taglist = structures.tags.taglist
-local usedlabels = structures.tags.labels
-local properties = structures.tags.properties
+
+local structurestags = structures.tags
+local taglist = structurestags.taglist
+local usedlabels = structurestags.labels
+local properties = structurestags.properties
+local userdata = structurestags.userdata
+local lasttaginchain = structurestags.lastinchain
+
local usedmapping = { }
local colonsplitter = lpeg.splitat(":")
@@ -164,10 +170,30 @@ end
-- here we can flush and free elements that are finished
+local userproperties = structurestags.userproperties
+local pdf_userproperties = pdfconstant("UserProperties")
+
+local function makeattribute(t)
+ if t and next(t) then
+ local properties = pdfarray()
+ for k, v in next, t do
+ properties[#properties+1] = pdfdictionary {
+ N = pdfunicode(k),
+ V = pdfunicode(v),
+ }
+ end
+ return pdfdictionary {
+ O = pdf_userproperties,
+ P = properties,
+ }
+ end
+end
+
local function makeelement(fulltag,parent)
local tag, n = lpegmatch(dashsplitter,fulltag)
local tg, detail = lpegmatch(colonsplitter,tag)
local k, r = pdfarray(), pdfreserveobject()
+ local a = userproperties[fulltag]
usedmapping[tg] = true
tg = usedlabels[tg] or tg
local d = pdfdictionary {
@@ -178,6 +204,7 @@ local function makeelement(fulltag,parent)
P = parent.pref,
Pg = pageref,
K = pdfreference(r),
+ A = a and makeattribute(a) or nil,
-- Alt = " Who cares ",
-- ActualText = " Hi Hans ",
}
diff --git a/tex/context/base/math-ini.mkiv b/tex/context/base/math-ini.mkiv
index adf252d95..2d3d3bf6c 100644
--- a/tex/context/base/math-ini.mkiv
+++ b/tex/context/base/math-ini.mkiv
@@ -26,6 +26,8 @@
%D restore a changed mathstyle so best avoid that one. However, there are cases where
%D we really need to use such grouping.
+% mathop applied to characters centers it vertically
+
\unprotect
%D We move these definitions into the format:
diff --git a/tex/context/base/mult-def.mkiv b/tex/context/base/mult-def.mkiv
index d029a2a3e..ce8da3278 100644
--- a/tex/context/base/mult-def.mkiv
+++ b/tex/context/base/mult-def.mkiv
@@ -68,6 +68,7 @@
\def\c!database {database}
\def\c!group {group}
\def\c!groupsuffix {groupsuffix}
+\def\c!properties {properties}
\def\c!referencemethod {referencemethod} % forward both
diff --git a/tex/context/base/status-files.pdf b/tex/context/base/status-files.pdf
index 0241ba073..ee0714e02 100644
--- a/tex/context/base/status-files.pdf
+++ b/tex/context/base/status-files.pdf
Binary files differ
diff --git a/tex/context/base/status-lua.pdf b/tex/context/base/status-lua.pdf
index e54405486..b7e6da8b5 100644
--- a/tex/context/base/status-lua.pdf
+++ b/tex/context/base/status-lua.pdf
Binary files differ
diff --git a/tex/context/base/strc-ref.mkvi b/tex/context/base/strc-ref.mkvi
index 715459172..3702531cf 100644
--- a/tex/context/base/strc-ref.mkvi
+++ b/tex/context/base/strc-ref.mkvi
@@ -118,6 +118,8 @@
\unexpanded\def\reference {\dosingleargument\strc_references_full_reference} % never forgotten
\unexpanded\def\setreference {\dodoubleargument\strc_references_set_reference } %
+% maybe: \let\reference\textreference
+
%D These are implemented in a low level form as:
\unexpanded\def\strc_references_text_reference [#labels]{\strc_references_set_named_reference\s!text{#labels}{}}
@@ -1080,12 +1082,6 @@
\fi
\endgroup}
-% \def\strc_references_by_reference_page_state#unknown#before#current#after% obsolete
-% {\ifcase\referencepagestate#unknown\or#current\or#before\or#after\or#before\or#after\else#unknown\fi}
-%
-% \def\strc_references_by_reference_page_state#unknown#same#previous#next#above#below% not needed
-% {\ifcase\referencepagestate#unknown\or#same\or#previous\or#next\or#above\or#below\else#unknown\fi}
-
\unexpanded\def\doifcheckedpagestate#label% #preceding#backward#current#foreward#following#otherwise%
{\doifreferencefoundelse{#label}\strc_references_handle_page_state_yes\strc_references_handle_page_state_nop}
@@ -1111,74 +1107,54 @@
\symbol[\ifcase\referencepagedetail\v!somewhere\or\v!nowhere\or\v!previous\or\v!next\or\v!previous\or\v!next\else\v!somewhere\fi]}%
\egroup}
-% \unexpanded\def\somewhere#backward#foreward#dummy[#label]% #dummy gobbles space around #foreward
-% {\doifreferencefoundelse{#label}%
-% {\markreferencepage
-% \ifcase\referencepagedetail
-% #label\or % unknown
-% \or % same
-% \goto{#backward}[#label]\or % previous
-% \goto{#foreward}[#label]\or % next
-% \goto{#backward}[#label]\or % above
-% \goto{#foreward}[#label]\else % below
-% #label\fi}%
-% {[#label]}}
+%D Hereafter the \type {\ignorespaces} binds the state node to next character (more likely
+%D than a preceding one) and one can always add an explicit space.
\unexpanded\def\somewhere#backward#foreward#dummy[#label]% #dummy gobbles space around #foreward
{\doifcheckedpagestate{#label}%
{\goto{#backward}[#label]}%
{\goto{#backward}[#label]}%
- {}%
+ {\ignorespaces}%
{\goto{#foreward}[#label]}%
{\goto{#foreward}[#label]}%
{#label}}%
-% \unexpanded\def\someplace#preceding#backward#current#foreward#following#dummy[#label]% #dummy gobbles space around #foreward
-% {\doifreferencefoundelse{#label}%
-% {\markreferencepage
-% \ifcase\referencepagedetail
-% #label\or % unknown
-% \doifsomething {#current}{\goto {#current}[#label]}\or % same
-% \doifsomething{#preceding}{\goto{#preceding}[#label]}\or % previous
-% \doifsomething{#following}{\goto{#following}[#label]}\or % next
-% \doifsomething {#backward}{\goto {#backward}[#label]}\or % above
-% \doifsomething {#foreward}{\goto {#foreward}[#label]}\else % below
-% #label\fi}%
-% {[#label]}}
-
\unexpanded\def\someplace#preceding#backward#current#foreward#following#dummy[#label]% #dummy gobbles space around #foreward
{\doifcheckedpagestate{#label}%
- {\doifsomething{#preceding}{\goto{#preceding}[#label]}}%
- {\doifsomething {#backward}{\goto {#backward}[#label]}}%
- {\doifsomething {#current}{\goto {#current}[#label]}}%
- {\doifsomething {#foreward}{\goto {#foreward}[#label]}}%
- {\doifsomething{#following}{\goto{#following}[#label]}}%
+ {\doifelsenothing{#preceding}{\goto{#preceding}[#label]}\ignorespaces}%
+ {\doifelsenothing {#backward}{\goto {#backward}[#label]}\ignorespaces}%
+ {\doifelsenothing {#current}{\goto {#current}[#label]}\ignorespaces}%
+ {\doifelsenothing {#foreward}{\goto {#foreward}[#label]}\ignorespaces}%
+ {\doifelsenothing{#following}{\goto{#following}[#label]}\ignorespaces}%
{#label}}
-% \unexpanded\def\atpage[#label]% todo
-% {\doifreferencefoundelse{#label}% kind of inefficient as \goto also analyzes
-% {\markreferencepage
-% \ifcase\referencepagedetail
-% \goto{\labeltexts\v!page\dummyreference}[#label]\or % unknown
-% \or % same
-% \goto{\labeltext \v!precedingpage }[#label]\or % previous
-% \goto{\labeltext \v!followingpage }[#label]\or % next
-% \goto{\labeltext \v!hencefore }[#label]\or % above
-% \goto{\labeltext \v!hereafter }[#label]\else % below
-% \goto{\labeltexts\v!page\dummyreference}[#label]\fi}%
-% {[#label]}}
-
\unexpanded\def\atpage[#label]% todo
{\doifcheckedpagestate{#label}%
{\goto{\labeltext \v!precedingpage }[#label]}%
{\goto{\labeltext \v!hencefore }[#label]}%
- {}%
+ {\ignorespaces}%
{\goto{\labeltext \v!hereafter }[#label]}%
{\goto{\labeltext \v!followingpage }[#label]}%
{\goto{\labeltexts\v!page\dummyreference}[#label]}}
-%D The other alternatives just conform their names: only the
-%D label, only the text, or the label and the text.
+% Someone requested this but in retrospect didn't need it so we keep it as example.
+% Beware: a node is injected which is why we add ignorespaces!
+%
+% \unexpanded\def\strc_references_conditional#action#text[#condition]#dummy[#label]%
+% {\doifcheckedpagestate{#label}%
+% {\doifelse{#condition}\v!precedingpage{#action{#text}[#label]}\ignorespaces}%
+% {\doifelse{#condition}\v!hencefore {#action{#text}[#label]}\ignorespaces}%
+% {\doifelse{#condition}\v!current {#action{#text}[#label]}\ignorespaces}%
+% {\doifelse{#condition}\v!hereafter {#action{#text}[#label]}\ignorespaces}%
+% {\doifelse{#condition}\v!followingpage{#action{#text}[#label]}\ignorespaces}%
+% {#label}}
+%
+% \unexpanded\def\conditionalat {\strc_references_conditional\at}
+% \unexpanded\def\conditionalin {\strc_references_conditional\in}
+% \unexpanded\def\conditionalabout{\strc_references_conditional\about}
+
+%D The other alternatives just conform their names: only the label, only the text, or the
+%D label and the text.
% \dounknownreference -> \dummyreference
diff --git a/tex/context/base/strc-tag.lua b/tex/context/base/strc-tag.lua
index e368eae37..6f69144dc 100644
--- a/tex/context/base/strc-tag.lua
+++ b/tex/context/base/strc-tag.lua
@@ -8,9 +8,10 @@ if not modules then modules = { } end modules ['strc-tag'] = {
-- This is rather experimental code.
+local type = type
local insert, remove, unpack, concat = table.insert, table.remove, table.unpack, table.concat
local gsub, find, topattern, format = string.gsub, string.find, string.topattern, string.format
-local lpegmatch = lpeg.match
+local lpegmatch, P, S, C = lpeg.match, lpeg.P, lpeg.S, lpeg.C
local texattribute = tex.attribute
local allocate = utilities.storage.allocate
local settings_to_hash = utilities.parsers.settings_to_hash
@@ -26,23 +27,26 @@ local a_tagged = attributes.private('tagged')
local unsetvalue = attributes.unsetvalue
local codeinjections = backends.codeinjections
-local taglist = allocate()
-local properties = allocate()
-local labels = allocate()
-local stack = { }
-local chain = { }
-local ids = { }
-local enabled = false
-local tagdata = { } -- used in export
-local tagmetadata = { } -- used in export
-
-local tags = structures.tags
-tags.taglist = taglist -- can best be hidden
-tags.labels = labels
-tags.data = tagdata
-tags.metadata = tagmetadata
-
-local properties = allocate {
+local taglist = allocate()
+local properties = allocate()
+local userproperties = allocate()
+local labels = allocate()
+local stack = { }
+local chain = { }
+local ids = { }
+local enabled = false
+local tagdata = { } -- used in export
+local tagmetadata = { } -- used in export
+local tagcontext = { }
+
+local tags = structures.tags
+tags.taglist = taglist -- can best be hidden
+tags.labels = labels
+tags.data = tagdata
+tags.metadata = tagmetadata
+tags.userproperties = userproperties -- used in backend
+
+local properties = allocate {
document = { pdf = "Div", nature = "display" },
@@ -203,7 +207,7 @@ tags.properties = properties
local lasttags = { }
local userdata = { }
-tags.userdata = userdata
+tags.userdata = userdata
function tags.setproperty(tag,key,value)
local p = properties[tag]
@@ -237,21 +241,15 @@ local nstack = 0
function tags.start(tag,specification)
local label, detail, user
if specification then
- label, detail, user = specification.label, specification.detail, specification.userdata
+ label = specification.label
+ detail = specification.detail
+ user = specification.userdata
end
if not enabled then
codeinjections.enabletags()
enabled = true
end
--
---~ labels[tag] = label ~= "" and label or tag
---~ local fulltag
---~ if detail and detail ~= "" then
---~ fulltag = tag .. ":" .. detail
---~ else
---~ fulltag = tag
---~ end
- --
local fulltag = label ~= "" and label or tag
labels[tag] = fulltag
if detail and detail ~= "" then
@@ -266,6 +264,9 @@ function tags.start(tag,specification)
nstack = nstack + 1
chain[nstack] = completetag
stack[nstack] = t
+ --
+ tagcontext[tag] = completetag
+ --
-- a copy as we can add key values for alt and actualtext if needed:
taglist[t] = { unpack(chain,1,nstack) }
--
@@ -319,10 +320,44 @@ function tags.last(tag)
return lasttags[tag] -- or false
end
-function tags.lastinchain()
- return chain[nstack]
+function tags.lastinchain(tag)
+ if tag and tag ~= "" then
+ return tagcontext[tag]
+ else
+ return chain[nstack]
+ end
+end
+
+local strip = C((1-S(":-"))^1)
+
+commands.getelementtag = function()
+ local fulltag = chain[nstack]
+ if fulltag then
+ context(lpegmatch(strip,fulltag))
+ end
+end
+
+function tags.setuserproperties(tag,list)
+ if list then
+ tag = tagcontext[tag]
+ else
+ tag, list = chain[nstack], tag
+ end
+ if tag then
+ local l = settings_to_hash(list)
+ local p = userproperties[tag]
+ if p then
+ for k, v in next, l do
+ p[k] = v
+ end
+ else
+ userproperties[tag] = l
+ end
+ end
end
+commands.setelementuserproperties = tags.setuserproperties
+
function structures.atlocation(str)
local location = gsub(concat(taglist[texattribute[a_tagged]],"-"),"%-%d+","")
return find(location,topattern(str)) ~= nil
diff --git a/tex/context/base/strc-tag.mkiv b/tex/context/base/strc-tag.mkiv
index 7e15be4a3..83eb3c142 100644
--- a/tex/context/base/strc-tag.mkiv
+++ b/tex/context/base/strc-tag.mkiv
@@ -239,6 +239,38 @@
{\let\dostarttagged\strc_tags_start_nop
\let\dostoptagged \strc_tags_stop_nop}
+% for luigi (beware: fully expandable):
+
+\def\strc_tags_get_element_tag_yes{\ctxcommand{getelementtag()}}
+\let\strc_tags_get_element_tag_nop\donothing
+
+\unexpanded\def\strc_tags_setup_element_user_properties_yes
+ {\dodoubleempty\strc_tags_setup_element_user_properties_indeed}
+
+\unexpanded\def\strc_tags_setup_element_user_properties_nop
+ {\dodoubleempty\strc_tags_setup_element_user_properties_indeed_nop}
+
+\def\strc_tags_setup_element_user_properties_indeed
+ {\iftrialtypesetting
+ \expandafter \strc_tags_setup_element_user_properties_indeed_nop
+ \else\ifsecondargument
+ \doubleexpandafter\strc_tags_setup_element_user_properties_indeed_two
+ \else
+ \doubleexpandafter\strc_tags_setup_element_user_properties_indeed_one
+ \fi\fi}
+
+\def\strc_tags_setup_element_user_properties_indeed_nop[#1][#2]{}
+\def\strc_tags_setup_element_user_properties_indeed_one[#1][#2]{\ctxcommand{setelementuserproperties(\!!bs#1\!!es)}}
+\def\strc_tags_setup_element_user_properties_indeed_two[#1][#2]{\ctxcommand{setelementuserproperties("#1",\!!bs#2\!!es)}}
+
+\unexpanded\def\strc_tags_enable_properties
+ {\let\getelementtag \strc_tags_get_element_tag_yes
+ \let\setupelementuserproperties\strc_tags_setup_element_user_properties_yes}
+
+\unexpanded\def\strc_tags_disable_properties
+ {\let\getelementtag \strc_tags_get_element_tag_nop
+ \let\setupelementuserproperties\strc_tags_setup_element_user_properties_nop}
+
%D The triggers:
\newtoks\everyenableelements
@@ -246,11 +278,13 @@
\appendtoks
\strc_tags_enable_elements
+ \strc_tags_enable_properties
\doifelse{\taggingparameter\c!method}\v!auto\strc_tags_enable\strc_tags_disable
\to \everyenableelements
\appendtoks
\strc_tags_disable_elements
+ \strc_tags_disable_properties
\strc_tags_disable
\to \everydisableelements
diff --git a/tex/generic/context/luatex/luatex-fonts-merged.lua b/tex/generic/context/luatex/luatex-fonts-merged.lua
index 9eab657a1..a692e621f 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 : 07/25/14 12:57:26
+-- merge date : 07/26/14 13:05:35
do -- begin closure to overcome local limits and interference