summaryrefslogtreecommitdiff
path: root/tex/context/base/x-ct.mkiv
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/x-ct.mkiv')
-rw-r--r--tex/context/base/x-ct.mkiv202
1 files changed, 202 insertions, 0 deletions
diff --git a/tex/context/base/x-ct.mkiv b/tex/context/base/x-ct.mkiv
new file mode 100644
index 000000000..cf7bb64fb
--- /dev/null
+++ b/tex/context/base/x-ct.mkiv
@@ -0,0 +1,202 @@
+%D \module
+%D [ file=x-cals,
+%D version=2007.09.05,
+%D title=\CONTEXT\ XML Modules,
+%D subtitle=\CONTEXT\ Structures,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{Context XML Macros (context)}
+
+\startluacode
+do
+ lxml.context = { }
+
+ local halignments = {
+ left = 'l',
+ flushleft = 'l',
+ right = 'r',
+ flushright = 'r',
+ center = 'c',
+ middle = 'c',
+ centre = 'c',
+ justify = '',
+ }
+
+ local texsprint = tex.sprint
+ local xmlsprint = xml.sprint
+
+ local function roottemplate(root)
+ local rt = root.at.template
+ if rt then
+ if not rt:find("|") then
+ rt = rt:gsub(",","|")
+ end
+ if not rt:find("^|") then rt = "|" .. rt end
+ if not rt:find("|$") then rt = rt .. "|" end
+ end
+ return rt
+ end
+
+ local function specifiedtemplate(root,templatespec)
+ local template = { }
+ for r, d, k in xml.elements(root,templatespec) do
+ local at = d[k].at
+ local tm = halignments[at.align] or ""
+ if toboolean(at.paragraph) then
+ tm = tm .. "p"
+ end
+ template[#template+1] = tm
+ end
+ if #template > 0 then
+ return "|" .. table.join(template,"|") .. "|"
+ else
+ return nil
+ end
+ end
+
+ local function autotemplate(root,rowspec,cellspec)
+ local max = 0
+ for r, d, k in xml.elements(root,rowspec) do
+ local n = xml.count(d[k],cellspec)
+ if n > max then max = n end
+ end
+ if max == 2 then
+ return "|l|p|"
+ elseif max > 0 then
+ return "|" .. string.rep("p|",max)
+ else
+ return nil
+ end
+ end
+
+ local defaulttemplate = "|l|p|"
+
+ function lxml.context.tabulate(root,namespace)
+ if not root then
+ return
+ else
+ root = lxml.id(root)
+ end
+
+ local prefix = (namespace or "context") .. ":"
+
+ local templatespec = "/" .. prefix .. "template" .. "/" .. prefix .. "column"
+ local bodyrowspec = "/" .. prefix .. "body" .. "/" .. prefix .. "row"
+ local cellspec = "/" .. prefix .. "cell"
+
+ local template =
+ roottemplate (root) or
+ specifiedtemplate (root,templatespec) or
+ autotemplate (root,bodyrowspec,cellspec) or
+ defaulttemplate
+
+ lxml.directives.before(root,'cdx')
+ texsprint(tex.ctxcatcodes, "\\bgroup")
+ lxml.directives.setup(root,'cdx')
+ -- todo: head and foot
+ texsprint(tex.ctxcatcodes, string.format("\\starttabulate[%s]",template))
+ for r, d, k in xml.elements(root,bodyrowspec) do
+ texsprint(tex.ctxcatcodes, "\\NC ")
+ for r, d, k in xml.elements(d[k],cellspec) do
+ texsprint(xml.content(d[k]))
+ texsprint(tex.ctxcatcodes, "\\NC")
+ end
+ texsprint(tex.ctxcatcodes, "\\NR")
+ end
+ texsprint(tex.ctxcatcodes, "\\stoptabulate")
+ texsprint(tex.ctxcatcodes, "\\egroup")
+ lxml.directives.after(root,'cdx')
+
+ end
+
+ function lxml.context.combination(root,namespace)
+
+ if not root then
+ return
+ else
+ root = lxml.id(root)
+ end
+
+ local prefix = (namespace or "context") .. ":"
+
+ local pairspec = "/" .. prefix .. "pair"
+ local contentspec = "/" .. prefix .. "content" .. "/text()"
+ local captionspec = "/" .. prefix .. "caption" .. "/text()"
+
+ local nx, ny = root.at.nx, root.at.ny
+
+ if not (nx or ny) then
+ nx = xml.count(root,pairspec) or 2
+ end
+ local template = string.format("%s*%s", nx or 1, ny or 1)
+
+ lxml.directives.before(root,'cdx')
+ texsprint(tex.ctxcatcodes, "\\bgroup")
+ lxml.directives.setup(root,'cdx')
+ -- todo: alignments
+ texsprint(tex.ctxcatcodes, string.format("\\startcombination[%s]",template))
+ for r, d, k in xml.elements(root,pairspec) do
+ local dk = d[k]
+ texsprint(tex.ctxcatcodes,"{")
+ xmlsprint(xml.filter(dk,contentspec) or "")
+ texsprint(tex.ctxcatcodes,"}")
+ texsprint(tex.ctxcatcodes,"{")
+ xmlsprint(xml.filter(dk,captionspec) or "")
+ texsprint(tex.ctxcatcodes,"}")
+ end
+ texsprint(tex.ctxcatcodes, "\\stopcombination")
+ texsprint(tex.ctxcatcodes, "\\egroup")
+ lxml.directives.after(root,'cdx')
+
+ end
+
+end
+\stopluacode
+
+\startxmlsetups xml:context:process
+ \xmlsetfunction {\xmldocument} {context:tabulate} {lxml.context.tabulate}
+ \xmlsetfunction {\xmldocument} {context:combination} {lxml.context.combination}
+\stopxmlsetups
+
+\xmlregistersetup{xml:context:process}
+
+\xmlregisterns{context}{context}
+
+\endinput
+
+% this replaces:
+
+% \startxmlsetups tabulate
+% \starttabulate[||p|]
+% \xmlall{#1}{/body/row}
+% \stoptabulate
+% \stopxmlsetups
+% \startxmlsetups tabulate:row
+% \NC \xmlall{#1}{/cell} \NR
+% \stopxmlsetups
+% \startxmlsetups tabulate:cell
+% \xmlflush{#1} \NC
+% \stopxmlsetups
+
+% \startxmlsetups combination
+% \startcollecting
+% \startcollect
+% \startcombination[\xmlatt{#1}{nx}*\xmlatt{#1}{ny}]
+% \stopcollect
+% \xmlloop {#1} {combiblock} {
+% \startcollect
+% {\xmli{/content}{##1}}
+% {\xmli{/caption}{##1}}
+% \stopcollect
+% }
+% \startcollect
+% \stopcombination
+% \stopcollect
+% \stopcollecting
+% \stopxmlsetups