if not modules then modules = { } end modules ['lxml-ctx'] = { version = 1.001, comment = "companion to lxml-ini.mkiv", author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", copyright = "PRAGMA ADE / ConTeXt Development Team", license = "see context related readme files" } -- will be cleaned up local format, find, gsub = string.format, string.find, string.gsub local xml = xml xml.ctx = { } xml.ctx.enhancers = { } local context = context local commands = commands -- hashen function xml.ctx.enhancers.compound(root,lpath,before,tokens,after) -- todo lpeg local before = before or "[%a%d][%a%d][%a%d]" local tokens = tokens or "[%/%-]" local after = after or "[%a%d][%a%d][%a%d]" local pattern = "(" .. before .. ")(" .. tokens .. ")(" .. after .. ")" local action = function(a,b,c) return a .. "" .. c -- formatters["%s%s"](a,b,c) end xml.enhance(root,lpath,pattern,action) -- still present? end local loaded = { } local nodesettostring = xml.nodesettostring -- maybe use detokenize instead of \type local function cleaned(str) str = gsub(str,"|","\\textbar ") return str end function xml.ctx.tshow(specification) local pattern = specification.pattern local xmlroot = specification.xmlroot local attribute = specification.attribute if context then local xmlpattern = pattern if not find(xmlpattern,"^[%a]+://") then xmlpattern = "xml://" .. pattern end local parsed = xml.lpath(xmlpattern) local titlecommand = specification.title or "type" if parsed.state then context[titlecommand]("pattern: " .. cleaned(pattern) .. " (".. parsed.state .. ")") else context[titlecommand]("pattern: " .. cleaned(pattern)) end context.starttabulate({ "|Tr|Tl|Tp|" } ) if specification.warning then local comment = parsed.comment if comment then for k=1,#comment do context.NC() context("!") context.NC() context.rlap(comment[k]) context.NR() end context.TB() end end for p=1,#parsed do local pp = parsed[p] local kind = pp.kind context.NC() context(p) context.NC() context(kind) context.NC() if kind == "axis" then context(cleaned(pp.axis)) elseif kind == "nodes" then context(cleaned(nodesettostring(pp.nodes,pp.nodetest))) elseif kind == "expression" then -- -- context("%s => %s",pp.expression,pp.converted) context(cleaned(pp.expression)) elseif kind == "finalizer" then context("%s(%s)",pp.name,pp.arguments) elseif kind == "error" and pp.eqrror then context(pp.error) end context.NC() context.NR() end context.stoptabulate() if xmlroot and xmlroot ~= "" then if not loaded[xmlroot] then loaded[xmlroot] = xml.convert(buffers.getcontent(xmlroot)) end local collected = xml.filter(loaded[xmlroot],xmlpattern) if collected then local tc = type(collected) if not tc then -- skip else context.blank() context.type("result : ") if tc == "string" then context.type(collected) elseif tc == "table" then if collected.tg then collected = { collected } end for c=1,#collected do local cc = collected[c] if attribute and attribute ~= "" then local ccat = cc.at local a = ccat and ccat[attribute] if a and a ~= "" then context.type(a) context.type(">") end end local ccns = cc.ns if ccns == "" then context.type(cc.tg) else context.type(ccns .. ":" .. cc.tg) end context.space() end else context.type(tostring(tc)) end context.blank() end end end end end