summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/context/base/x-cals.mkiv
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/context/base/x-cals.mkiv')
-rw-r--r--Master/texmf-dist/tex/context/base/x-cals.mkiv178
1 files changed, 178 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/context/base/x-cals.mkiv b/Master/texmf-dist/tex/context/base/x-cals.mkiv
new file mode 100644
index 00000000000..314ec5bb9c8
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/x-cals.mkiv
@@ -0,0 +1,178 @@
+%D \module
+%D [ file=x-cals,
+%D version=2007.09.05,
+%D title=\CONTEXT\ XML Modules,
+%D subtitle=Cals table renderer,
+%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 (cals tables)}
+
+\startluacode
+do
+
+ lxml.cals = { }
+ lxml.cals.ignore_widths = false
+
+ local format = string.format
+ local texsprint = tex.sprint
+ local xmlsprint = xml.sprint
+ local xmlcprint = xml.cprint
+
+ local halignments = {
+ left = "flushleft",
+ right = "flushright",
+ center = "middle",
+ centre = "middle",
+ justify = "normal",
+ }
+
+ local valignments = {
+ top = "high",
+ bottom = "low",
+ middle = "lohi",
+ }
+
+ local function getspecs(root, pattern, names, widths)
+ local ignore_widths = lxml.cals.ignore_widths
+ for r, d, k in xml.elements(root,pattern) do
+ local dk = d[k]
+ local at = dk.at
+ local column = at.colnum
+ if column then
+ if not ignore_widths then
+ local width = at.colwidth
+ if width then
+ widths[tonumber(column)] = width:lower()
+ end
+ end
+ local name = at.colname
+ if name then
+ names[name] = tonumber(column)
+ end
+ end
+ end
+ end
+
+ local function getspans(root, pattern, names, spans)
+ for r, d, k in xml.elements(root,pattern) do
+ local dk = d[k]
+ local at = dk.at
+ local name, namest, nameend = at.colname, names[at.namest or "?"], names[at.nameend or "?"]
+ if name and namest and nameend then
+ spans[name] = tonumber(nameend) - tonumber(namest) + 1
+ end
+ end
+ end
+
+ --local function texsprint(a,b) print(b) end
+ --local function xmlsprint(a) print(a) end
+
+ function lxml.cals.table(root,namespace)
+
+ local prefix = (namespace or "cals") .. ":"
+ local p = "/" .. prefix
+
+ local tgroupspec = p .. "tgroup"
+ local colspec = p .. "colspec"
+ local spanspec = p .. "spanspec"
+ local hcolspec = p .. "thead" .. p .. "colspec"
+ local bcolspec = p .. "tbody" .. p .. "colspec"
+ local fcolspec = p .. "tfoot" .. p .. "colspec"
+ local entryspec = p .. "entry" .. "|" ..prefix .. "entrytbl"
+ local hrowspec = p .. "thead" .. p .. "row"
+ local browspec = p .. "tbody" .. p .. "row"
+ local frowspec = p .. "tfoot" .. p .. "row"
+
+ local function tablepart(root, xcolspec, xrowspec, before, after)
+ texsprint(tex.ctxcatcodes,before)
+ local at = root.at
+ local pphalign, ppvalign = at.align, at.valign
+ local names, widths, spans = { }, { }, { }
+ getspecs(root, colspec , names, widths)
+ getspecs(root, xcolspec, names, widths)
+ getspans(root, spanspec, names, spans)
+ for r, d, k in xml.elements(root,xrowspec) do
+ texsprint(tex.ctxcatcodes,"\\bTR")
+ local dk = d[k]
+ local at = dk.at
+ local phalign, pvalign = at.align or pphalign, at.valign or ppvalign -- todo: __p__ test
+ local col = 1
+ for rr, dd, kk in xml.elements(dk,entryspec) do
+ local dk = dd[kk]
+ if dk.tg == "entrytbl" then
+ texsprint(tex.ctxcatcodes,"\\bTD{")
+ lxml.cals.table(dk)
+ texsprint(tex.ctxcatcodes,"}\\eTD")
+ col = col + 1
+ else
+ local at = dk.at
+ local b, e, s, m = names[at.namest or "?"], names[at.nameend or "?"], spans[at.spanname or "?"], at.morerows
+ local halign, valign = at.align or phalign, at.valign or pvalign
+ if b and e then
+ s = e - b + 1
+ end
+ if halign then
+ halign = halignments[halign]
+ end
+ if valign then
+ valign = valignments[valign]
+ end
+ local width = widths[col]
+ if s or m or halign or valign or width then -- only english interface !
+ texsprint(tex.ctxcatcodes,format("\\bTD[nx=%s,ny=%s,align={%s,%s},width=%s]",
+ s or 1, (m or 0)+1, halign or "flushleft", valign or "high", width or "fit"))
+ else
+ texsprint(tex.ctxcatcodes,"\\bTD[align={flushleft,high},width=fit]") -- else problems with vertical material
+ end
+ -- xmlsprint(dk)
+ xmlcprint(dk)
+ texsprint(tex.ctxcatcodes,"\\eTD")
+ col = col + (s or 1)
+ end
+ end
+ texsprint(tex.ctxcatcodes,"\\eTR")
+ end
+ texsprint(tex.ctxcatcodes,after)
+ end
+
+ for r, d, k in xml.elements(lxml.id(root),tgroupspec) do
+ local tgroup = d[k]
+ lxml.directives.before(root,"cdx") -- "cals:table"
+ texsprint(tex.ctxcatcodes, "\\bgroup")
+ lxml.directives.setup(root,"cdx") -- "cals:table"
+ texsprint(tex.ctxcatcodes, "\\bTABLE")
+ tablepart(tgroup, hcolspec, hrowspec, "\\bTABLEhead", "\\eTABLEhead")
+ tablepart(tgroup, bcolspec, browspec, "\\bTABLEbody", "\\eTABLEbody")
+ tablepart(tgroup, fcolspec, frowspec, "\\bTABLEfoot", "\\eTABLEfoot")
+ texsprint(tex.ctxcatcodes, "\\eTABLE")
+ texsprint(tex.ctxcatcodes, "\\egroup")
+ lxml.directives.after(root,"cdx") -- "cals:table"
+ end
+ end
+
+end
+\stopluacode
+
+% \startxmlsetups xml:cals:process
+% \xmlsetsetup {\xmldocument} {cals:table} {*}
+% \stopxmlsetups
+% \startxmlsetups cals:table
+% \ctxlua{lxml.cals.table("#1")}
+% \stopxmlsetups
+% \xmlregistersetup{xml:cals:process}
+
+\startxmlsetups xml:cals:process
+ \xmlsetfunction {\xmldocument} {cals:table} {lxml.cals.table}
+\stopxmlsetups
+
+\xmlregistersetup{xml:cals:process}
+
+\xmlregisterns{cals}{cals}
+
+\endinput