summaryrefslogtreecommitdiff
path: root/tex
diff options
context:
space:
mode:
Diffstat (limited to 'tex')
-rw-r--r--tex/context/base/back-exp.lua908
-rw-r--r--tex/context/base/back-exp.mkiv51
-rw-r--r--tex/context/base/cont-new.mkii2
-rw-r--r--tex/context/base/cont-new.mkiv2
-rw-r--r--tex/context/base/context.mkii2
-rw-r--r--tex/context/base/context.mkiv4
-rw-r--r--tex/context/base/core-mis.mkiv37
-rw-r--r--tex/context/base/core-sys.mkiv105
-rw-r--r--tex/context/base/export-example.css32
-rw-r--r--tex/context/base/export-example.rng23
-rw-r--r--tex/context/base/export-example.tex36
-rw-r--r--tex/context/base/font-ctx.lua7
-rw-r--r--tex/context/base/font-ini.mkiv2
-rw-r--r--tex/context/base/grph-fig.mkiv3
-rw-r--r--tex/context/base/grph-inc.lua13
-rw-r--r--tex/context/base/l-table.lua19
-rw-r--r--tex/context/base/lang-def.lua9
-rw-r--r--tex/context/base/lang-def.mkiv7
-rw-r--r--tex/context/base/lang-ini.mkiv2
-rw-r--r--tex/context/base/lxml-css.lua (renamed from tex/context/base/x-css.lua)63
-rw-r--r--tex/context/base/lxml-css.mkiv (renamed from tex/context/base/x-css.mkiv)4
-rw-r--r--tex/context/base/mult-sys.mkiv1
-rw-r--r--tex/context/base/node-aux.lua18
-rw-r--r--tex/context/base/status-files.pdfbin23626 -> 23636 bytes
-rw-r--r--tex/context/base/status-lua.pdfbin155960 -> 156367 bytes
-rw-r--r--tex/context/base/strc-des.mkiv4
-rw-r--r--tex/context/base/strc-flt.mkiv8
-rw-r--r--tex/context/base/strc-itm.mkiv6
-rw-r--r--tex/context/base/strc-not.mkiv2
-rw-r--r--tex/context/base/strc-ren.mkiv21
-rw-r--r--tex/context/base/strc-sec.mkiv2
-rw-r--r--tex/context/base/strc-syn.mkiv8
-rw-r--r--tex/context/base/strc-tag.lua25
-rw-r--r--tex/context/base/strc-tag.mkiv6
-rw-r--r--tex/context/base/tabl-ntb.mkiv21
-rw-r--r--tex/context/base/tabl-tbl.mkiv52
-rw-r--r--tex/context/base/x-udhr.mkiv98
-rw-r--r--tex/generic/context/luatex-fonts-enc.lua2
-rw-r--r--tex/generic/context/luatex-fonts-merged.lua23
39 files changed, 951 insertions, 677 deletions
diff --git a/tex/context/base/back-exp.lua b/tex/context/base/back-exp.lua
index 2aaa0cf39..2f1377e98 100644
--- a/tex/context/base/back-exp.lua
+++ b/tex/context/base/back-exp.lua
@@ -6,49 +6,18 @@ if not modules then modules = { } end modules ['back-exp'] = {
license = "see context related readme files"
}
--- depth can go away (autodepth nu)
-
-
-- language -> only mainlanguage, local languages should happen through start/stoplanguage
-- tocs/registers -> maybe add a stripper (i.e. just don't flush entries in final tree)
+-- footnotes -> css 3
+-- bodyfont -> in styles.css
+-- delimited -> left/right string (needs marking)
+-- depth -> can go away (autodepth now and not used)
-- Because we need to look ahead we now always build a tree (this was optional in
-- the beginning). The extra overhead in the frontend is neglectable.
-
--- We can consider replacing attributes by the hash entry ... slower
--- in resolving but it's still quite okay.
-
--- todo: less attributes e.g. internal only first node
--- todo: build xml tree in mem (handy for cleaning)
-
--- delimited: left/right string (needs marking)
-
--- we can optimize the code ... currently the overhead is some 10% for xml + html
-
--- option: pack strings each page so that we save memory
-
-local nodecodes = nodes.nodecodes
-local traverse_nodes = node.traverse
-local hlist_code = nodecodes.hlist
-local vlist_code = nodecodes.vlist
-
-local function locate(start,wantedid,wantedsubtype)
- for n in traverse_nodes(start) do
- local id = n.id
- if id == wantedid then
- if not wantedsubtype or n.subtype == wantedsubtype then
- return n
- end
- elseif id == hlist_code or id == vlist_code then
- local found = locate(n.list,wantedid,wantedsubtype)
- if found then
- return found
- end
- end
- end
-end
-
-nodes.locate = locate
+--
+-- We can optimize the code ... currently the overhead is some 10% for xml + html so
+-- there is no hurry.
local next, type = next, type
local format, match, concat, rep, sub, gsub, gmatch, find = string.format, string.match, table.concat, string.rep, string.sub, string.gsub, string.gmatch, string.find
@@ -104,19 +73,8 @@ local a_characters = attributes.private('characters')
local a_exportstatus = attributes.private('exportstatus')
local a_tagged = attributes.private('tagged')
-local a_image = attributes.private('image')
-
-local a_taggedalign = attributes.private("taggedalign")
-local a_taggedcolumns = attributes.private("taggedcolumns")
-local a_taggedrows = attributes.private("taggedrows")
local a_taggedpar = attributes.private("taggedpar")
-local a_taggedpacked = attributes.private("taggedpacked")
-local a_taggedsymbol = attributes.private("taggedsymbol")
-local a_taggedinsert = attributes.private("taggedinsert")
-local a_taggedtag = attributes.private("taggedtag")
-local a_mathcategory = attributes.private("mathcategory")
-local a_mathmode = attributes.private("mathmode")
-
+local a_image = attributes.private('image')
local a_reference = attributes.private('reference')
local a_textblock = attributes.private("textblock")
@@ -137,13 +95,14 @@ local properties = structurestags.properties
local userdata = structurestags.userdata -- might be combines with taglist
local tagdata = structurestags.data
local tagmetadata = structurestags.metadata
+local detailedtag = structurestags.detailedtag
local starttiming = statistics.starttiming
local stoptiming = statistics.stoptiming
-- todo: more locals (and optimize)
-local exportversion = "0.22"
+local exportversion = "0.30"
local nofcurrentcontent = 0 -- so we don't free (less garbage collection)
local currentcontent = { }
@@ -170,6 +129,7 @@ local treeroot = tree
local treehash = { }
local extras = { }
local checks = { }
+local finalizers = { }
local nofbreaks = 0
local used = { }
local exporting = false
@@ -271,7 +231,7 @@ setmetatableindex(spaces, function(t,k)
return s
end)
-function structurestags.setattributehash(fulltag,key,value)
+function structurestags.setattributehash(fulltag,key,value) -- public hash
if type(fulltag) == "number" then
fulltag = taglist[fulltag]
if fulltag then
@@ -288,6 +248,75 @@ function structurestags.setattributehash(fulltag,key,value)
end
end
+
+-- experiment: styles and images
+
+local usedstyles = { }
+
+local styletemplate = [[
+%s[detail='%s'] {
+ font-style : %s ;
+ font-variant : %s ;
+ font-weight : %s ;
+ color : %s ;
+}]]
+
+local function allusedstyles(xmlfile)
+ local result = { format("/* styles for file %s */",xmlfile) }
+ for element, details in table.sortedpairs(usedstyles) do
+ for detail, data in table.sortedpairs(details) do
+ local s = xml.css.fontspecification(data.style)
+ local c = xml.css.colorspecification(data.color)
+ result[#result+1] = format(styletemplate,element,detail,
+ s.style or "inherit",s.variant or "inherit",s.weight or "inherit",c or "inherit")
+ end
+ end
+ return concat(result,"\n\n")
+end
+
+local usedimages = { }
+
+local imagetemplate = [[
+%s[id="%s"] {
+ display : block ;
+ background-image : url(%s) ;
+ background-size : 100%% auto ;
+ width : %s ;
+ height : %s ;
+}]]
+
+local function allusedimages(xmlfile)
+ local result = { format("/* images for file %s */",xmlfile) }
+ for element, details in table.sortedpairs(usedimages) do
+ for detail, data in table.sortedpairs(details) do
+ local name = data.name
+ if file.extname(name) == "pdf" then
+ -- temp hack .. we will have a remapper
+ name = file.replacesuffix(name,"svg")
+ end
+ result[#result+1] = format(imagetemplate,element,detail,name,data.width,data.height)
+ end
+ end
+ return concat(result,"\n\n")
+end
+
+local function uniqueusedimages()
+ local unique = { }
+ for element, details in next, usedimages do
+ for detail, data in next, details do
+ local name = data.name
+ if file.extname(name) == "pdf" then
+ unique[file.replacesuffix(name,"svg")] = name
+ else
+ unique[name] = name
+ end
+ end
+ end
+ return unique
+end
+
+--
+
properties.vspace = { export = "break", nature = "display" }
----------------- = { export = "pagebreak", nature = "display" }
@@ -361,144 +390,142 @@ function extras.document(result,element,detail,n,fulltag,di)
checkdocument(di)
end
-local snames, snumbers = { }, { }
+local itemgroups = { }
-function structurestags.setitemgroup(packed,symbol,di)
- local s = snumbers[symbol]
- if not s then
- s = #snames + 1
- snames[s], snumbers[symbol] = symbol, s
+function structurestags.setitemgroup(current,packed,symbol)
+ itemgroups[detailedtag("itemgroup",current)] = {
+ packed = packed,
+ symbol = symbol,
+ }
+end
+
+function extras.itemgroup(result,element,detail,n,fulltag,di)
+ local hash = itemgroups[fulltag]
+ if hash then
+ local v = hash.packed
+ if v then
+ result[#result+1] = " packed='yes'"
+ end
+ local v = hash.symbol
+ if v then
+ result[#result+1] = format(" symbol='%s'",v)
+ end
end
- texattribute[a_taggedpacked] = packed and 1 or unsetvalue
- texattribute[a_taggedsymbol] = s
end
--- todo: per class
+local synonyms = { }
-local synonymnames, synonymnumbers = { }, { } -- can be one hash
+function structurestags.setsynonym(current,tag)
+ synonyms[detailedtag("synonym",current)] = tag
+end
-function structurestags.setsynonym(class,tag)
- local s = synonymnumbers[tag]
- if not s then
- s = #synonymnames + 1
- synonymnames[s], synonymnumbers[tag] = tag, s
+function extras.synonym(result,element,detail,n,fulltag,di)
+ local tag = synonyms[fulltag]
+ if tag then
+ result[#result+1] = format(" tag='%s'",tag)
end
- texattribute[a_taggedtag] = s
end
-local sortingnames, sortingnumbers = { }, { } -- can be one hash
+local sortings = { }
+
+function structurestags.setsorting(current,tag)
+ sortings[detailedtag("sorting",current)] = tag
+end
-function structurestags.setsorting(class,tag)
- local s = sortingnumbers[tag]
- if not s then
- s = #sortingnames + 1
- sortingnames[s], sortingnumbers[tag] = tag, s
+function extras.sorting(result,element,detail,n,fulltag,di)
+ local tag = sortings[fulltag]
+ if tag then
+ result[#result+1] = format(" tag='%s'",tag)
end
- texattribute[a_taggedtag] = s
end
-local insertids = { }
+usedstyles.highlight = { }
+
+function structurestags.sethighlight(current,style,color) -- we assume global styles
+ usedstyles.highlight[current] = {
+ style = style, -- xml.css.fontspecification(style),
+ color = color, -- xml.css.colorspec(color),
+ }
+end
+
+local descriptions = { }
+local symbols = { }
+local linked = { }
-function structurestags.setdescriptionid(tag,n)
+function structurestags.setdescription(tag,n)
local nd = structures.notes.get(tag,n) -- todo: use listdata instead
if nd then
- local r = nd.references
- texattribute[a_taggedinsert] = r.internal or unsetvalue
- else
- texattribute[a_taggedinsert] = unsetvalue
+ local references = nd.references
+ descriptions[references and references.internal] = detailedtag("description",tag)
end
end
-function extras.descriptiontag(result,element,detail,n,fulltag,di)
- local hash = attributehash[fulltag]
- if hash then
- local v = hash.insert
- v = v and insertids[v]
- if v then
- result[#result+1] = format(" insert='%s'",v)
- end
+function structurestags.setdescriptionsymbol(tag,n)
+ local nd = structures.notes.get(tag,n) -- todo: use listdata instead
+ if nd then
+ local references = nd.references
+ symbols[references and references.internal] = detailedtag("descriptionsymbol",tag)
end
end
-function extras.descriptionsymbol(result,element,detail,n,fulltag,di)
- local hash = attributehash[fulltag]
- if hash then
- local v = hash.insert
- v = v and insertids[v]
- if v then
- result[#result+1] = format(" insert='%s'",v)
+function finalizers.descriptions(tree)
+ local n = 0
+ for id, tag in next, descriptions do
+ local sym = symbols[id]
+ if sym then
+ n = n + 1
+ linked[tag] = n
+ linked[sym] = n
end
end
end
-function extras.synonym(result,element,detail,n,fulltag,di)
- local hash = attributehash[fulltag]
- if hash then
- local v = hash.tag
- v = v and synonymnames[v]
- if v then
- result[#result+1] = format(" tag='%s'",v)
- end
+function extras.description(result,element,detail,n,fulltag,di)
+ local id = linked[fulltag]
+ if id then
+ result[#result+1] = format(" insert='%s'",id) -- maybe just fulltag
end
end
-function extras.sorting(result,element,detail,n,fulltag,di)
- local hash = attributehash[fulltag]
- if hash then
- local v = hash.tag
- v = v and sortingnames[v]
- if v then
- result[#result+1] = format(" tag='%s'",v)
- end
+function extras.descriptionsymbol(result,element,detail,n,fulltag,di)
+ local id = linked[fulltag]
+ if id then
+ result[#result+1] = format(" insert='%s'",id)
end
end
-local usedimages = { }
+usedimages.image = { }
+
+function structurestags.setfigure(name,page,width,height)
+ usedimages.image[detailedtag("image")] = {
+ name = name,
+ page = page,
+ width = number.todimen(width,"cm","%0.3fcm"),
+ height = number.todimen(height,"cm","%0.3fcm"),
+ }
+end
function extras.image(result,element,detail,n,fulltag,di)
- local hash = attributehash[fulltag]
- if hash then
- local v = hash.imageindex
- if v then
- local figure = img.ofindex(v)
- if figure then
- local fullname = figure.filepath
- local name = file.basename(fullname)
- local path = file.dirname(fullname)
- local page = figure.page or 1
- local width = figure.width or 0
- local height = figure.height or 0
- local currentimage = { }
- if name ~= "" then
- result[#result+1] = format(" name='%s'",name)
- currentimage.name = name
- if file.extname(name) == "pdf" then
- -- temp hack .. we will have a remapper
- name = file.replacesuffix(name,"svg")
- end
- currentimage.filename = name
- end
- if path ~= "" then
- result[#result+1] = format(" path='%s'",path)
- currentimage.path = path
- end
- if page > 1 then
- result[#result+1] = format(" page='%s'",page)
- currentimage.page = page
- end
- if width > 0 then
- width = number.todimen(width,"cm","%0.3fcm")
- result[#result+1] = format(" width='%s'",width)
- currentimage.width = width
- end
- if height > 0 then
- height = number.todimen(height,"cm","%0.3fcm")
- result[#result+1] = format(" ysize='%s'",height)
- currentimage.height = height
- end
- usedimages[#usedimages+1] = currentimage
- end
- end
+ local data = usedimages.image[fulltag]
+ if data then
+ result[#result+1] = format(" id='%s' name='%s' page='%s' width='%s' height='%s'",
+ fulltag,data.name,data.page,data.width,data.height)
+ end
+end
+
+local combinations = { }
+
+function structurestags.setcombination(nx,ny)
+ combinations[detailedtag("combination")] = {
+ nx = nx,
+ ny = ny,
+ }
+end
+
+function extras.combination(result,element,detail,n,fulltag,di)
+ local data = combinations[fulltag]
+ if data then
+ result[#result+1] = format(" nx='%s' ny='%s'",data.nx,data.ny)
end
end
@@ -575,6 +602,8 @@ function specials.internal(result,var)
end
end
+local referencehash = { }
+
local function adddestination(result,references) -- todo: specials -> exporters and then concat
if references then
local reference = references.reference
@@ -614,12 +643,9 @@ end
function extras.link(result,element,detail,n,fulltag,di)
-- for instance in lists a link has nested elements and no own text
- local hash = attributehash[fulltag]
- if hash then
- local references = hash.reference
- if references then
- adddestination(result,structures.references.get(references))
- end
+ local reference = referencehash[fulltag]
+ if reference then
+ adddestination(result,structures.references.get(reference))
return true
else
local data = di.data
@@ -1006,41 +1032,29 @@ function extras.float(result,element,detail,n,fulltag,di)
end
end
-function extras.itemgroup(result,element,detail,n,fulltag,di)
- local data = di.data
- if data then
- for i=1,#data do
- local di = data[i]
- if type(di) == "table" and di.tg == "item" then
- local ddata = di.data
- for i=1,#ddata do
- local ddi = ddata[i]
- if type(ddi) == "table" then
- local tg = ddi.tg
- if tg == "itemtag" or tg == "itemcontent" then
- local hash = attributehash[ddi.fulltag]
- if hash then
- local v = hash.packed
- if v and v == 1 then
- result[#result+1] = " packed='yes'"
- end
- local v = hash.symbol
- if v then
- result[#result+1] = format(" symbol='%s'",snames[v])
- end
- return
- end
- end
- end
- end
- end
- end
+local tabledata = { }
+
+function structurestags.settablecell(rows,columns,align)
+ if align > 0 or rows > 1 or columns > 1 then
+ tabledata[detailedtag("tablecell")] = {
+ rows = rows,
+ columns = columns,
+ align = align,
+ }
end
end
function extras.tablecell(result,element,detail,n,fulltag,di)
- local hash = attributehash[fulltag]
+ local hash = tabledata[fulltag]
if hash then
+ local v = hash.columns
+ if v and v > 1 then
+ result[#result+1] = format(" columns='%s'",v)
+ end
+ local v = hash.rows
+ if v and v > 1 then
+ result[#result+1] = format(" rows='%s'",v)
+ end
local v = hash.align
if not v or v == 0 then
-- normal
@@ -1051,29 +1065,52 @@ function extras.tablecell(result,element,detail,n,fulltag,di)
elseif v == 3 then
result[#result+1] = " align='flushleft'"
end
- local v = hash.columns
- if v and v > 1 then
- result[#result+1] = format(" columns='%s'",v)
- end
- local v = hash.rows
- if v and v > 1 then
- result[#result+1] = format(" rows='%s'",v)
+ end
+end
+
+local tabulatedata = { }
+
+function structurestags.settabulatecell(align)
+ if align > 0 then
+ tabulatedata[detailedtag("tabulatecell")] = {
+ align = align,
+ }
+ end
+end
+
+function extras.tabulate(result,element,detail,n,fulltag,di)
+ local data = di.data
+ for i=1,#data do
+ local di = data[i]
+ if di.tg == "tabulaterow" then
+ local did = di.data
+ local content = false
+ for i=1,#did do
+ local d = did[i].data
+ if d and #d > 0 then
+ content = true
+ break
+ end
+ end
+ if not content then
+ di.element = "" -- or simply remove
+ end
end
end
end
function extras.tabulatecell(result,element,detail,n,fulltag,di)
- local hash = attributehash[fulltag]
+ local hash = tabulatedata[fulltag]
if hash then
local v = hash.align
if not v or v == 0 then
-- normal
elseif v == 1 then
- result[#result+1] = " align='flushright'"
+ result[#result+1] = " align='flushleft'"
elseif v == 2 then
- result[#result+1] = " align='middle'"
+ result[#result+1] = " align='flushright'"
elseif v == 3 then
- result[#result+1] = " align='flushleft'"
+ result[#result+1] = " align='middle'"
end
end
end
@@ -1112,7 +1149,6 @@ end
local function begintag(result,element,nature,depth,di,skip)
-- if needed we can use a local result with xresult
---~ local result = { }
local detail = di.detail
local n = di.n
local fulltag = di.fulltag
@@ -1196,17 +1232,9 @@ local function begintag(result,element,nature,depth,di,skip)
result[#result+1] = "\n"
linedone = true
end
---~ xresult[#xresult+1] = concat(result)
used[element][detail or ""] = nature -- for template css
local metadata = tagmetadata[fulltag]
if metadata then
- -- metadata = table.toxml(metadata,"metadata",true,depth*2,2) -- nobanner
- -- if not linedone then
- -- result[#result+1] = format("\n%s\n",metadata)
- -- linedone = true
- -- else
- -- result[#result+1] = format("%s\n",metadata)
- -- end
if not linedone then
result[#result+1] = "\n"
linedone = true
@@ -1346,122 +1374,8 @@ local function breaktree(tree,parent,parentelement) -- also removes double break
end
end
--- finalizers
-
-local function checkinserts(data)
- local nofinserts = 0
- for i=1,#data do
- local di = data[i]
- if type(di) == "table" then -- id ~= false
- if di.element == "descriptionsymbol" then
- local hash = attributehash[di.fulltag]
- if hash then
- local i = hash.insert
- if i then
- nofinserts = nofinserts + 1
- insertids[i] = nofinserts
- end
- else
- -- something is wrong
- end
- end
- local d = di.data
- if d then
- checkinserts(d)
- end
- end
- end
-end
-
-- tabulaterow reconstruction .. can better be a checker (TO BE CHECKED)
---~ local function xcollapsetree() -- unwanted space injection
---~ for tag, trees in next, treehash do
---~ local d = trees[1].data
---~ if d then
---~ local nd = #d
---~ if nd > 0 then
---~ for i=2,#trees do
---~ local currenttree = trees[i]
---~ local currentdata = currenttree.data
---~ local previouspar = trees[i-1].parnumber
---~ currenttree.collapsed = true
---~ if previouspar == 0 or type(currentdata[1]) ~= "string" then
---~ previouspar = nil -- no need anyway so no further testing needed
---~ end
---~ local done = false
---~ local breakdone = false
---~ local spacedone = false
---~ for j=1,#currentdata do
---~ local cd = currentdata[j]
---~ if not cd then
---~ -- skip
---~ elseif type(cd) == "string" then
---~ if cd == "" then
---~ -- skip
---~ elseif cd == " " then
---~ -- done check ?
---~ if not spacedone and not breakdone then
---~ nd = nd + 1
---~ d[nd] = cd
---~ spacedone = true
---~ end
---~ elseif done then
---~ if not spacedone and not breakdone then
---~ nd = nd + 1
---~ d[nd] = " "
---~ spacedone = true
---~ end
---~ nd = nd + 1
---~ d[nd] = cd
---~ else
---~ done = true
---~ local currentpar = d.parnumber
---~ if not currentpar then
---~ if not spacedone and not breakdone then
---~ nd = nd + 1
---~ d[nd] = " " -- brr adds space in unwanted places (like math)
---~ spacedone = true
---~ end
---~ previouspar = nil
---~ elseif not previouspar then
---~ if not spacedone and not breakdone then
---~ nd = nd + 1
---~ d[nd] = " "
---~ spacedone = true
---~ end
---~ previouspar = currentpar
---~ elseif currentpar ~= previouspar then
---~ if not breakdone then
---~ if not spacedone then
---~ nd = nd + 1
---~ end
---~ d[nd] = makebreaknode(currenttree)
---~ breakdone = true
---~ end
---~ previouspar = currentpar
---~ else
---~ spacedone = false
---~ breakdone = false
---~ end
---~ nd = nd + 1
---~ d[nd] = cd
---~ end
---~ else
---~ if cd.tg == "break" then
---~ breakdone = true
---~ end
---~ nd = nd + 1
---~ d[nd] = cd
---~ end
---~ currentdata[j] = false
---~ end
---~ end
---~ end
---~ end
---~ end
---~ end
-
local function collapsetree()
for tag, trees in next, treehash do
local d = trees[1].data
@@ -1506,17 +1420,32 @@ local function collapsetree()
end
end
+local function finalizetree(tree)
+ for _, finalizer in next, finalizers do
+ finalizer(tree)
+ end
+end
+
local function indextree(tree)
local data = tree.data
if data then
+ local n, new = 0, { }
for i=1,#data do
local d = data[i]
- if type(d) == "table" then
- d.__i__ = i
+ if not d then
+ -- skip
+ elseif type(d) == "string" then
+ n = n + 1
+ new[n] = d
+ elseif not d.collapsed then
+ n = n + 1
+ d.__i__ = n
d.__p__ = tree
indextree(d)
+ new[n] = d
end
end
+ tree.data = new
end
end
@@ -1737,7 +1666,7 @@ end
-- whatsit_code localpar_code
-local function collectresults(head,list)
+local function collectresults(head,list) -- is last used (we also have currentattribute)
local p
for n in traverse_nodes(head) do
local id = n.id -- 14: image, 8: literal (mp)
@@ -1763,21 +1692,15 @@ local function collectresults(head,list)
currentparagraph = has_attribute(n,a_taggedpar)
currentnesting = tl
currentattribute = at
- local ah = { -- this includes detail ! -- we can move some to te tex end
- align = has_attribute(n,a_taggedalign ),
- columns = has_attribute(n,a_taggedcolumns),
- rows = has_attribute(n,a_taggedrows ),
- packed = has_attribute(n,a_taggedpacked ),
- symbol = has_attribute(n,a_taggedsymbol ),
- insert = has_attribute(n,a_taggedinsert ),
- reference = has_attribute(n,a_reference ),
- tag = has_attribute(n,a_taggedtag ), -- used for synonyms
- }
- if next(ah) then
- attributehash[tl[#tl]] = ah
- end
last = at
pushentry(currentnesting)
+ -- We need to intercept this here; maybe I will also move this
+ -- to a regular setter at the tex end.
+ local r = has_attribute(n,a_reference)
+ if r then
+ referencehash[tl[#tl]] = r -- fulltag
+ end
+ --
elseif last then
local at = has_attribute(n,a_taggedpar)
if at ~= currentparagraph then
@@ -1848,12 +1771,7 @@ local function collectresults(head,list)
pushcontent()
pushentry(currentnesting) -- ??
end
- local tl = taglist[at]
- local i = locate_node(n,whatsit_code,refximage_code)
- if i then
- attributehash[tl[#tl]] = { imageindex = i.index }
- end
- pushentry(tl) -- has an index, todo: flag empty element
+ pushentry(taglist[at]) -- has an index, todo: flag empty element
if trace_export then
report_export("%s<!-- processing image (tag %s)",spaces[currentdepth],last)
end
@@ -2018,24 +1936,6 @@ function builders.paragraphs.tag(head)
return false
end
--- wrapper
-
-local displaymapping = {
- inline = "inline",
- display = "block",
- mixed = "inline",
-}
-
-local e_template = [[
-%s {
- display: %s ;
-}]]
-
-local d_template = [[
-%s[detail=%s] {
- display: %s ;
-}]]
-
-- encoding='utf-8'
local xmlpreamble = [[
@@ -2045,13 +1945,74 @@ local xmlpreamble = [[
<!-- processing date : %- 17s -->
<!-- context version : %- 17s -->
<!-- exporter version : %- 17s -->
+
]]
-local csspreamble = [[
+local function wholepreamble()
+ return format(xmlpreamble,tex.jobname,os.date(),environment.version,exportversion)
+end
+local csspreamble = [[
<?xml-stylesheet type="text/css" href="%s"?>
]]
+local function allusedstylesheets(xmlfile,cssfiles,files)
+ local result = { }
+ for i=1,#cssfiles do
+ local cssfile = cssfiles[i]
+ if type(cssfile) ~= "string" or cssfile == variables.yes or cssfile == "" or cssfile == xmlfile then
+ cssfile = file.replacesuffix(xmlfile,"css")
+ else
+ cssfile = file.addsuffix(cssfile,"css")
+ end
+ files[#files+1] = cssfile
+ report_export("adding css reference '%s",cssfile)
+ result[#result+1] = format(csspreamble,cssfile)
+ end
+ return concat(result)
+end
+
+local e_template = [[
+%s {
+ display: %s ;
+}]]
+
+local d_template = [[
+%s[detail=%s] {
+ display: %s ;
+}]]
+
+local displaymapping = {
+ inline = "inline",
+ display = "block",
+ mixed = "inline",
+}
+
+local function allusedelements(xmlfile)
+ local result = { format("/* template for file %s */",xmlfile) }
+ for element, details in table.sortedhash(used) do
+ result[#result+1] = format("/* category: %s */",element)
+ for detail, nature in table.sortedhash(details) do
+ local d = displaymapping[nature or "display"] or "block"
+ if detail == "" then
+ result[#result+1] = format(e_template,element,d)
+ else
+ result[#result+1] = format(d_template,element,detail,d)
+ end
+ end
+ end
+ return concat(result,"\n\n")
+end
+
+local function allcontent(tree)
+ local result = { }
+ flushtree(result,tree.data,"display",0) -- we need to collect images
+ result = concat(result)
+ result = gsub(result,"\n *\n","\n")
+ result = gsub(result,"\n +([^< ])","\n%1")
+ return result
+end
+
-- local xhtmlpreamble = [[
-- <!DOCTYPE html PUBLIC
-- "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN"
@@ -2059,14 +2020,35 @@ local csspreamble = [[
-- >
-- ]]
-local imagetemplate = [[
-image[name="%s"] {
- display : block ;
- background-image : url(%s) ;
- background-size : 100%% auto ;
- width : %s ;
- height : %s ;
-}]]
+local function cleanxhtmltree(xmltree)
+ if xmltree then
+ local xmlwrap = xml.wrap
+ for e in xml.collected(xmltree,"/document") do
+ e.at["xmlns:xhtml"] = "http://www.w3.org/1999/xhtml"
+ break
+ end
+ -- todo: inject xhtmlpreamble (xmlns should have be enough)
+ local wrapper = { tg = "a", ns = "xhtml", at = { href = "unknown" } }
+ for e in xml.collected(xmltree,"link") do
+ local location = e.at.location
+ if location then
+ wrapper.at.href = "#" .. gsub(location,":","_")
+ xmlwrap(e,wrapper)
+ end
+ end
+ local wrapper = { tg = "a", ns = "xhtml", at = { name = "unknown" } }
+ for e in xml.collected(xmltree,"!link[@location]") do
+ local location = e.at.location
+ if location then
+ wrapper.at.name = gsub(location,":","_")
+ xmlwrap(e,wrapper)
+ end
+ end
+ return xmltree
+ else
+ return xml.convert("<?xml version='1.0'?>\n<error>invalid xhtml tree</error>")
+ end
+end
local cssfile, xhtmlfile = nil, nil
@@ -2075,136 +2057,81 @@ directives.register("backend.export.xhtml",function(v) xhtmlfile = v end)
local function stopexport(v)
starttiming(treehash)
+ --
finishexport()
+ --
collapsetree(tree)
indextree(tree)
checktree(tree)
breaktree(tree)
- checkinserts(tree.data)
+ finalizetree(tree)
+ --
hashlistdata()
+ --
if type(v) ~= "string" or v == variables.yes or v == "" then
v = tex.jobname
end
- local xmlfile = file.addsuffix(v,"export")
- if type(cssfile) ~= "string" or cssfile == "" then
- cssfile = nil
+ local basename = file.basename(v)
+ local xmlfile = file.addsuffix(basename,"export")
+ --
+ local imagefilename = file.addsuffix(file.removesuffix(xmlfile) .. "-images","css")
+ local stylefilename = file.addsuffix(file.removesuffix(xmlfile) .. "-styles","css")
+ local templatefilename = file.replacesuffix(xmlfile,"template")
+ local specificationfilename = file.replacesuffix(xmlfile,"specification")
+ --
+ local cssfiles = { }
+ if type(cssfile) == "string" and cssfile ~= "" then
+ cssfiles = settings_to_array(cssfile)
+ insert(cssfiles,1,imagefilename)
+ insert(cssfiles,1,stylefilename)
end
- local files = { }
- local specification = {
- name = file.removesuffix(v),
- identifier = os.uuid(),
- files = files,
+ cssfiles = table.unique(cssfiles)
+ --
+ local result = allcontent(tree) -- also does some housekeeping and data collecting
+ --
+ local files = {
+ xhtmlfile,
+ -- stylefilename,
+ -- imagefilename,
+ }
+ local results = concat {
+ wholepreamble(),
+ allusedstylesheets(xmlfile,cssfiles,files), -- ads to files
+ result,
}
+ --
+ files = table.unique(files)
+ --
report_export("saving xml data in '%s",xmlfile)
+ io.savedata(xmlfile,results)
--
- local results = { }
- -- collect tree
- local result = { }
- flushtree(result,tree.data,"display",0) -- we need to collect images
- result = concat(result)
- result = gsub(result,"\n *\n","\n")
- result = gsub(result,"\n +([^< ])","\n%1")
+ report_export("saving css image definitions in '%s",imagefilename)
+ io.savedata(imagefilename,allusedimages(xmlfile))
--
- local imgfile = file.addsuffix(file.removesuffix(xmlfile) .. "-images","css")
- results[#results+1] = format(xmlpreamble,tex.jobname,os.date(),environment.version,exportversion)
- if cssfile then
- local cssfiles = settings_to_array(cssfile)
- for i=1,#cssfiles do
- local cssfile = cssfiles[i]
- files[#files+1] = cssfile
- if type(cssfile) ~= "string" or cssfile == variables.yes or cssfile == "" or cssfile == xmlfile then
- cssfile = file.replacesuffix(xmlfile,"css")
- else
- cssfile = file.addsuffix(cssfile,"css")
- end
- report_export("adding css reference '%s",cssfile)
- results[#results+1] = format(csspreamble,cssfile)
- end
- if #usedimages > 0 then
- results[#results+1] = format(csspreamble,imgfile)
- end
- end
+ report_export("saving css style definitions in '%s",cssfile)
+ io.savedata(stylefilename,allusedstyles(xmlfile))
--
- results[#results+1] = result
+ report_export("saving css template in '%s",templatefilename)
+ io.savedata(templatefilename,allusedelements(xmlfile))
--
- results = concat(results)
- -- if needed we can do a cleanup of the tree (no need to load for xhtml then)
- -- write to file
- io.savedata(xmlfile,results)
- -- css template file
- if cssfile then
- if #usedimages > 0 then
- report_export("saving css image definitions in '%s",imgfile)
- local result = { format("/* images for file %s */",xmlfile) }
- for i=1,#usedimages do
- local im = usedimages[i]
- -- todo: path
- result[#result+1] = format(imagetemplate,im.name,im.filename,im.width,im.height)
- end
- io.savedata(imgfile,concat(result,"\n\n"))
- else
- os.remove(imgfile)
- end
- --
- local cssfile = file.replacesuffix(xmlfile,"template")
- report_export("saving css template in '%s",cssfile)
- local templates = { format("/* template for file %s */",xmlfile) }
- for element, details in table.sortedhash(used) do
- templates[#templates+1] = format("/* category: %s */",element)
- for detail, nature in table.sortedhash(details) do
- local d = displaymapping[nature or "display"] or "block"
- if detail == "" then
- templates[#templates+1] = format(e_template,element,d)
- else
- templates[#templates+1] = format(d_template,element,detail,d)
- end
- end
- end
- io.savedata(cssfile,concat(templates,"\n\n"))
- else
- os.remove(imgfile)
- end
- -- xhtml references
if xhtmlfile then
- -- messy
if type(v) ~= "string" or xhtmlfile == true or xhtmlfile == variables.yes or xhtmlfile == "" or xhtmlfile == xmlfile then
xhtmlfile = file.replacesuffix(xmlfile,"xhtml")
else
xhtmlfile = file.addsuffix(xhtmlfile,"xhtml")
end
report_export("saving xhtml variant in '%s",xhtmlfile)
- -- local xmltree = xml.load(xmlfile)
- local xmltree = xml.convert(results)
- if xmltree then
- local xmlwrap = xml.wrap
- for e in xml.collected(xmltree,"/document") do
- e.at["xmlns:xhtml"] = "http://www.w3.org/1999/xhtml"
- break
- end
- -- todo: inject xhtmlpreamble (xmlns should have be enough)
- local wrapper = { tg = "a", ns = "xhtml", at = { href = "unknown" } }
- for e in xml.collected(xmltree,"link") do
- local location = e.at.location
- if location then
- wrapper.at.href = "#" .. gsub(location,":","_")
- xmlwrap(e,wrapper)
- end
- end
- local wrapper = { tg = "a", ns = "xhtml", at = { name = "unknown" } }
- for e in xml.collected(xmltree,"!link[@location]") do
- local location = e.at.location
- if location then
- wrapper.at.name = gsub(location,":","_")
- xmlwrap(e,wrapper)
- end
- end
- xml.save(xmltree,xhtmlfile)
- end
- files[#files+1] = xhtmlfile
- specification.root = xhtmlfile
- local specfile = file.replacesuffix(xmlfile,"specification")
- report_export("saving specification in '%s' (mtxrun --script epub --make %s)",specfile,specfile)
- io.savedata(specfile,table.serialize(specification,true))
+ local xmltree = cleanxhtmltree(xml.convert(results))
+ xml.save(xmltree,xhtmlfile)
+ local specification = {
+ name = file.removesuffix(v),
+ identifier = os.uuid(),
+ images = uniqueusedimages(),
+ root = xhtmlfile,
+ files = files,
+ }
+ report_export("saving specification in '%s' (mtxrun --script epub --make %s)",specificationfilename,specificationfilename)
+ io.savedata(specificationfilename,table.serialize(specification,true))
end
stoptiming(treehash)
end
@@ -2218,7 +2145,6 @@ local function startexport(v)
-- not yet known in task-ini
appendaction("shipouts", "normalizers", "nodes.handlers.export")
-- enableaction("shipouts","nodes.handlers.export")
---
enableaction("shipouts","nodes.handlers.accessibility")
enableaction("math", "noads.handlers.tags")
--~ appendaction("finalizers","lists","builders.paragraphs.tag")
@@ -2236,7 +2162,15 @@ statistics.register("xml exporting time", function()
end
end)
-commands.settagitemgroup = structurestags.setitemgroup
-commands.settagsynonym = structurestags.setsynonym
-commands.settagsorting = structurestags.setsorting
-commands.settagdescriptionid = structurestags.setdescriptionid
+-- These are called at the tex end:
+
+commands.settagitemgroup = structurestags.setitemgroup
+commands.settagsynonym = structurestags.setsynonym
+commands.settagsorting = structurestags.setsorting
+commands.settagdescription = structurestags.setdescription
+commands.settagdescriptionsymbol = structurestags.setdescriptionsymbol
+commands.settaghighlight = structurestags.sethighlight
+commands.settagfigure = structurestags.setfigure
+commands.settagcombination = structurestags.setcombination
+commands.settagtablecell = structurestags.settablecell
+commands.settagtabulatecell = structurestags.settabulatecell
diff --git a/tex/context/base/back-exp.mkiv b/tex/context/base/back-exp.mkiv
index d6fb74a97..715ccfd5c 100644
--- a/tex/context/base/back-exp.mkiv
+++ b/tex/context/base/back-exp.mkiv
@@ -26,14 +26,7 @@
% we can replace this by a more generic attributeset mechanism where we bind
% to any element (needed anyway, see userdata thingies)
-\definesystemattribute[taggedrows] [public]
-\definesystemattribute[taggedcolumns][public]
-\definesystemattribute[taggedalign] [public]
-\definesystemattribute[taggedpar] [public]
-\definesystemattribute[taggedpacked] [public]
-\definesystemattribute[taggedsymbol] [public]
-\definesystemattribute[taggedinsert] [public]
-\definesystemattribute[taggedtag] [public]
+\definesystemattribute[taggedpar][public]
\def\setelementexporttag
{\dotripleargument\dosetelementexporttag}
@@ -45,8 +38,17 @@
\expandafter\expandafter\expandafter\dosetelementexporttagb
\fi\fi}
-\def\dosetelementexporttaga[#1][#2][#3]{\ctxcommand{settagproperty("#1","#2","#3")}}
-\def\dosetelementexporttagb[#1][#2][#3]{\ctxcommand{settagproperty("#1","export","#2")}}
+\def\dosetelementexporttaga[#1][#2][#3]{\taggedctxcommand{settagproperty("#1","#2","#3")}}
+\def\dosetelementexporttagb[#1][#2][#3]{\taggedctxcommand{settagproperty("#1","export","#2")}}
+
+% todo: no need for calls when trialtypesetting
+
+\def\taggedctxcommand
+ {\iftrialtypesetting
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\ctxcommand
+ \fi}
\newcount\tagparcounter
@@ -65,29 +67,34 @@
\to \everytabulatepar % tricky, maybe this should be neverypar
\appendtoks
- \def\dotagnofTABLEcolumns{\attribute\taggedcolumnsattribute\!!counta}%
- \def\dotagnofTABLErows {\attribute\taggedrowsattribute \!!countb}%
+ \def\dotagTABLEcell {\taggedctxcommand{settagtablecell(\number\tablecellrows,\number\tablecellcolumns,\number\raggedstatus)}}%
+ \def\dotagTABLEsignal{\char\zerocount}% brrr, we need to tag empty cells (unless we start numbering)
\to \everyenableelements
\appendtoks
- \def\dotagTABLEalign{\attribute\taggedalignattribute\raggedstatus}%
- \def\dotagTABLEcell {\char\zerocount}% brrr, we need to tag empty cells (unless we start numbering)
+ \def\dotagtabulatecell {\taggedctxcommand{settagtabulatecell(\number\tabulatealign)}}%
+ \def\dotagtabulatesignal{\dontleavehmode\char\zerocount\ignorespaces}%
\to \everyenableelements
\appendtoks
- \def\dotagtabulatesignal{\dontleavehmode\char\zerocount\ignorespaces}%
+ \def\dotagsynonym{\taggedctxcommand{settagsynonym("\currentsynonym","\currentsynonymtag")}}%
\to \everyenableelements
-\appendtoks
- \def\dotagtabulatealign{\attribute\taggedalignattribute\ifcase\tabulatealign\attributeunsetvalue\or\plusthree\or\plusone\or\plustwo\or\attributeunsetvalue\fi}%
+\appendtoks % frozen and assumed global per highlight class
+ \def\dotaghighlight{\taggedctxcommand{settaghighlight("\currenthighlight","\highlightparameter\c!style",\number\attribute\colorattribute)}}%
+\to \everyenableelements
+
+\appendtoks % we can have differently scaled images
+ \def\dotagfigure{\taggedctxcommand{settagfigure("\figurefileoriginal","\figurefilepage",\number\dimexpr\figurewidth,\number\dimexpr\figureheight)}}%
\to \everyenableelements
\appendtoks
- \def\dotagsynonym{\ctxcommand{settagsynonym("\currentsynonym","\currentsynonymtag")}}%
+ %\def\dotagcombination{\taggedctxcommand{settagcombination(\combinationparameter\c!nx,\combinationparameter\c!ny)}}%
+ \def\dotagcombination{\taggedctxcommand{settagcombination(\number\horcombination,\number\totcombination)}}%
\to \everyenableelements
\appendtoks
- \def\dotagsorting{\ctxcommand{settagsorting("\currentsorting","\currentsortingtag")}}%
+ \def\dotagsorting{\taggedctxcommand{settagsorting("\currentsorting","\currentsortingtag")}}%
\to \everyenableelements
\appendtoks
@@ -95,15 +102,15 @@
\to \everyenableelements
\appendtoks
- \def\dotagsetitemize{\ctxcommand{settagitemgroup(\ifconditional\packlistitem true\else false\fi,"\currentitemsymbol")}}%
+ \def\dotagsetitemgroup{\taggedctxcommand{settagitemgroup("\currentitemgroup",\ifconditional\packlistitem true\else false\fi,"\currentitemsymbol")}}%
\to \everyenableelements
\appendtoks
- \def\dotagsetdescriptiontag{\ctxcommand{settagdescriptionid("\currentdescription",\currentdescriptionnumberentry)}}%
+ \def\dotagsetdescription{\taggedctxcommand{settagdescription("\currentdescription",\currentdescriptionnumberentry)}}%
\to \everyenableelements
\appendtoks
- \def\dotagsetnotesymbol{\ctxcommand{settagdescriptionid("\currentnote",\currentnotenumber)}}%
+ \def\dotagsetnotesymbol{\taggedctxcommand{settagdescriptionsymbol("\currentnote",\currentnotenumber)}}%
\to \everyenableelements
\appendtoks
diff --git a/tex/context/base/cont-new.mkii b/tex/context/base/cont-new.mkii
index ba30f0046..b53881d0a 100644
--- a/tex/context/base/cont-new.mkii
+++ b/tex/context/base/cont-new.mkii
@@ -11,7 +11,7 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-\newcontextversion{2011.06.16 12:50}
+\newcontextversion{2011.06.19 14:17}
%D This file is loaded at runtime, thereby providing an
%D excellent place for hacks, patches, extensions and new
diff --git a/tex/context/base/cont-new.mkiv b/tex/context/base/cont-new.mkiv
index da94d83c5..623c23eb6 100644
--- a/tex/context/base/cont-new.mkiv
+++ b/tex/context/base/cont-new.mkiv
@@ -11,7 +11,7 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-\newcontextversion{2011.06.16 18:20}
+\newcontextversion{2011.06.19 14:17}
%D This file is loaded at runtime, thereby providing an
%D excellent place for hacks, patches, extensions and new
diff --git a/tex/context/base/context.mkii b/tex/context/base/context.mkii
index 674f1e702..32d875b1c 100644
--- a/tex/context/base/context.mkii
+++ b/tex/context/base/context.mkii
@@ -20,7 +20,7 @@
%D your styles an modules.
\edef\contextformat {\jobname}
-\edef\contextversion{2011.06.16 12:50}
+\edef\contextversion{2011.06.19 14:17}
%D For those who want to use this:
diff --git a/tex/context/base/context.mkiv b/tex/context/base/context.mkiv
index f5c4c4c90..e7598d892 100644
--- a/tex/context/base/context.mkiv
+++ b/tex/context/base/context.mkiv
@@ -20,7 +20,7 @@
%D your styles an modules.
\edef\contextformat {\jobname}
-\edef\contextversion{2011.06.16 12:50}
+\edef\contextversion{2011.06.19 14:17}
%D For those who want to use this:
@@ -303,6 +303,8 @@
\loadmarkfile{font-col}
\loadmarkfile{font-gds}
+\loadmarkfile{lxml-css}
+
\loadmarkfile{spac-chr} % depends on fonts
\loadmarkfile{blob-ini} % not to be used, we only use a helper
diff --git a/tex/context/base/core-mis.mkiv b/tex/context/base/core-mis.mkiv
index 19e904e41..8a8203b9b 100644
--- a/tex/context/base/core-mis.mkiv
+++ b/tex/context/base/core-mis.mkiv
@@ -1686,7 +1686,7 @@
% todo: \startcombination \startcomb \stopcomb ...
-% needs to be mkiv'd
+% needs to be mkiv'd (we could map this onto bTABLE)
\newcount\horcombination % counter
\newcount\totcombination
@@ -1725,11 +1725,11 @@
% \startcombination[1*2] {alpha} {a} {beta} {b} \stopcombination
% \startcombination[2] {alpha} {a} {beta} {b} \stopcombination
-\def\dostartcombination[#1][#2]%
+\def\dostartcombination[#1][#2]% needs a cleanup, also nx ny (pretty old, this one)
{\global\setsystemmode{combination}%
\doifnothing{#1}\firstargumentfalse % to be sure (when called in macros)
\doifnothing{#2}\secondargumentfalse % to be sure (when called in macros)
- \ifsecondargument
+ \ifsecondargument % todo: nx ny
\def\currentcombination{#1}%
\edef\currentcombinationspec{#2*1*}%
\else % better : \doifcombinationelse ... \??co#1\c!location
@@ -1743,36 +1743,50 @@
\edef\currentcombinationspec{2*1*}}}%
\fi
\forgetall
+\dostarttagged\t!combination\currentcombination
\doifelse{\combinationparameter\c!height}\v!fit
\vbox {\vbox to \combinationparameter\c!height}%
\bgroup
\let\combination\empty % permits \combination{}{} handy for cld
+ \setuphorizontaldivision
+ [\c!n=\v!fit,\c!distance=\combinationparameter\c!distance]%
\expanded{\dodostartcombination[\currentcombinationspec]}}
+\ifdefined\dotagcombination \else \let\dotagcombination\relax \fi
+
\long\def\dodostartcombination[#1*#2*#3]%
- {\setuphorizontaldivision
- [\c!n=\v!fit,\c!distance=\combinationparameter\c!distance]%
- \global\horcombination#1%
+ {\global\horcombination#1%
\global\totcombination#2%
+\dotagcombination
\global\setbox\combinationstack\emptybox
\xdef\maxhorcombination{\the\horcombination}%
\multiply\totcombination\horcombination
\tabskip\zeropoint
\doifelse{\combinationparameter\c!width}\v!fit
{\halign}{\halign to \combinationparameter\c!width}%
- \bgroup&%
+ \bgroup
+ &%
%\hfil##\hfil% now : location={left,top}
\expanded{\doifnotinset{\v!left}{\combinationparameter\c!location}}\hfil
##%
\expanded{\doifnotinset{\v!right}{\combinationparameter\c!location}}\hfil
- &\tabskip\zeropoint \!!plus 1fill##\cr
+ &%
+ \tabskip\zeropoint \!!plus 1fill
+ ##%
+ \cr
\docombination}
\def\docombination % we want to add struts but still ignore an empty box
- {\dowithnextbox
- {\setbox0\flushnextbox
+ {\dostarttagged\t!combinationpair\empty
+ \dostarttagged\t!combinationcontent\empty
+ \dowithnextbox
+ {\dostoptagged
+ \setbox0\flushnextbox
+ \dostarttagged\t!combinationcaption\empty
\dowithnextbox
- {\setbox2\flushnextbox
+ {\dostoptagged
+ \dostoptagged
+ \setbox2\flushnextbox
\dodocombination}%
\vtop\bgroup
\def\next
@@ -1851,6 +1865,7 @@
\unexpanded\def\stopcombination
{{\scratchtoks{{}{}{}}\dorecurse\totcombination{\appendtoks{}{}{}{}\to\scratchtoks}\expandafter}\the\scratchtoks
\egroup
+ \dostoptagged
\egroup}
\newbox\combinationstack
diff --git a/tex/context/base/core-sys.mkiv b/tex/context/base/core-sys.mkiv
index 253ea6ece..cf3c7f7db 100644
--- a/tex/context/base/core-sys.mkiv
+++ b/tex/context/base/core-sys.mkiv
@@ -186,79 +186,54 @@
\definecomplexorsimple\start
\definecomplexorsimple\stop
-% \def\dododefinestartstop[#1][#2]% todo: use indirect commands
-% {\getparameters
-% [\??be#1]
-% [\c!before=,
-% \c!after=,
-% \c!inbetween=,
-% \c!commands=,
-% \c!style=,
-% #2]%
-% \setuvalue{#1}%
-% {\groupedcommand
-% {\getvalue{\??be#1\c!commands}%
-% \dostarttagged\t!construct{#1}%
-% \dostartattributes{\??be#1}\c!style\c!color}
-% {\dostopattributes
-% \dostoptagged
-% \getvalue{\??be#1\c!inbetween}}}%
-% \setuvalue{\e!start#1}%
-% {\getvalue{\??be#1\c!before}%
-% \bgroup
-% \getvalue{\??be#1\c!commands}%
-% \dostarttagged\t!construct{#1}%
-% \dostartattributes{\??be#1}\c!style\c!color\empty}%
-% \setuvalue{\e!stop#1}%
-% {\dostopattributes
-% \dostoptagged
-% \egroup
-% \getvalue{\??be#1\c!after}}}
-%
-% \def\dodefinestartstop[#1][#2]%
-% {\def\docommand##1{\dododefinestartstop[##1][#2]}%
-% \processcommalist[#1]\docommand}
-%
-% \unexpanded\def\definestartstop
-% {\dodoubleargument\dodefinestartstop}
-%
-% \def\dosetupstartstop[#1][#2]%
-% {\def\docommand##1{\getparameters[\??be##1][#2]}%
-% \processcommalist[#1]\docommand}
-%
-% \unexpanded\def\setupstartstop
-% {\dodoubleargument\dosetupstartstop}
-
-
% \c!before \c!after \c!inbetween \c!commands \c!style \c!color
\installcommandhandler{\??be}{startstop}{\??be}
\appendtoks
- \normalexpanded{\dodefinestartstop{\currentstartstop}}%
+ \setuevalue{\e!start\currentstartstop}{\dostartstop_start {\currentstartstop}}%
+ \setuevalue{\e!stop \currentstartstop}{\dostartstop_stop {\currentstartstop}}%
+ \setuevalue {\currentstartstop}{\dostartstop_indeed{\currentstartstop}}%
\to \everydefinestartstop
-\unexpanded\def\dodefinestartstop#1%
- {\setuvalue{#1}%
- {\groupedcommand
- {\def\currentstartstop{#1}%
- \startstopparameter\c!commands
- \dostarttagged\t!construct\currentstartstop
- \dosetstartstopattributes\c!style\c!color}
- {\def\currentstartstop{#1}%
- \dostoptagged
- \startstopparameter\c!inbetween}}%
- \setuvalue{\e!start#1}%
- {\namedstartstopparameter{#1}\c!before
- \bgroup
- \def\currentstartstop{#1}%
- \startstopparameter\c!commands
+\unexpanded\def\dostartstop_start#1%
+ {\namedstartstopparameter{#1}\c!before
+ \bgroup
+ \def\currentstartstop{#1}%
+ \startstopparameter\c!commands
+ \dostarttagged\t!construct\currentstartstop
+ \dosetstartstopattributes\c!style\c!color}
+
+\unexpanded\def\dostartstop_stop#1%
+ {\dostoptagged
+ \egroup
+ \namedstartstopparameter{#1}\c!after}
+
+\unexpanded\def\dostartstop_indeed#1%
+ {\groupedcommand
+ {\def\currentstartstop{#1}%
+ \startstopparameter\c!commands % will become setups
\dostarttagged\t!construct\currentstartstop
- \dosetstartstopattributes\c!style\c!color}%
- \setuvalue{\e!stop#1}%
- {\dostoptagged
- \egroup
- \namedstartstopparameter{#1}\c!after}}
+ \dosetstartstopattributes\c!style\c!color}
+ {\def\currentstartstop{#1}%
+ \dostoptagged
+ \startstopparameter\c!inbetween}}
+
+\installcommandhandler{\??hl}{highlight}{\??hl} % we could do with less
+
+\appendtoks
+ \setuevalue{\currenthighlight}{\dohighlight_indeed{\currenthighlight}}%
+\to \everydefinehighlight
+
+\ifdefined\dotaghighlight \else \let\dotaghighlight\relax \fi
+
+\unexpanded\def\dohighlight_indeed#1% inline style/color switch
+ {\groupedcommand
+ {\def\currenthighlight{#1}%
+ \dostarttagged\t!highlight\currenthighlight
+ \dosethighlightattributes\c!style\c!color
+ \dotaghighlight}
+ {\dostoptagged}}
% \docommand kan niet worden gebruikt omdat deze macro
% soms lokaal wordt gebruikt
diff --git a/tex/context/base/export-example.css b/tex/context/base/export-example.css
index 75a74994a..503d4279c 100644
--- a/tex/context/base/export-example.css
+++ b/tex/context/base/export-example.css
@@ -76,6 +76,7 @@ break {
}
/* construct : inline */
+/* highlight : inline */
construct {
}
@@ -84,6 +85,9 @@ construct[detail="important"] {
font-weight : bold ;
}
+highlight { /* todo: style and color */
+}
+
/* section : display */
/* sectiontitle : mixed */
/* sectionnumber : mixed */
@@ -401,6 +405,34 @@ tabulatecell {
padding-right : 1em ;
}
+/* combination : display */
+/* combinationpair : display */
+/* combinationcontent : mixed */
+/* combinationcaption : mixed */
+
+combination {
+ display : table ;
+ margin-top : 0em ;
+ margin-bottom : 0em ;
+}
+
+combinationpair {
+ display : table-cell ;
+ padding-right : 1em ;
+}
+
+combinationcontent {
+ display : table-row ;
+ text-align : center ;
+}
+
+combinationcaption {
+ display : table-row ;
+ padding-top : 1ex ;
+ text-align : center ;
+}
+
+
/* list : display */
/* listitem : display */
/* listtag : mixed */
diff --git a/tex/context/base/export-example.rng b/tex/context/base/export-example.rng
index 6e6c03c29..93b21ba50 100644
--- a/tex/context/base/export-example.rng
+++ b/tex/context/base/export-example.rng
@@ -5,6 +5,7 @@
# todo: check all content (not yet ok but a bit boring job)
# todo: add attributes
+# todo: we need more | and less ,
#
# validate with "rnv -c export-example.rng"
@@ -28,14 +29,17 @@ c_everything =
| e_section
| e_float
| e_formula
+ | e_combination
c_inline =
text
| e_ignore
| e_metadata
| e_construct
+ | e_highlight
| e_verbatim
| e_description
+ | e_descriptionsymbol
| e_sorting
| e_synonym
| e_image
@@ -103,6 +107,10 @@ e_construct = element construct {
c_everything*
}
+e_highlight = element highlight {
+ c_inline*
+}
+
e_itemgroup = element itemgroup {
element item {
element itemtag {
@@ -114,6 +122,17 @@ e_itemgroup = element itemgroup {
}
}
+e_combination = element combination {
+ element combinationpair {
+ element combinationcontent {
+ inline*
+ } ,
+ element combinationcaption {
+ inline*
+ }
+ }
+}
+
e_description = element description {
element descriptiontag {
c_inline*
@@ -126,6 +145,10 @@ e_description = element description {
}
}
+e_descriptionsymbol = element descriptionsymbol {
+ c_inline*
+}
+
e_verbatimblock = element verbatimblock {
element verbatimlines {
element verbatimline {
diff --git a/tex/context/base/export-example.tex b/tex/context/base/export-example.tex
index 6181c9125..6885cfe37 100644
--- a/tex/context/base/export-example.tex
+++ b/tex/context/base/export-example.tex
@@ -1,5 +1,8 @@
+\usemodule[abr-01]
+
\setupbackend
[export=export-example.xml,
+ xhtml=export-example.xhtml,
css=export-example.css]
\definedescription
@@ -13,15 +16,32 @@
\setupbodyfont
[dejavu]
+\setupinteraction
+ [state=start]
+
+\setupwhitespace
+ [big]
+
+\definehighlight[interesting][style=bold,color=red]
+
\starttext
\startchapter[title=Example]
\startparagraph \input zapf (Zapf) \stopparagraph
+\startparagraph
+ Watching a \interesting {movie} after reading a review on \goto{my favourite movie
+ reviews site}[url(http://outlawvern.com/)] is much more fun. \footnote {Just a note.}
+\stopparagraph
+
\placefigure
{}
- {\externalfigure[hacker.jpg]}
+ {\startcombination[3*1]
+ {\externalfigure[hacker.jpg][width=3cm]} {first}
+ {\externalfigure[hacker.jpg][width=4cm]} {second}
+ {\externalfigure[hacker.jpg][width=2cm]} {third}
+ \stopcombination}
\startparagraph \input zapf (Zapf) \stopparagraph
@@ -42,7 +62,7 @@
\startitem \input knuth (Knuth) \stopitem
\stopitemize
-\startitemize[2]
+\startitemize[2,packed]
\startitem \input zapf (Zapf) \stopitem
\startitem \input tufte (Tufte) \stopitem
\stopitemize
@@ -64,6 +84,18 @@ Okay, it's somewhat boring to always use the same formula, so how about
$\sqrt{4} = 2$ or traveling at \unit{120 km/h} instead of $\unit{110 km/h}$.
\stopparagraph
+\bTABLE
+\bTR \bTD test \eTD \bTD test \eTD \eTR
+\bTR \bTD[nx=2] test \eTD \eTR
+\eTABLE
+
+\starttabulate[|l|r|p|]
+\NC left \NC right \NC \input ward \NC \NR
+\NC l \NC r \NC \input ward \NC \NR
+\stoptabulate
+
+It looks like we're using \CONTEXT\ to produce some kind of \XML\ output.
+
\typefile{export-example.tex}
\stopchapter
diff --git a/tex/context/base/font-ctx.lua b/tex/context/base/font-ctx.lua
index 9f2e4f255..5b8a4e8ec 100644
--- a/tex/context/base/font-ctx.lua
+++ b/tex/context/base/font-ctx.lua
@@ -114,6 +114,7 @@ hashes.characters = chardata
hashes.parameters = parameters
hashes.quads = quaddata
hashes.xheights = xheightdata
+hashes.csnames = csnames
setmetatableindex(chardata, function(t,k)
local characters = fontdata[k].characters
@@ -714,10 +715,6 @@ function definers.stage_two(global,cs,str,size,inheritancemode,classfeatures,fon
end
end
local tfmdata = definers.read(specification,size) -- id not yet known
- local cs = specification.cs
- if cs then
- csnames[cs] = tfmdata -- new (beware: locals can be forgotten)
- end
if not tfmdata then
report_defining("unable to define %s as \\%s",name,cs)
texsetcount("global","lastfontid",-1)
@@ -727,6 +724,7 @@ function definers.stage_two(global,cs,str,size,inheritancemode,classfeatures,fon
report_defining("reusing %s with id %s as \\%s (features: %s/%s, fallbacks: %s/%s, goodies: %s/%s)",
name,tfmdata,cs,classfeatures,fontfeatures,classfallbacks,fontfallbacks,classgoodies,goodies)
end
+ csnames[tfmdata] = specification.cs
tex.definefont(global,cs,tfmdata)
-- resolved (when designsize is used):
setsomefontsize(fontdata[tfmdata].parameters.size .. "sp")
@@ -743,6 +741,7 @@ function definers.stage_two(global,cs,str,size,inheritancemode,classfeatures,fon
-- characters[0x2008] = { width = characters[0x002E] and characters[0x002E].width or parameters.space } -- period
--
local id = font.define(tfmdata)
+ csnames[id] = specification.cs
tfmdata.properties.id = id
definers.register(tfmdata,id) -- to be sure, normally already done
tex.definefont(global,cs,id)
diff --git a/tex/context/base/font-ini.mkiv b/tex/context/base/font-ini.mkiv
index 62ac058d7..af3d5ba78 100644
--- a/tex/context/base/font-ini.mkiv
+++ b/tex/context/base/font-ini.mkiv
@@ -4244,7 +4244,7 @@
% \unexpanded\def\stopstyle
% {\endgroup}
-% definitions
+% definitions .. no tagging here
\def\definestyle
{\dotripleargument\dodefinestyle}
diff --git a/tex/context/base/grph-fig.mkiv b/tex/context/base/grph-fig.mkiv
index 603604fd1..b3a66eb1c 100644
--- a/tex/context/base/grph-fig.mkiv
+++ b/tex/context/base/grph-fig.mkiv
@@ -41,11 +41,14 @@
{\dodoplaceexternalfigure[#1][#2][#3][#4][#5]}
{\getvalue{\??ef\??ef#2}[#5]}}}}
+\ifdefined\dotagfigure \else \let\dotagfigure\relax \fi
+
\def\dodoplaceexternalfigure[#1][#2][#3][#4][#5]%
{\bgroup
\dostarttagged\t!image\empty
\let\textunderscore\letterunderscore % {\string _} % space needed as _ is now letter in unprotected mode
\calculateexternalfigure[][#1][#2][#3][#4][#5]% [] is dummy dwcomp
+ \dotagfigure
\naturalvbox attr \imageattribute 2 {\box\foundexternalfigure}%
\dostoptagged
\egroup}
diff --git a/tex/context/base/grph-inc.lua b/tex/context/base/grph-inc.lua
index 5c2207749..4d3ba713d 100644
--- a/tex/context/base/grph-inc.lua
+++ b/tex/context/base/grph-inc.lua
@@ -120,6 +120,8 @@ figures.used = allocate()
figures.found = allocate()
figures.suffixes = allocate()
figures.patterns = allocate()
+figures.resources = allocate()
+
figures.boxnumber = figures.boxnumber or 0
figures.defaultsearch = true
@@ -191,6 +193,12 @@ end
figures.setlookups()
+function figures.registerresource(t)
+ local n = #figures.resources + 1
+ figures.resources[n] = t
+ return n
+end
+
local function register(tag,target,what)
local data = figures.formats[target] -- resolver etc
if not data then
@@ -889,6 +897,11 @@ function includers.generic(data)
dr.height = du.height
local hash = figures.hash(data)
local figure = figures.used[hash]
+--~ figures.registerresource {
+--~ filename = du.fullname,
+--~ width = dr.width,
+--~ height = dr.height,
+--~ }
if figure == nil then
figure = ds.private
if figure then
diff --git a/tex/context/base/l-table.lua b/tex/context/base/l-table.lua
index eeb3f47f6..d651608ae 100644
--- a/tex/context/base/l-table.lua
+++ b/tex/context/base/l-table.lua
@@ -15,7 +15,7 @@ local getinfo = debug.getinfo
-- Starting with version 5.2 Lua no longer provide ipairs, which makes
-- sense. As we already used the for loop and # in most places the
-- impact on ConTeXt was not that large; the remaining ipairs already
--- have been replaced. In a similar fashio we also hardly used pairs.
+-- have been replaced. In a similar fashion we also hardly used pairs.
--
-- Just in case, we provide the fallbacks as discussed in Programming
-- in Lua (http://www.lua.org/pil/7.3.html):
@@ -939,3 +939,20 @@ function table.loweredkeys(t) -- maybe utf
end
return l
end
+
+-- new, might move (maybe duplicate)
+
+function table.unique(old)
+ local hash = { }
+ local new = { }
+ local n = 0
+ for i=1,#old do
+ local oi = old[i]
+ if not hash[oi] then
+ n = n + 1
+ new[n] = oi
+ hash[oi] = true
+ end
+ end
+ return new
+end
diff --git a/tex/context/base/lang-def.lua b/tex/context/base/lang-def.lua
index 78c8eecbd..80ff13beb 100644
--- a/tex/context/base/lang-def.lua
+++ b/tex/context/base/lang-def.lua
@@ -65,6 +65,15 @@ local setmetatableindex = table.setmetatableindex
local specifications = allocate {
{
+ ["description"] = "Dutch",
+ ["script"] = "latn",
+ -- ["bibliographical"] = "nld",
+ -- ["terminological"] = "nld",
+ ["context"] = "nl",
+ ["opentype"] = "nld",
+ ["variant"] = "nl",
+ },
+ {
["description"] = "Basque",
["script"] = "latn",
["bibliographical"] = "baq",
diff --git a/tex/context/base/lang-def.mkiv b/tex/context/base/lang-def.mkiv
index b720a1813..874eb2c45 100644
--- a/tex/context/base/lang-def.mkiv
+++ b/tex/context/base/lang-def.mkiv
@@ -686,4 +686,11 @@
\installlanguage [vietnamese] [\s!vi]
+%D Todo: generate this one from languages.data
+
+\installlanguage[nld][\s!nl]
+\installlanguage[deu][\s!de]
+\installlanguage[eng][\s!en]
+\installlanguage[fra][\s!fr]
+
\protect \endinput
diff --git a/tex/context/base/lang-ini.mkiv b/tex/context/base/lang-ini.mkiv
index 6504b82b8..2959028bf 100644
--- a/tex/context/base/lang-ini.mkiv
+++ b/tex/context/base/lang-ini.mkiv
@@ -377,6 +377,8 @@
% The following may be a solution for the fact that one cannot
% change catcodes of characters like : and ; inside an environment.
+% we will also permit access by the other names
+
\def\complexlanguage[#1]%
{\edef\askedlanguage{#1}%
\ifx\askedlanguage\empty \else
diff --git a/tex/context/base/x-css.lua b/tex/context/base/lxml-css.lua
index 1bf559d66..e88c3a4a1 100644
--- a/tex/context/base/x-css.lua
+++ b/tex/context/base/lxml-css.lua
@@ -6,17 +6,19 @@ if not modules then modules = { } end modules ['lxml-css'] = {
license = "see context related readme files"
}
-local tonumber = tonumber
-local P, S, C, R, Cb, Cg, Carg = lpeg.P, lpeg.S, lpeg.C, lpeg.R, lpeg.Cb, lpeg.Cg, lpeg.Carg
+local tonumber, rawset = tonumber, rawset
+local lower, format = string.lower, string.format
+local P, S, C, R, Cb, Cg, Carg, Ct, Cc, Cf = lpeg.P, lpeg.S, lpeg.C, lpeg.R, lpeg.Cb, lpeg.Cg, lpeg.Carg, lpeg.Ct, lpeg.Cc, lpeg.Cf
local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns
-local css = { }
-local moduledata = moduledata or { }
-moduledata.css = css
+xml.css = xml.css or { }
+local css = xml.css
local dimenfactors = number.dimenfactors
-
-local bpf, cmf, mmf, inf = 1/dimenfactors.bp, 1/dimenfactors.cm, 1/dimenfactors.mm, 1/dimenfactors["in"]
+local bpf = 1/dimenfactors.bp
+local cmf = 1/dimenfactors.cm
+local mmf = 1/dimenfactors.mm
+local inf = 1/dimenfactors["in"]
local validdimen = Cg(lpegpatterns.number,'a') * (
Cb('a') * P("pt") / function(s) return tonumber(s) * bpf end
@@ -73,22 +75,37 @@ css.padding = padding
-- print(padding("10pt 20pt 30pt",pixel,hsize,exheight,emwidth))
-- print(padding("10pt 20pt 30pt 40pt",pixel,hsize,exheight,emwidth))
-local currentfont = font.current
-local texdimen = tex.dimen
-local hashes = fonts.hashes
-local quads = hashes.quads
-local xheights = hashes.xheights
+-- local currentfont = font.current
+-- local texdimen = tex.dimen
+-- local hashes = fonts.hashes
+-- local quads = hashes.quads
+-- local xheights = hashes.xheights
+--
+-- local function padding(str)
+-- local font = currentfont()
+-- local exheight = xheights[font]
+-- local emwidth = quads[font]
+-- local hsize = texdimen.hsize/100
+-- local pixel = emwidth/100
+-- return padding(str,pixel,hsize,exheight,emwidth)
+-- end
+--
+-- function css.simplepadding(str)
+-- context("%ssp",padding(str,pixel,hsize,exheight,emwidth))
+-- end
+
+local pattern = Cf( Ct("") * Cg(
+ Cc("style") * (C("italic") + C("oblique"))
+ + Cc("variant") * C("smallcaps")
+ + Cc("weight") * C("bold")
+ + P(1)
+)^0 , rawset)
-local function padding(str)
- local font = currentfont()
- local exheight = xheights[font]
- local emwidth = quads[font]
- local hsize = texdimen.hsize/100
- local pixel = emwidth/100
- return padding(str,pixel,hsize,exheight,emwidth)
+function css.fontspecification(str)
+ return str and lpegmatch(pattern,lower(str))
end
---~ function css.simplepadding(str)
---~ context("%ssp",padding(str,pixel,hsize,exheight,emwidth))
---~ end
-
+function css.colorspecification(str)
+ local c = str and attributes.colors.values[tonumber(str)]
+ return c and format("rgb(%s%%,%s%%,%s%%)",c[3]*100,c[4]*100,c[5]*100)
+end
diff --git a/tex/context/base/x-css.mkiv b/tex/context/base/lxml-css.mkiv
index 4ea252f9d..012db826c 100644
--- a/tex/context/base/x-css.mkiv
+++ b/tex/context/base/lxml-css.mkiv
@@ -1,5 +1,5 @@
%D \module
-%D [ file=x-css,
+%D [ file=lxml-css,
%D version=2010.01.28,
%D title=\CONTEXT\ Modules,
%D subtitle=Css Helpers,
@@ -11,7 +11,7 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-\registerctxluafile{x-css}{}
+\registerctxluafile{lxml-css}{}
\def\ctxmodulecss#1{\directlua\zerocount{moduledata.css.#1}}
diff --git a/tex/context/base/mult-sys.mkiv b/tex/context/base/mult-sys.mkiv
index 9d037368a..b65d15b45 100644
--- a/tex/context/base/mult-sys.mkiv
+++ b/tex/context/base/mult-sys.mkiv
@@ -538,6 +538,7 @@
\definesystemvariable {fx} % FoXet
\definesystemvariable {gr} % GRid
\definesystemvariable {ha} % HAng
+\definesystemvariable {hl} % HighLight
\definesystemvariable {hs} % HSpace
\definesystemvariable {ht} % HiddenText
\definesystemvariable {ia} % Interactie
diff --git a/tex/context/base/node-aux.lua b/tex/context/base/node-aux.lua
index 0b44f7724..38f1561fd 100644
--- a/tex/context/base/node-aux.lua
+++ b/tex/context/base/node-aux.lua
@@ -317,3 +317,21 @@ function nodes.link(...)
local currentfont = font.current
return link(nil,nil,{...},currentfont,currentattr)
end
+
+local function locate(start,wantedid,wantedsubtype)
+ for n in traverse_nodes(start) do
+ local id = n.id
+ if id == wantedid then
+ if not wantedsubtype or n.subtype == wantedsubtype then
+ return n
+ end
+ elseif id == hlist_code or id == vlist_code then
+ local found = locate(n.list,wantedid,wantedsubtype)
+ if found then
+ return found
+ end
+ end
+ end
+end
+
+nodes.locate = locate
diff --git a/tex/context/base/status-files.pdf b/tex/context/base/status-files.pdf
index c5b13be19..b9e7254c3 100644
--- a/tex/context/base/status-files.pdf
+++ b/tex/context/base/status-files.pdf
Binary files differ
diff --git a/tex/context/base/status-lua.pdf b/tex/context/base/status-lua.pdf
index e430fe95f..608937f8e 100644
--- a/tex/context/base/status-lua.pdf
+++ b/tex/context/base/status-lua.pdf
Binary files differ
diff --git a/tex/context/base/strc-des.mkiv b/tex/context/base/strc-des.mkiv
index f081e884a..d67525ae8 100644
--- a/tex/context/base/strc-des.mkiv
+++ b/tex/context/base/strc-des.mkiv
@@ -419,7 +419,7 @@
\BeforePar{\@@makedescription[#1]{#2}}%
\GotoPar}
-\let\dotagsetdescriptiontag\relax
+\ifdefined\dotagsetdescription \else \let\dotagsetdescription\relax \fi
\def\@@dostartdescriptionindeed
{\edef\currentdescriptionlocation{\descriptionparameter\c!location}%
@@ -430,8 +430,8 @@
\let\currentdescriptionlocation\v!left
\fi
\dostarttagged\t!description\currentdescription
+ \dotagsetdescription
\dostarttagged\t!descriptiontag\empty
- \dotagsetdescriptiontag
\@@dostartdescription
\csname @@description\currentdescriptionlocation\endcsname
\dostoptagged
diff --git a/tex/context/base/strc-flt.mkiv b/tex/context/base/strc-flt.mkiv
index 4d3689b3c..ee6228afd 100644
--- a/tex/context/base/strc-flt.mkiv
+++ b/tex/context/base/strc-flt.mkiv
@@ -633,13 +633,15 @@
\the\everyinsidefloat
\let\@@extrafloat\empty
\presetmorefloatvariables{#2}%
+\dostarttagged\t!floatcontent\empty
\dowithnextboxcontent % better a \the\everyfloattoks
{\setlocalfloathsize
\floatparameter\c!inner
- \dostarttagged\t!floatcontent\empty
- \aftergroup\dostoptagged % tricky, never change \dowithnextboxcontent
+% \dostarttagged\t!floatcontent\empty
+% \aftergroup\dostoptagged % tricky, never change \dowithnextboxcontent
\postponenotes} % new
- {\doifsomething{\floatparameter\c!criterium}
+ {\dostoptagged
+ \doifsomething{\floatparameter\c!criterium}
{\ifdim\wd\nextbox>\floatparameter\c!criterium\relax
\edef\forcedfloatmethod{\floatparameter\c!fallback}%
\ifx\forcedfloatmethod\empty\let\forcedfloatmethod\v!here\fi
diff --git a/tex/context/base/strc-itm.mkiv b/tex/context/base/strc-itm.mkiv
index d582dafae..c8044fbc2 100644
--- a/tex/context/base/strc-itm.mkiv
+++ b/tex/context/base/strc-itm.mkiv
@@ -304,6 +304,8 @@
% test \startitemize[joinedup,nowhite,after] \item test \item test \stopitemize test \par
% \stoptext
+\ifdefined\dotagsetitemgroup \else \let\dotagsetitemgroup\relax \fi
+
\def\itembeforecommand
{\ifconditional\nowhitelistitem
\ifconditional\beforelistitem
@@ -317,7 +319,7 @@
\getitemparameter\currentitemlevel\c!before
\fi\fi
\dostarttagged\t!itemgroup\currentitemgroup
- \dotagsetitemize}
+ \dotagsetitemgroup}
\def\itemaftercommand
{\dostoptagged
@@ -614,8 +616,6 @@
\let\currentitemindenting\empty
-\let\dotagsetitemize\relax
-
\def\redostartitemgroup[#1][#2]%
{\setfalse\inlinelistitem % new, no indent (leftskip)
\setfalse\concatnextitem % new, concat
diff --git a/tex/context/base/strc-not.mkiv b/tex/context/base/strc-not.mkiv
index d178c840c..09a834c46 100644
--- a/tex/context/base/strc-not.mkiv
+++ b/tex/context/base/strc-not.mkiv
@@ -688,7 +688,7 @@
\def\dolastnotesymbol
{\typesetsomenotesymbol\currentnote\currentnotenumber\currentdescriptionnumberentry}
-\let\dotagsetnotesymbol\relax
+\ifdefined\dotagsetnotesymbol \else \let\dotagsetnotesymbol\relax \fi
\def\dotypesetsomenotesymbol#1#2#3% running text (messy: #1 and current mixed)
{\dodonotesymbol
diff --git a/tex/context/base/strc-ren.mkiv b/tex/context/base/strc-ren.mkiv
index f2f056033..3a160ee9e 100644
--- a/tex/context/base/strc-ren.mkiv
+++ b/tex/context/base/strc-ren.mkiv
@@ -368,10 +368,29 @@
\unexpanded\def\defineheadplacement
{\dodoubleargument\dodefineheadplacement}
-\def\dodefineheadplacement[#1][#2]% #3#4
+% \def\dodefineheadplacement[#1][#2]% #3#4
+% {\setvalue{\??ns:#1}{#2}%
+% \setvalue{\??ns::#1}}
+
+% \dodefineheadplacement[sectiona][vertical]{#1->#2}
+% \dodefineheadplacement[sectionb][vertical]#1#2{#1->#2}
+%
+% \setuphead[section][alternative=sectiona]
+% \setuphead[subsection][alternative=sectionb]
+
+\def\dodefineheadplacementyes[#1][#2]%#3#4%
+ {\setvalue{\??ns:#1}{#2}%
+ \setvalue{\??ns::#1}##1##2}
+
+\def\dodefineheadplacementnop[#1][#2]%
{\setvalue{\??ns:#1}{#2}%
\setvalue{\??ns::#1}}
+\def\dodefineheadplacement[#1][#2]%
+ {\doifnextbgroupelse
+ {\dodefineheadplacementyes[#1][#2]}%
+ {\dodefineheadplacementnop[#1][#2]}}
+
\def\presetnumberheadalternative
{\doifelsevalue{\??ns:\numberheadalternative}\v!horizontal\setfalse\settrue\headisdisplay}
diff --git a/tex/context/base/strc-sec.mkiv b/tex/context/base/strc-sec.mkiv
index a36f549b1..94f21a12b 100644
--- a/tex/context/base/strc-sec.mkiv
+++ b/tex/context/base/strc-sec.mkiv
@@ -450,7 +450,7 @@
\endgraf
\endgroup}
-\ifdefined \else \let\presetnumberheadalternative\relax \fi
+\ifdefined\presetnumberheadalternative \else \let\presetnumberheadalternative\relax \fi
\def\dohandlehead#1#2#3% name data userdata (we can move #1 to the caller)
{\xdef\currenthead {#1}%
diff --git a/tex/context/base/strc-syn.mkiv b/tex/context/base/strc-syn.mkiv
index 1cf0f7a04..5efa48f7c 100644
--- a/tex/context/base/strc-syn.mkiv
+++ b/tex/context/base/strc-syn.mkiv
@@ -20,8 +20,8 @@
\unprotect
-\let\dotagsynonym\relax
-\let\dotagsorting\relax
+\ifdefined\dotagsynonym \else \let\dotagsynonym\relax \fi
+\ifdefined\dotagsorting \else \let\dotagsorting\relax \fi
% general help, can be shared
@@ -175,8 +175,8 @@
{\begingroup
\def\currentsynonym{#1}%
\def\currentsynonymtag{#2}%
- \dotagsynonym
\dostarttagged\t!synonym\currentsynonym
+ \dotagsynonym
\dosetsynonymattributes\c!synonymstyle\c!synonymcolor
\synonymparameter\c!synonymcommand{\ctxlua{structures.synonyms.synonym("#1","#2")}}%
\dostoptagged
@@ -336,8 +336,8 @@
% no kap currently, of .. we need to map cap onto WORD
\edef\currentsorting{#1}%
\def\currentsortingtag{#2}%
- \dotagsorting
\dostarttagged\t!sorting\currentsorting
+ \dotagsorting
\dosetsortingattributes\c!style\c!color
\ctxlua{structures.synonyms.synonym("#1","#2")}%
\dostoptagged
diff --git a/tex/context/base/strc-tag.lua b/tex/context/base/strc-tag.lua
index be8e3f5c8..886f00d36 100644
--- a/tex/context/base/strc-tag.lua
+++ b/tex/context/base/strc-tag.lua
@@ -50,6 +50,7 @@ local properties = allocate {
paragraph = { pdf = "P", nature = "mixed" },
p = { pdf = "P", nature = "mixed" },
construct = { pdf = "Span", nature = "inline" },
+ highlight = { pdf = "Span", nature = "inline" },
section = { pdf = "Sect", nature = "display" },
sectiontitle = { pdf = "H", nature = "mixed" },
@@ -164,8 +165,32 @@ local properties = allocate {
sup = { pdf = "Span", nature = "inline" },
subsup = { pdf = "Span", nature = "inline" },
+ combination = { pdf = "Span", nature = "display" },
+ combinationpair = { pdf = "Span", nature = "display" },
+ combinationcontent = { pdf = "Span", nature = "mixed" },
+ combinationcaption = { pdf = "Span", nature = "mixed" },
}
+function tags.detailedtag(tag,detail,attribute)
+ if not attribute then
+ attribute = texattribute[a_tagged]
+ end
+ local tl = taglist[attribute]
+ local pattern
+ if detail and detail ~= "" then
+ pattern = "^" .. tag .. ":".. detail .. "%-"
+ else
+ pattern = "^" .. tag .. "%-"
+ end
+ for i=#tl,1,-1 do
+ local tli = tl[i]
+ if find(tli,pattern) then
+ return tli
+ end
+ end
+ return false -- handy as bogus index
+end
+
tags.properties = properties
local lasttags = { }
diff --git a/tex/context/base/strc-tag.mkiv b/tex/context/base/strc-tag.mkiv
index e57a12b6b..335065c8b 100644
--- a/tex/context/base/strc-tag.mkiv
+++ b/tex/context/base/strc-tag.mkiv
@@ -27,6 +27,7 @@
\def\t!paragraph {paragraph} % P
\def\t!p {p} % P
\def\t!construct {construct} % Span
+\def\t!highlight {highlight} % Span
\def\t!section {section} % Sect
\def\t!sectiontitle {sectiontitle} % H
@@ -127,6 +128,11 @@
\def\t!quantity {quantity} % Span
\def\t!number {number} % Span
+\def\t!combination {combination} % Span
+\def\t!combinationpair {combinationpair} % Span
+\def\t!combinationcontent{combinationcontent} % Span
+\def\t!combinationcaption{combinationcaption} % Span
+
% \setuptaglabeltext
% [en]
% [\t!document=document]
diff --git a/tex/context/base/tabl-ntb.mkiv b/tex/context/base/tabl-ntb.mkiv
index 35ed45b63..4cddb50c7 100644
--- a/tex/context/base/tabl-ntb.mkiv
+++ b/tex/context/base/tabl-ntb.mkiv
@@ -116,11 +116,11 @@
%D
%D \typebuffer \getbuffer
-\let\dotagTABLEalign\relax
+\ifdefined\dotagTABLEcell \else \let\dotagTABLEcell\relax \fi
\def\bTBLCELL % why not \doinhibitblank
{\inhibitblank
- \dotagTABLEalign
+ \dotagTABLEcell
\doconvertfont\tbltblstyle\empty
\everypar{\tbltblleft\delayedbegstrut}}
@@ -923,8 +923,6 @@
\fi
\egroup}}
-\let\dotagTABLEcell\relax
-
\def\begintbl
{\global\tblspn\zerocount
\global\tblcol\zerocount
@@ -941,7 +939,8 @@
\ignorespaces##\unskip&&\ignorespaces##\unskip\cr} % one too many
\def\endtbl
- {\dostoptagged\egroup
+ {\dostoptagged
+ \egroup
\dostoptagged}
\setvalue{\tblnone TBL}#1#2%
@@ -997,17 +996,17 @@
\settblhei{#1}{\the\ht\scratchbox}%
\fi}%
-\let\dotagnofTABLEcolumns\relax
-\let\dotagnofTABLErows \relax
+\newcount\tablecellrows
+\newcount\tablecellcolumns
\def\domakeTBLthree#1 #2 %
{% height
-\dostarttagged\t!tablecell\empty
+ \dostarttagged\t!tablecell\empty
\!!counta \gettblcol{#1}{#2}\relax
\!!countb \gettblrow{#1}{#2}\relax
\!!heighta\gettblht {#1}{#2}\relax
-\dotagnofTABLEcolumns
-\dotagnofTABLErows
+ \tablecellcolumns\!!counta % used later so don't adapt these
+ \tablecellrows \!!countb % used later so don't adapt these
\scratchdimen\zeropoint
\ifnum\!!counta=\maximumcol\relax
% case: nc=maxcolumns
@@ -1031,7 +1030,7 @@
\edef\widthTBL{\the\dimexpr\scratchdimen-\tbltblcolumndistance\relax}%
% cell
\setbox\scratchbox\hbox attr \taggedattribute \attribute\taggedattribute \bgroup
-% \dotagTABLEcell
+ % \dotagTABLEsignal
\gettbltxt{#1}{#2}%
\egroup
\ifnum\!!counta=\maximumcol\relax
diff --git a/tex/context/base/tabl-tbl.mkiv b/tex/context/base/tabl-tbl.mkiv
index 5949460aa..c7b5e7b1b 100644
--- a/tex/context/base/tabl-tbl.mkiv
+++ b/tex/context/base/tabl-tbl.mkiv
@@ -324,7 +324,8 @@
\let\endreshapedtabulatepar\egroup
-\let\dotagtabulatealign\relax
+\ifdefined\dotagtabulatecell \else \let\dotagtabulatecell \relax \fi
+\ifdefined\dotagtabulatesignal \else \let\dotagtabulatesignal\relax \fi
\unexpanded\def\dochecklocaltabulatecolor#1#2%
{\relax
@@ -378,9 +379,7 @@
\fi
\fi\fi}
-\let\dotagtabulatesignal\relax
-
-\def\dodosettabulatepreamble#1#2% only makes sense for many tabulates
+\def\dodosettabulatepreamble#1#2#3% only makes sense for many tabulates
{\normalexpanded{\tabulatepreamble{\the\tabulatepreamble
\dochecklocaltabulatevrulecolor{\currenttabulatevrulecolor}{\the\tabulatevrulethickness}%
\dochecklocaltabulatecolor{\currenttabulatecolor}{\number\tabulatecolorspan}%
@@ -411,9 +410,10 @@
\bgroup
\noexpand\bbskip
\bgroup % we cannot combine the if because a cell may have only one ##
+ \tabulatealign\number#1\relax % needed in tag passing
\noexpand\dostarttagged\noexpand\t!tabulatecell\noexpand\empty
- \dotagtabulatealign
- \noexpand#1%
+ \noexpand\dotagtabulatecell
+ \noexpand#2%
\ifcase\tabulatereshape\else
\beginreshapedtabulatepar
\fi
@@ -438,7 +438,7 @@
\ifcase\tabulatereshape\else
\endreshapedtabulatepar
\fi
- \noexpand#2%
+ \noexpand#3%
% \noexpand\dostoptagged
\egroup
\egroup
@@ -457,10 +457,12 @@
%\let\gettabulateexit\dogettabulateexit % still needed ?
\tabulatewidth\zeropoint}
-\setvalue{\??tt>\meaning x}{\let\tabulatealign\zerocount\settabulatepreamble} % internal
-\setvalue{\??tt>\meaning l}{\let\tabulatealign\plusone\settabulatepreamble}
-\setvalue{\??tt>\meaning r}{\let\tabulatealign\plustwo\settabulatepreamble}
-\setvalue{\??tt>\meaning c}{\let\tabulatealign\plusthree\settabulatepreamble}
+\newcount\tabulatealign
+
+\setvalue{\??tt>\meaning x}{\tabulatealign\zerocount\settabulatepreamble} % internal
+\setvalue{\??tt>\meaning l}{\tabulatealign\plusone\settabulatepreamble}
+\setvalue{\??tt>\meaning r}{\tabulatealign\plustwo\settabulatepreamble}
+\setvalue{\??tt>\meaning c}{\tabulatealign\plusthree\settabulatepreamble}
\setvalue{\??tt>\meaning p}{\gettabulateparagraph}
\setvalue{\??tt>\meaning s}{\gettabulatesetups}
\setvalue{\??tt>\meaning w}{\gettabulatewidth}
@@ -586,28 +588,28 @@
\def\tabulatesetpreamblewidthnormal
{\ifcase\tabulatealign\relax
- \dodosettabulatepreamble\empty \tabulatehss \or
- \dodosettabulatepreamble\empty \tabulatehss \or
- \dodosettabulatepreamble\tabulatehss\empty \or
- \dodosettabulatepreamble\tabulatehss\tabulatehss \fi}
+ \dodosettabulatepreamble\tabulatealign\empty \tabulatehss \or
+ \dodosettabulatepreamble\tabulatealign\empty \tabulatehss \or
+ \dodosettabulatepreamble\tabulatealign\tabulatehss\empty \or
+ \dodosettabulatepreamble\tabulatealign\tabulatehss\tabulatehss \fi}
\def\tabulatesetpreamblewidthfixed
{\ifcase\tabulatealign\relax
- \dodosettabulatepreamble\bskip \eskip \or
- \dodosettabulatepreamble\tabulatebskipraggedright \eskip \or
- \dodosettabulatepreamble\tabulatebskipraggedleft \eskip \or
- \dodosettabulatepreamble\tabulatebskipraggedcenter\eskip \fi}
+ \dodosettabulatepreamble\tabulatealign\bskip \eskip \or
+ \dodosettabulatepreamble\tabulatealign\tabulatebskipraggedright \eskip \or
+ \dodosettabulatepreamble\tabulatealign\tabulatebskipraggedleft \eskip \or
+ \dodosettabulatepreamble\tabulatealign\tabulatebskipraggedcenter\eskip \fi}
\def\tabulatesetpreamblewidthauto
{\global\advance\nofautotabulate\plusone
\ifcase\tabulatealign\relax
- \dodosettabulatepreamble\bskip \eskip \or
- \dodosettabulatepreamble\tabulatebskipraggedright \eskip \or
- \dodosettabulatepreamble\tabulatebskipraggedleft \eskip \or
- \dodosettabulatepreamble\tabulatebskipraggedcenter\eskip \fi}
+ \dodosettabulatepreamble\tabulatealign\bskip \eskip \or
+ \dodosettabulatepreamble\tabulatealign\tabulatebskipraggedright \eskip \or
+ \dodosettabulatepreamble\tabulatealign\tabulatebskipraggedleft \eskip \or
+ \dodosettabulatepreamble\tabulatealign\tabulatebskipraggedcenter\eskip \fi}
\def\tabulatesetpreamblewidthsimple
- {\dodosettabulatepreamble\xbskip\xeskip}
+ {\dodosettabulatepreamble\tabulatealign\xbskip\xeskip}
\def\doparsecolortabulate#1#2%
{\gdef\currenttabulatecolor{#2}%
@@ -620,7 +622,7 @@
{\xdef\currenttabulatevrulecolor{#1}}}
\def\settabulateentry#1#2% rulespec template
- {\let\tabulatealign\@@tabulatealign
+ {\tabulatealign\@@tabulatealign
\let\tabulatemodus\zerocount
\let\tabulatedimen\zerocount
\let\tabulatereshape\zerocount
diff --git a/tex/context/base/x-udhr.mkiv b/tex/context/base/x-udhr.mkiv
new file mode 100644
index 000000000..164b74d83
--- /dev/null
+++ b/tex/context/base/x-udhr.mkiv
@@ -0,0 +1,98 @@
+%D \module
+%D [ file=x-udhr,
+%D version=2011.06.11,
+%D title=\CONTEXT\ Modules,
+%D subtitle=Unicode Language Test Files,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D The XML files can be fetched from: \url {http://unicode.org/udhr/}.
+
+\startmodule[udhr]
+
+\startxmlsetups udhr:basics
+ \xmlsetsetup {#1} {*} {udhr:*}
+\stopxmlsetups
+
+\xmlregistersetup{udhr:basics}
+
+\startxmlsetups udhr:udhr
+
+ \mainlanguage[\xmlatt{#1}{language}]
+
+ \starttitle[title=\xmltext{#1}{/title}]
+ \xmlfirst{#1}{/preamble}
+ \xmlall{#1}{/article}
+ \stoptitle
+
+\stopxmlsetups
+
+\startxmlsetups udhr:preamble
+ \startsubject[title=\xmltext{#1}{/title}]
+ \xmlall{#1}{/*)}
+ \stopsubject
+\stopxmlsetups
+
+\startxmlsetups udhr:article
+ \startsubject[title=\xmltext{#1}{/title}]
+ \xmlall{#1}{/*)}
+ \stopsubject
+\stopxmlsetups
+
+\startxmlsetups udhr:orderedlist
+ \startitemize[n]
+ \xmlflush{#1}
+ \stopitemize
+\stopxmlsetups
+
+\startxmlsetups udhr:listitem
+ \startitem
+ \xmlflush{#1}
+ \stopitem
+\stopxmlsetups
+
+\startxmlsetups udhr:para
+ \xmlflush{#1}
+ \par
+\stopxmlsetups
+
+\setupbodyfont
+ [dejavu,10pt]
+
+\setuplayout
+ [width-=middle,
+ height=middle,
+ footer=0cm,
+ header=1.5cm]
+
+\setupwhitespace
+ [big]
+
+\setuphead
+ [chapter]
+ [header=high,
+ style=\bfb,
+ align=middle]
+
+\setuphead
+ [section]
+ [style=\bfa,
+ align=middle]
+
+\setuptolerance
+ [verytolerant]
+
+\doifnotmode{demo}{\endinput}
+
+% todo: when argument given then process it
+
+\starttext
+ \xmlprocessfile{main}{udhr_nld.xml}{}
+\stoptext
+
+\stopmodule
diff --git a/tex/generic/context/luatex-fonts-enc.lua b/tex/generic/context/luatex-fonts-enc.lua
index ac736f2a6..e20c3a03b 100644
--- a/tex/generic/context/luatex-fonts-enc.lua
+++ b/tex/generic/context/luatex-fonts-enc.lua
@@ -18,7 +18,7 @@ fonts.encodings.agl = { }
setmetatable(fonts.encodings.agl, { __index = function(t,k)
if k == "unicodes" then
texio.write(" <loading (extended) adobe glyph list>")
- local unicodes = dofile(resolvers.findfile("font-agl.lua"))
+ local unicodes = dofile(resolvers.findfile("font-age.lua"))
fonts.encodings.agl = { unicodes = unicodes }
return unicodes
else
diff --git a/tex/generic/context/luatex-fonts-merged.lua b/tex/generic/context/luatex-fonts-merged.lua
index 54ef6442e..f9234d8fd 100644
--- a/tex/generic/context/luatex-fonts-merged.lua
+++ b/tex/generic/context/luatex-fonts-merged.lua
@@ -1,6 +1,6 @@
-- merged file : luatex-fonts-merged.lua
-- parent file : luatex-fonts.lua
--- merge date : 06/16/11 18:20:55
+-- merge date : 06/19/11 14:17:51
do -- begin closure to overcome local limits and interference
@@ -144,7 +144,7 @@ local getinfo = debug.getinfo
-- Starting with version 5.2 Lua no longer provide ipairs, which makes
-- sense. As we already used the for loop and # in most places the
-- impact on ConTeXt was not that large; the remaining ipairs already
--- have been replaced. In a similar fashio we also hardly used pairs.
+-- have been replaced. In a similar fashion we also hardly used pairs.
--
-- Just in case, we provide the fallbacks as discussed in Programming
-- in Lua (http://www.lua.org/pil/7.3.html):
@@ -1069,6 +1069,23 @@ function table.loweredkeys(t) -- maybe utf
return l
end
+-- new, might move (maybe duplicate)
+
+function table.unique(old)
+ local hash = { }
+ local new = { }
+ local n = 0
+ for i=1,#old do
+ local oi = old[i]
+ if not hash[oi] then
+ n = n + 1
+ new[n] = oi
+ hash[oi] = true
+ end
+ end
+ return new
+end
+
end -- closure
do -- begin closure to overcome local limits and interference
@@ -4173,7 +4190,7 @@ fonts.encodings.agl = { }
setmetatable(fonts.encodings.agl, { __index = function(t,k)
if k == "unicodes" then
texio.write(" <loading (extended) adobe glyph list>")
- local unicodes = dofile(resolvers.findfile("font-agl.lua"))
+ local unicodes = dofile(resolvers.findfile("font-age.lua"))
fonts.encodings.agl = { unicodes = unicodes }
return unicodes
else