diff options
author | Taco Hoekwater <taco@elvenkind.com> | 2008-06-12 10:42:53 +0000 |
---|---|---|
committer | Taco Hoekwater <taco@elvenkind.com> | 2008-06-12 10:42:53 +0000 |
commit | 0d01365d53c456d246da0ca1f0b3cd9868f02b35 (patch) | |
tree | 01a655c8028e17cfb371456b299c1848fe08c05b /Master/texmf-dist/tex/context/base/x-cals.mkiv | |
parent | 44f3714442da07fdfc36a7f2a8dcd5d4294c5d26 (diff) |
ConTeXt release 2008.05.21
git-svn-id: svn://tug.org/texlive/trunk@8691 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/context/base/x-cals.mkiv')
-rw-r--r-- | Master/texmf-dist/tex/context/base/x-cals.mkiv | 178 |
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 |