summaryrefslogtreecommitdiff
path: root/scripts/context/lua
diff options
context:
space:
mode:
authorMarius <mariausol@gmail.com>2011-02-09 16:40:14 +0200
committerMarius <mariausol@gmail.com>2011-02-09 16:40:14 +0200
commited637df24cc8435fc78d30bc08c89f7db60b39c9 (patch)
treee7cf119063bef00fcd4c3193bb8f8440686bd581 /scripts/context/lua
parent03766f7aaa5a741c5d52a1ee8201a887e594b350 (diff)
downloadcontext-ed637df24cc8435fc78d30bc08c89f7db60b39c9.tar.gz
beta 2011.02.09 15:29
Diffstat (limited to 'scripts/context/lua')
-rw-r--r--scripts/context/lua/mtx-context.lua78
-rw-r--r--scripts/context/lua/mtxrun.lua151
2 files changed, 186 insertions, 43 deletions
diff --git a/scripts/context/lua/mtx-context.lua b/scripts/context/lua/mtx-context.lua
index 98935adce..2ffab155a 100644
--- a/scripts/context/lua/mtx-context.lua
+++ b/scripts/context/lua/mtx-context.lua
@@ -153,7 +153,7 @@ do
function ctxrunner.reflag(flags)
local t = { }
for _, flag in next, flags do
- local key, value = flag:match("^(.-)=(.+)$")
+ local key, value = match(flag,"^(.-)=(.+)$")
if key and value then
t[key] = value
else
@@ -502,7 +502,7 @@ function scripts.context.multipass.makeoptionfile(jobname,ctxdata,kindofrun,curr
else
local a = someflag(flag) or (plural and someflag(flag.."s"))
if a and a ~= "" then
- for v in a:gmatch("%s*([^,]+)") do
+ for v in gmatch(a,"%s*([^,]+)") do
f:write(format(template,v),"\n")
end
end
@@ -643,9 +643,9 @@ local function analyze(filename) -- only files on current path
if f then
local t = { }
local line = f:read("*line") or ""
- local preamble = line:match("[\254\255]*%%%s+(.+)$") -- there can be an utf bomb in front
+ local preamble = match(line,"[\254\255]*%%%s+(.+)$") -- there can be an utf bomb in front
if preamble then
- for key, value in preamble:gmatch("(%S+)=(%S+)") do
+ for key, value in gmatch(preamble,"(%S+)=(%S+)") do
t[key] = value
end
t.type = "tex"
@@ -1160,7 +1160,7 @@ function scripts.context.version()
report("main context file: %s",name)
local data = io.loaddata(name)
if data then
- local version = data:match("\\edef\\contextversion{(.-)}")
+ local version = match(data,"\\edef\\contextversion{(.-)}")
if version then
report("current version: %s",version)
else
@@ -1310,22 +1310,74 @@ function scripts.context.touch()
end
end
+-- modules
+
+local labels = { "title", "comment", "status" }
+
+function scripts.context.modules(pattern)
+ local list = { }
+ local found = resolvers.findfile("context.mkiv")
+ if not pattern or pattern == "" then
+ -- official files in the tree
+ resolvers.findwildcardfiles("*.tex",list)
+ resolvers.findwildcardfiles("*.mkiv",list)
+ -- my dev path
+ dir.glob(file.join(file.dirname(found),"*.tex"),list)
+ dir.glob(file.join(file.dirname(found),"*.mkiv"),list)
+ else
+ resolvers.findwildcardfiles(pattern,list)
+ dir.glob(file.join(file.dirname(found,pattern)),list)
+ end
+ local done = { } -- todo : sort
+ for i=1,#list do
+ local v = list[i]
+ local base = file.basename(v)
+ if not done[base] then
+ done[base] = true
+ local suffix = file.suffix(base)
+ if suffix == "tex" or suffix == "mkiv" then
+ local prefix = match(base,"^([xmst])%-")
+ if prefix then
+ v = resolvers.findfile(base) -- so that files on my dev path are seen
+ local data = io.loaddata(v) or ""
+ data = match(data,"%% begin info(.-)%% end info")
+ if data then
+ local info = { }
+ for label, text in gmatch(data,"%% +([^ ]+) *: *(.-)[\n\r]") do
+ info[label] = text
+ end
+ report()
+ report("%-7s : %s","module",base)
+ report()
+ for i=1,#labels do
+ local l = labels[i]
+ if info[l] then
+ report("%-7s : %s",l,info[l])
+ end
+ end
+ report()
+ end
+ end
+ end
+ end
+ end
+end
+
-- extras
function scripts.context.extras(pattern)
+ -- only in base path, i.e. only official ones
local found = resolvers.findfile("context.mkiv")
- if found == "" then
- report("unknown extra: %s", extra)
- else
+ if found ~= "" then
pattern = file.join(dir.expandname(file.dirname(found)),format("mtx-context-%s.tex",pattern or "*"))
local list = dir.glob(pattern)
for i=1,#list do
local v = list[i]
local data = io.loaddata(v) or ""
- data = match(data,"begin help(.-)end help")
+ data = match(data,"%% begin help(.-)%% end help")
if data then
report()
- report(format("extra: %s (%s)",gsub(v,"^.*mtx%-context%-(.-)%.tex$","%1"),v))
+ report("extra: %s (%s)",(gsub(v,"^.*mtx%-context%-(.-)%.tex$","%1")),v)
for s in gmatch(data,"%% *(.-)[\n\r]") do
report(s)
end
@@ -1464,8 +1516,8 @@ function scripts.context.update()
end
local oldfile = io.loaddata(resolvers.findfile("context.mkiv")) or ""
local function versiontonumber(what,str)
- local version = str:match("\\edef\\contextversion{(.-)}") or ""
- local year, month, day, hour, minute = str:match("\\edef\\contextversion{(%d+)%.(%d+)%.(%d+) *(%d+)%:(%d+)}")
+ local version = match(str,"\\edef\\contextversion{(.-)}") or ""
+ local year, month, day, hour, minute = match(str,"\\edef\\contextversion{(%d+)%.(%d+)%.(%d+) *(%d+)%:(%d+)}")
if year and minute then
local time = os.time { year=year,month=month,day=day,hour=hour,minute=minute}
report("%s version: %s (%s)",what,version,time)
@@ -1567,6 +1619,8 @@ elseif environment.argument("update") then
scripts.context.update()
elseif environment.argument("expert") then
application.help("expert", "special")
+elseif environment.argument("modules") then
+ scripts.context.modules()
elseif environment.argument("extras") then
scripts.context.extras()
elseif environment.argument("extra") then
diff --git a/scripts/context/lua/mtxrun.lua b/scripts/context/lua/mtxrun.lua
index 27e0cbfa6..fed0e13f4 100644
--- a/scripts/context/lua/mtxrun.lua
+++ b/scripts/context/lua/mtxrun.lua
@@ -5004,43 +5004,78 @@ local function ignore() end
setmetatable(logs, { __index = function(t,k) t[k] = ignore ; return ignore end })
-local report, subreport, status, settarget
+local report, subreport, status, settarget, setformatter
+
+local direct, subdirect, writer
if tex and tex.jobname or tex.formatname then
- local target = "term and log"
+ local valueiskey = { __index = function(t,k) t[k] = k return k end } -- will be helper
+
+ local target = "term and log"
+
+ local formats = { } setmetatable(formats, valueiskey)
+ local translations = { } setmetatable(translations,valueiskey)
+
+ writer = function(...)
+ write_nl(target,...)
+ end
report = function(a,b,c,...)
if c then
- write_nl(target,format("%-15s > %s\n",a,format(b,c,...)))
+ write_nl(target,format("%-15s > %s\n",translations[a],format(formats[b],c,...)))
elseif b then
- write_nl(target,format("%-15s > %s\n",a,b))
+ write_nl(target,format("%-15s > %s\n",translations[a],formats[b]))
elseif a then
- write_nl(target,format("%-15s >\n", a))
+ write_nl(target,format("%-15s >\n", translations[a]))
else
write_nl(target,"\n")
end
end
- subreport = function(a,sub,b,c,...)
+ direct = function(a,b,c,...)
if c then
- write_nl(target,format("%-15s > %s > %s\n",a,sub,format(b,c,...)))
+ return format("%-15s > %s",translations[a],format(formats[b],c,...))
elseif b then
- write_nl(target,format("%-15s > %s > %s\n",a,sub,b))
+ return format("%-15s > %s",translations[a],formats[b])
elseif a then
- write_nl(target,format("%-15s > %s >\n", a,sub))
+ return format("%-15s >", translations[a])
+ else
+ return ""
+ end
+ end
+
+ subreport = function(a,s,b,c,...)
+ if c then
+ write_nl(target,format("%-15s > %s > %s\n",translations[a],translations[s],format(formats[b],c,...)))
+ elseif b then
+ write_nl(target,format("%-15s > %s > %s\n",translations[a],translations[s],formats[b]))
+ elseif a then
+ write_nl(target,format("%-15s > %s >\n", translations[a],translations[s]))
else
write_nl(target,"\n")
end
end
+ subdirect = function(a,s,b,c,...)
+ if c then
+ return format("%-15s > %s > %s",translations[a],translations[s],format(formats[b],c,...))
+ elseif b then
+ return format("%-15s > %s > %s",translations[a],translations[s],formats[b])
+ elseif a then
+ return format("%-15s > %s >", translations[a],translations[s])
+ else
+ return ""
+ end
+ end
+
status = function(a,b,c,...)
if c then
- write_nl(target,format("%-15s : %s\n",a,format(b,c,...)))
+ write_nl(target,format("%-15s : %s\n",translations[a],format(formats[b],c,...)))
elseif b then
- write_nl(target,format("%-15s : %s\n",a,b)) -- b can have %'s
+ write_nl(target,format("%-15s : %s\n",translations[a],formats[b]))
elseif a then
- write_nl(target,format("%-15s :\n", a))
+ write_nl(target,format("%-15s :\n", translations[a]))
else
write_nl(target,"\n")
end
@@ -5072,8 +5107,18 @@ if tex and tex.jobname or tex.formatname then
end
end
+ setformats = function(f)
+ formats = f
+ end
+
+ settranslations = function(t)
+ translations = t
+ end
+
else
+ writer = write_nl
+
report = function(a,b,c,...)
if c then
write_nl(format("%-15s | %s",a,format(b,c,...)))
@@ -5110,18 +5155,29 @@ else
end
end
- settarget = ignore
- pushtarget = ignore
- poptarget = ignore
+ direct = ignore
+ subdirect = ignore
+
+ settarget = ignore
+ pushtarget = ignore
+ poptarget = ignore
+ setformats = ignore
+ settranslations = ignore
end
-logs.report = report
-logs.subreport = subreport
-logs.status = status
-logs.settarget = settarget
-logs.pushtarget = pushtarget
-logs.poptarget = poptarget
+logs.report = report
+logs.subreport = subreport
+logs.status = status
+logs.settarget = settarget
+logs.pushtarget = pushtarget
+logs.poptarget = poptarget
+logs.setformats = setformats
+logs.settranslations = settranslations
+
+logs.direct = direct
+logs.subdirect = subdirect
+logs.writer = writer
-- installer
@@ -5171,7 +5227,30 @@ function logs.reporter(category,subcategory)
return reporter
end
-logs.new = logs.reporter
+logs.new = logs.reporter -- for old times sake
+
+-- context specicific: this ends up in the macro stream
+
+local ctxreport = logs.writer
+
+function logs.setmessenger(m)
+ ctxreport = m
+end
+
+function logs.messenger(category,subcategory)
+ -- we need to avoid catcode mess (todo: fast context)
+ if subcategory then
+ return function(...)
+ ctxreport(subdirect(category,subcategory,...))
+ end
+ else
+ return function(...)
+ ctxreport(direct(category,...))
+ end
+ end
+end
+
+-- so far
local function doset(category,value)
if category == true then
@@ -11851,17 +11930,20 @@ end
local function doit(path,blist,bname,tag,kind,result,allresults)
local done = false
if blist and kind then
+ local resolve = resolvers.resolve -- added
if type(blist) == 'string' then
-- make function and share code
if find(lower(blist),path) then
- result[#result+1] = methodhandler('concatinators',kind,tag,blist,bname) or ""
+ local full = methodhandler('concatinators',kind,tag,blist,bname) or ""
+ result[#result+1] = resolve(full)
done = true
end
else
for kk=1,#blist do
local vv = blist[kk]
if find(lower(vv),path) then
- result[#result+1] = methodhandler('concatinators',kind,tag,vv,bname) or ""
+ local full = methodhandler('concatinators',kind,tag,vv,bname) or ""
+ result[#result+1] = resolve(full)
done = true
if not allresults then break end
end
@@ -11871,15 +11953,22 @@ local function doit(path,blist,bname,tag,kind,result,allresults)
return done
end
+
local makewildcard = Cs(
(P("^")^0 * P("/") * P(-1) + P(-1)) /".*"
- + (P("^")^0 * P("/") / "") * (P("*")/".*" + P("-")/"%%-" + P("?")/"."+ P("\\")/"/" + P(1))^0
+ + (P("^")^0 * P("/") / "")^0 * (P("*")/".*" + P("-")/"%%-" + P(".")/"%%." + P("?")/"."+ P("\\")/"/" + P(1))^0
)
-local function findwildcardfiles(filename,allresults) -- todo: remap: and lpeg
- local result = { }
- local path = lower(lpegmatch(makewildcard,filedirname (filename)))
- local name = lower(lpegmatch(makewildcard,filebasename(filename)))
+function resolvers.wildcardpattern(pattern)
+ return lpegmatch(makewildcard,pattern) or pattern
+end
+
+local function findwildcardfiles(filename,allresults,result) -- todo: remap: and lpeg
+ result = result or { }
+ local base = filebasename(filename)
+ local dirn = filedirname(filename)
+ local path = lower(lpegmatch(makewildcard,dirn) or dirn)
+ local name = lower(lpegmatch(makewildcard,base) or base)
local files, done = instance.files, false
if find(name,"%*") then
local hashes = instance.hashes
@@ -11909,8 +11998,8 @@ local function findwildcardfiles(filename,allresults) -- todo: remap: and lpeg
return result
end
-function resolvers.findwildcardfiles(filename)
- return findwildcardfiles(filename,true)
+function resolvers.findwildcardfiles(filename,result)
+ return findwildcardfiles(filename,true,result)
end
function resolvers.findwildcardfile(filename)