diff options
Diffstat (limited to 'tex/context/base/trac-xml.lua')
-rw-r--r-- | tex/context/base/trac-xml.lua | 366 |
1 files changed, 183 insertions, 183 deletions
diff --git a/tex/context/base/trac-xml.lua b/tex/context/base/trac-xml.lua index aba82ef52..cd8b8c0a5 100644 --- a/tex/context/base/trac-xml.lua +++ b/tex/context/base/trac-xml.lua @@ -1,183 +1,183 @@ -if not modules then modules = { } end modules ['trac-xml'] = {
- version = 1.001,
- comment = "companion to trac-log.mkiv",
- author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright = "PRAGMA ADE / ConTeXt Development Team",
- license = "see context related readme files"
-}
-
--- Application helpinfo can be defined in several ways:
---
--- helpinfo = "big blob of help"
---
--- helpinfo = { basic = "blob of basic help", extra = "blob of extra help" }
---
--- helpinfo = "<?xml version=1.0?><application>...</application/>"
---
--- helpinfo = "somefile.xml"
---
--- In the case of an xml file, the file should be either present on the same path
--- as the script, or we should be be able to locate it using the resolver.
-
-local formatters = string.formatters
-local reporters = logs.reporters
-local xmlserialize = xml.serialize
-local xmlcollected = xml.collected
-local xmltext = xml.text
-local xmlfirst = xml.first
-
--- there is no need for a newhandlers { name = "help", parent = "string" }
-
-local function showhelp(specification,...)
- local root = xml.convert(specification.helpinfo or "")
- if not root then
- return
- end
- local xs = xml.gethandlers("string")
- xml.sethandlersfunction(xs,"short",function(e,handler) xmlserialize(e.dt,handler) end)
- xml.sethandlersfunction(xs,"ref", function(e,handler) handler.handle("--"..e.at.name) end)
- local wantedcategories = select("#",...) == 0 and true or table.tohash { ... }
- local nofcategories = xml.count(root,"/application/flags/category")
- local report = specification.report
- for category in xmlcollected(root,"/application/flags/category") do
- local categoryname = category.at.name or ""
- if wantedcategories == true or wantedcategories[categoryname] then
- if nofcategories > 1 then
- report("%s options:",categoryname)
- report()
- end
- for subcategory in xmlcollected(category,"/subcategory") do
- for flag in xmlcollected(subcategory,"/flag") do
- local name = flag.at.name
- local value = flag.at.value
- -- local short = xmlfirst(s,"/short")
- -- local short = xmlserialize(short,xs)
- local short = xmltext(xmlfirst(flag,"/short"))
- if value then
- report("--%-20s %s",formatters["%s=%s"](name,value),short)
- else
- report("--%-20s %s",name,short)
- end
- end
- report()
- end
- end
- end
- for category in xmlcollected(root,"/application/examples/category") do
- local title = xmltext(xmlfirst(category,"/title"))
- if title and title ~= "" then
- report()
- report(title)
- report()
- end
- for subcategory in xmlcollected(category,"/subcategory") do
- for example in xmlcollected(subcategory,"/example") do
- local command = xmltext(xmlfirst(example,"/command"))
- local comment = xmltext(xmlfirst(example,"/comment"))
- report(command)
- end
- report()
- end
- end
- for comment in xmlcollected(root,"/application/comments/comment") do
- local comment = xmltext(comment)
- report()
- report(comment)
- report()
- end
-end
-
-local reporthelp = reporters.help
-local exporthelp = reporters.export
-
-local function xmlfound(t)
- local helpinfo = t.helpinfo
- if type(helpinfo) == "table" then
- return false
- end
- if type(helpinfo) ~= "string" then
- helpinfo = "Warning: no helpinfo found."
- t.helpinfo = helpinfo
- return false
- end
- if string.find(helpinfo,".xml$") then
- local ownscript = environment.ownscript
- local helpdata = false
- if ownscript then
- local helpfile = file.join(file.pathpart(ownscript),helpinfo)
- helpdata = io.loaddata(helpfile)
- if helpdata == "" then
- helpdata = false
- end
- end
- if not helpdata then
- local helpfile = resolvers.findfile(helpinfo,"tex")
- helpdata = helpfile and io.loaddata(helpfile)
- end
- if helpdata and helpdata ~= "" then
- helpinfo = helpdata
- else
- helpinfo = formatters["Warning: help file %a is not found."](helpinfo)
- end
- end
- t.helpinfo = helpinfo
- return string.find(t.helpinfo,"^<%?xml") and true or false
-end
-
-function reporters.help(t,...)
- if xmlfound(t) then
- showhelp(t,...)
- else
- reporthelp(t,...)
- end
-end
-
-function reporters.export(t,methods,filename)
- if not xmlfound(t) then
- return exporthelp(t)
- end
- if not methods or methods == "" then
- methods = environment.arguments["exporthelp"]
- end
- if not filename or filename == "" then
- filename = environment.files[1]
- end
- dofile(resolvers.findfile("trac-exp.lua","tex"))
- local exporters = logs.exporters
- if not exporters or not methods then
- return exporthelp(t)
- end
- if methods == "all" then
- methods = table.keys(exporters)
- elseif type(methods) == "string" then
- methods = utilities.parsers.settings_to_array(methods)
- else
- return exporthelp(t)
- end
- if type(filename) ~= "string" or filename == "" then
- filename = false
- elseif file.pathpart(filename) == "" then
- t.report("export file %a will not be saved on the current path (safeguard)",filename)
- return
- end
- for i=1,#methods do
- local method = methods[i]
- local exporter = exporters[method]
- if exporter then
- local result = exporter(t,method)
- if result and result ~= "" then
- if filename then
- local fullname = file.replacesuffix(filename,method)
- t.report("saving export in %a",fullname)
- io.savedata(fullname,result)
- else
- reporters.lines(t,result)
- end
- else
- t.report("no output from exporter %a",method)
- end
- else
- t.report("unknown exporter %a",method)
- end
- end
-end
+if not modules then modules = { } end modules ['trac-xml'] = { + version = 1.001, + comment = "companion to trac-log.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +-- Application helpinfo can be defined in several ways: +-- +-- helpinfo = "big blob of help" +-- +-- helpinfo = { basic = "blob of basic help", extra = "blob of extra help" } +-- +-- helpinfo = "<?xml version=1.0?><application>...</application/>" +-- +-- helpinfo = "somefile.xml" +-- +-- In the case of an xml file, the file should be either present on the same path +-- as the script, or we should be be able to locate it using the resolver. + +local formatters = string.formatters +local reporters = logs.reporters +local xmlserialize = xml.serialize +local xmlcollected = xml.collected +local xmltext = xml.text +local xmlfirst = xml.first + +-- there is no need for a newhandlers { name = "help", parent = "string" } + +local function showhelp(specification,...) + local root = xml.convert(specification.helpinfo or "") + if not root then + return + end + local xs = xml.gethandlers("string") + xml.sethandlersfunction(xs,"short",function(e,handler) xmlserialize(e.dt,handler) end) + xml.sethandlersfunction(xs,"ref", function(e,handler) handler.handle("--"..e.at.name) end) + local wantedcategories = select("#",...) == 0 and true or table.tohash { ... } + local nofcategories = xml.count(root,"/application/flags/category") + local report = specification.report + for category in xmlcollected(root,"/application/flags/category") do + local categoryname = category.at.name or "" + if wantedcategories == true or wantedcategories[categoryname] then + if nofcategories > 1 then + report("%s options:",categoryname) + report() + end + for subcategory in xmlcollected(category,"/subcategory") do + for flag in xmlcollected(subcategory,"/flag") do + local name = flag.at.name + local value = flag.at.value + -- local short = xmlfirst(s,"/short") + -- local short = xmlserialize(short,xs) + local short = xmltext(xmlfirst(flag,"/short")) + if value then + report("--%-20s %s",formatters["%s=%s"](name,value),short) + else + report("--%-20s %s",name,short) + end + end + report() + end + end + end + for category in xmlcollected(root,"/application/examples/category") do + local title = xmltext(xmlfirst(category,"/title")) + if title and title ~= "" then + report() + report(title) + report() + end + for subcategory in xmlcollected(category,"/subcategory") do + for example in xmlcollected(subcategory,"/example") do + local command = xmltext(xmlfirst(example,"/command")) + local comment = xmltext(xmlfirst(example,"/comment")) + report(command) + end + report() + end + end + for comment in xmlcollected(root,"/application/comments/comment") do + local comment = xmltext(comment) + report() + report(comment) + report() + end +end + +local reporthelp = reporters.help +local exporthelp = reporters.export + +local function xmlfound(t) + local helpinfo = t.helpinfo + if type(helpinfo) == "table" then + return false + end + if type(helpinfo) ~= "string" then + helpinfo = "Warning: no helpinfo found." + t.helpinfo = helpinfo + return false + end + if string.find(helpinfo,".xml$") then + local ownscript = environment.ownscript + local helpdata = false + if ownscript then + local helpfile = file.join(file.pathpart(ownscript),helpinfo) + helpdata = io.loaddata(helpfile) + if helpdata == "" then + helpdata = false + end + end + if not helpdata then + local helpfile = resolvers.findfile(helpinfo,"tex") + helpdata = helpfile and io.loaddata(helpfile) + end + if helpdata and helpdata ~= "" then + helpinfo = helpdata + else + helpinfo = formatters["Warning: help file %a is not found."](helpinfo) + end + end + t.helpinfo = helpinfo + return string.find(t.helpinfo,"^<%?xml") and true or false +end + +function reporters.help(t,...) + if xmlfound(t) then + showhelp(t,...) + else + reporthelp(t,...) + end +end + +function reporters.export(t,methods,filename) + if not xmlfound(t) then + return exporthelp(t) + end + if not methods or methods == "" then + methods = environment.arguments["exporthelp"] + end + if not filename or filename == "" then + filename = environment.files[1] + end + dofile(resolvers.findfile("trac-exp.lua","tex")) + local exporters = logs.exporters + if not exporters or not methods then + return exporthelp(t) + end + if methods == "all" then + methods = table.keys(exporters) + elseif type(methods) == "string" then + methods = utilities.parsers.settings_to_array(methods) + else + return exporthelp(t) + end + if type(filename) ~= "string" or filename == "" then + filename = false + elseif file.pathpart(filename) == "" then + t.report("export file %a will not be saved on the current path (safeguard)",filename) + return + end + for i=1,#methods do + local method = methods[i] + local exporter = exporters[method] + if exporter then + local result = exporter(t,method) + if result and result ~= "" then + if filename then + local fullname = file.replacesuffix(filename,method) + t.report("saving export in %a",fullname) + io.savedata(fullname,result) + else + reporters.lines(t,result) + end + else + t.report("no output from exporter %a",method) + end + else + t.report("unknown exporter %a",method) + end + end +end |