1if not modules then modules = { } end modules ['lxml-ctx'] = {
2 version = 1.001,
3 comment = "companion to lxml-ini.mkiv",
4 author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
5 copyright = "PRAGMA ADE / ConTeXt Development Team",
6 license = "see context related readme files"
7}
8
9
10
11local format, find, gsub = string.format, string.find, string.gsub
12
13local xml = xml
14xml.ctx = { }
15xml.ctx.enhancers = { }
16
17local context = context
18local commands = commands
19
20
21
22function xml.ctx.enhancers.compound(root,lpath,before,tokens,after)
23 local before = before or "[%a%d][%a%d][%a%d]"
24 local tokens = tokens or "[%/%-]"
25 local after = after or "[%a%d][%a%d][%a%d]"
26 local pattern = "(" .. before .. ")(" .. tokens .. ")(" .. after .. ")"
27 local action = function(a,b,c)
28 return a .. "<compound token=" .. format("%q",b) .. "/>" .. c
29 end
30 xml.enhance(root,lpath,pattern,action)
31end
32
33local loaded = { }
34
35local nodesettostring = xml.nodesettostring
36
37
38
39local function cleaned(str)
40 str = gsub(str,"|","\\textbar ")
41 return str
42end
43
44function xml.ctx.tshow(specification)
45 local pattern = specification.pattern
46 local xmlroot = specification.xmlroot
47 local attribute = specification.attribute
48 if context then
49 local xmlpattern = pattern
50 if not find(xmlpattern,"^[%a]+://") then
51 xmlpattern = "xml://" .. pattern
52 end
53 local parsed = xml.lpath(xmlpattern)
54 local titlecommand = specification.title or "type"
55 if parsed.state then
56 context[titlecommand]("pattern: " .. cleaned(pattern) .. " (".. parsed.state .. ")")
57 else
58 context[titlecommand]("pattern: " .. cleaned(pattern))
59 end
60 context.starttabulate({ "|Tr|Tl|Tp|" } )
61 if specification.warning then
62 local comment = parsed.comment
63 if comment then
64 for k=1,#comment do
65 context.NC()
66 context("!")
67 context.NC()
68 context.rlap(comment[k])
69 context.NR()
70 end
71 context.TB()
72 end
73 end
74 for p=1,#parsed do
75 local pp = parsed[p]
76 local kind = pp.kind
77 context.NC()
78 context(p)
79 context.NC()
80 context(kind)
81 context.NC()
82 if kind == "axis" then
83 context(cleaned(pp.axis))
84 elseif kind == "nodes" then
85 context(cleaned(nodesettostring(pp.nodes,pp.nodetest)))
86 elseif kind == "expression" then
87
88 context(cleaned(pp.expression))
89 elseif kind == "finalizer" then
90 context("%s(%s)",pp.name,pp.arguments)
91 elseif kind == "error" and pp.eqrror then
92 context(pp.error)
93 end
94 context.NC()
95 context.NR()
96 end
97 context.stoptabulate()
98 if xmlroot and xmlroot ~= "" then
99 if not loaded[xmlroot] then
100 loaded[xmlroot] = xml.convert(buffers.getcontent(xmlroot))
101 end
102 local collected = xml.filter(loaded[xmlroot],xmlpattern)
103 if collected then
104 local tc = type(collected)
105 if not tc then
106
107 else
108 context.blank()
109 context.type("result : ")
110 if tc == "string" then
111 context.type(collected)
112 elseif tc == "table" then
113 if collected.tg then
114 collected = { collected }
115 end
116 for c=1,#collected do
117 local cc = collected[c]
118 if attribute and attribute ~= "" then
119 local ccat = cc.at
120 local a = ccat and ccat[attribute]
121 if a and a ~= "" then
122 context.type(a)
123 context.type(">")
124 end
125 end
126 local ccns = cc.ns
127 if ccns == "" then
128 context.type(cc.tg)
129 else
130 context.type(ccns .. ":" .. cc.tg)
131 end
132 context.space()
133 end
134 else
135 context.type(tostring(tc))
136 end
137 context.blank()
138 end
139 end
140 end
141 end
142end
143 |