From ac5bb04c922ee746e65acbd513e8d604c363de1c Mon Sep 17 00:00:00 2001
From: Hans Hagen
Date: Wed, 3 Feb 2010 23:06:00 +0100
Subject: beta 2010.02.03 23:06
---
scripts/context/lua/mtxrun.lua | 173 ++++++++++++++++++++++++++++-----
scripts/context/stubs/mswin/mtxrun.lua | 173 ++++++++++++++++++++++++++++-----
scripts/context/stubs/unix/mtxrun | 173 ++++++++++++++++++++++++++++-----
tex/context/base/back-pdf.mkiv | 2 +-
tex/context/base/cont-new.tex | 2 +-
tex/context/base/context.tex | 2 +-
tex/context/base/lpdf-mis.lua | 6 +-
tex/context/base/lxml-tab.lua | 96 +++++++++++++++---
tex/context/base/spec-fdf.mkii | 4 +-
9 files changed, 542 insertions(+), 89 deletions(-)
diff --git a/scripts/context/lua/mtxrun.lua b/scripts/context/lua/mtxrun.lua
index 6e5d1a848..8a2d7a123 100644
--- a/scripts/context/lua/mtxrun.lua
+++ b/scripts/context/lua/mtxrun.lua
@@ -1877,6 +1877,7 @@ elseif os.type == "windows" then
elseif name == "linux" then
function os.resolvers.platform(t,k)
+ -- we sometims have HOSTTYPE set so let's check that first
local platform, architecture = "", os.getenv("HOSTTYPE") or os.resultof("uname -m") or ""
if find(architecture,"x86_64") then
platform = "linux-64"
@@ -1890,14 +1891,28 @@ elseif name == "linux" then
return platform
end
-elseif name == "macosx" then -- a rather inconsistent mess
+elseif name == "macosx" then
+
+ --[[
+ Identifying the architecture of OSX is quite a mess and this
+ is the best we can come up with. For some reason $HOSTTYPE is
+ a kind of pseudo environment variable, not known to the current
+ environment. And yes, uname cannot be trusted either, so there
+ is a change that you end up with a 32 bit run on a 64 bit system.
+ Also, some proper 64 bit intel macs are too cheap (low-end) and
+ therefore not permitted to run the 64 bit kernel.
+ ]]--
function os.resolvers.platform(t,k)
- local platform, architecture = "", os.getenv("HOSTTYPE") or ""
+ -- local platform, architecture = "", os.getenv("HOSTTYPE") or ""
+ -- if architecture == "" then
+ -- architecture = os.resultof("echo $HOSTTYPE") or ""
+ -- end
+ local platform, architecture = "", os.resultof("echo $HOSTTYPE") or ""
if architecture == "" then
- architecture = os.resultof("echo $HOSTTYPE") or ""
- end
- if find(architecture,"i386") then
+ -- print("\nI have no clue what kind of OSX you're running so let's assume an 32 bit intel.\n")
+ platform = "osx-intel"
+ elseif find(architecture,"i386") then
platform = "osx-intel"
elseif find(architecture,"x86_64") then
platform = "osx-64"
@@ -1973,8 +1988,10 @@ function os.uuid()
)
end
+local d
+
function os.timezone(delta)
- local d = tonumber(tonumber(os.date("%H")-os.date("!%H")))
+ d = d or tonumber(tonumber(os.date("%H")-os.date("!%H")))
if delta then
if d > 0 then
return format("+%02i:00",d)
@@ -3854,7 +3871,7 @@ element.
local nsremap, resolvens = xml.xmlns, xml.resolvens
local stack, top, dt, at, xmlns, errorstr, entities = { }, { }, { }, { }, { }, nil, { }
-local strip, cleanup, utfize, resolve = false, false, false, false
+local strip, cleanup, utfize, resolve, keep = false, false, false, false, false
local dcache, hcache, acache = { }, { }, { }
local mt = { }
@@ -3951,7 +3968,7 @@ local function add_special(what, spacing, text)
if strip and (what == "@cm@" or what == "@dt@") then
-- forget it
else
- dt[#dt+1] = { special=true, ns="", tg=what, dt={text} }
+ dt[#dt+1] = { special=true, ns="", tg=what, dt={ text } }
end
end
@@ -4057,11 +4074,22 @@ local parsedentity =
xml.parsedentitylpeg = parsedentity
+local predefined = {
+ amp = "&",
+ lt = "<",
+ gt = "<",
+ quot = '"',
+ apos = "'",
+}
+
local function handle_any_entity(str)
if resolve then
local a = acache[str] -- per instance ! todo
if not a then
- if type(resolve) == "function" then
+ a = not keep and predefined[str]
+ if a then
+ -- one of the predefined
+ elseif type(resolve) == "function" then
a = resolve(str) or entities[str]
else
a = entities[str]
@@ -4100,13 +4128,23 @@ local function handle_any_entity(str)
if trace_entities then
logs.report("xml","found entity &%s;",str)
end
- a = "&" .. str .. ";"
- acache[str] = a
+ a = not keep and predefined[str]
+ if a then
+ -- one of the predefined
+ acache[str] = a
+ else
+ a = "&" .. str .. ";"
+ acache[str] = a
+ end
end
return a
end
end
+local function handle_end_entity(chr)
+ logs.report("xml","error in entity, %q found instead of ';'",chr)
+end
+
local space = S(' \r\n\t')
local open = P('<')
local close = P('>')
@@ -4127,12 +4165,15 @@ local utfbom = P('\000\000\254\255') + P('\255\254\000\000') +
local spacing = C(space^0)
-local entitycontent = (1-open-semicolon)^0
+----- entitycontent = (1-open-semicolon)^0
+local anyentitycontent = (1-open-semicolon-space-close)^0
+local hexentitycontent = R("AF","af","09")^0
+local decentitycontent = R("09")^0
local parsedentity = P("#")/"" * (
- P("x")/"" * (entitycontent/handle_hex_entity) +
- (entitycontent/handle_dec_entity)
- ) + (entitycontent/handle_any_entity)
-local entity = ampersand/"" * parsedentity * (semicolon/"")
+ P("x")/"" * (hexentitycontent/handle_hex_entity) +
+ (decentitycontent/handle_dec_entity)
+ ) + (anyentitycontent/handle_any_entity)
+local entity = ampersand/"" * parsedentity * ( (semicolon/"") + #(P(1)/handle_end_entity))
local text_unparsed = C((1-open)^1)
local text_parsed = Cs(((1-open-ampersand)^1 + entity)^1)
@@ -4229,11 +4270,14 @@ local grammar_unparsed_text = P { "preamble",
children = unparsedtext + V("parent") + emptyelement + comment + cdata + instruction,
}
+-- maybe we will add settinsg to result as well
+
local function xmlconvert(data, settings)
settings = settings or { } -- no_root strip_cm_and_dt given_entities parent_root error_handler
strip = settings.strip_cm_and_dt
utfize = settings.utfize_entities
resolve = settings.resolve_entities
+ keep = settings.keep_predefined_entities
cleanup = settings.text_cleanup
stack, top, at, xmlns, errorstr, result, entities = { }, { }, { }, { }, nil, nil, settings.entities or { }
acache, hcache, dcache = { }, { }, { } -- not stored
@@ -4264,7 +4308,7 @@ local function xmlconvert(data, settings)
errorstr = "invalid xml file - no text at all"
end
if errorstr and errorstr ~= "" then
- result = { dt = { { ns = "", tg = "error", dt = { errorstr }, at={}, er = true } } }
+ result = { dt = { { ns = "", tg = "error", dt = { errorstr }, at={ }, er = true } } }
setmetatable(stack, mt)
local error_handler = settings.error_handler
if error_handler == false then
@@ -4279,13 +4323,14 @@ local function xmlconvert(data, settings)
result = stack[1]
end
if not settings.no_root then
- result = { special = true, ns = "", tg = '@rt@', dt = result.dt, at={}, entities = entities, settings = settings }
+ result = { special = true, ns = "", tg = '@rt@', dt = result.dt, at={ }, entities = entities, settings = settings }
setmetatable(result, mt)
local rdt = result.dt
for k=1,#rdt do
local v = rdt[k]
if type(v) == "table" and not v.special then -- always table -)
result.ri = k -- rootindex
+v.__p__ = result -- new, experiment, else we cannot go back to settings, we need to test this !
break
end
end
@@ -4721,12 +4766,37 @@ xml.string = xmlstring
A few helpers:
--ldx]]--
+--~ xmlsetproperty(root,"settings",settings)
+
+function xml.settings(e)
+ while e do
+ local s = e.settings
+ if s then
+ return s
+ else
+ e = e.__p__
+ end
+ end
+ return nil
+end
+
+function xml.root(e)
+ local r = e
+ while e do
+ e = e.__p__
+ if e then
+ r = e
+ end
+ end
+ return r
+end
+
function xml.parent(root)
return root.__p__
end
function xml.body(root)
- return (root.ri and root.dt[root.ri]) or root
+ return (root.ri and root.dt[root.ri]) or root -- not ok yet
end
function xml.name(root)
@@ -4772,6 +4842,24 @@ function xml.assign(dt,k,root)
end
end
+--[[ldx--
+The next helper assigns a tree (or string). Usage:
+
+xml.tocdata(e)
+xml.tocdata(e,"error")
+
+--ldx]]--
+
+function xml.tocdata(e,wrapper)
+ local whatever = xmltostring(e.dt)
+ if wrapper then
+ whatever = format("<%s>%s%s>",wrapper,whatever,wrapper)
+ end
+ local t = { special = true, ns = "", tg = "@cd@", at = {}, rn = "", dt = { whatever }, __p__ = e }
+ setmetatable(t,getmetatable(e))
+ e.dt = { t }
+end
+
end -- of closure
@@ -4920,14 +5008,19 @@ end
apply_axis['child'] = function(list)
local collected = { }
for l=1,#list do
- local dt = list[l].dt
+ local ll = list[l]
+ local dt = ll.dt
+local en = 0
for k=1,#dt do
local dk = dt[k]
if dk.tg then
collected[#collected+1] = dk
dk.ni = k -- refresh
+en = en + 1
+dk.ei = en
end
end
+ll.en = en
end
return collected
end
@@ -4935,14 +5028,18 @@ end
local function collect(list,collected)
local dt = list.dt
if dt then
+local en = 0
for k=1,#dt do
local dk = dt[k]
if dk.tg then
collected[#collected+1] = dk
dk.ni = k -- refresh
+en = en + 1
+dk.ei = en
collect(dk,collected)
end
end
+list.en = en
end
end
apply_axis['descendant'] = function(list)
@@ -4956,14 +5053,18 @@ end
local function collect(list,collected)
local dt = list.dt
if dt then
+local en = 0
for k=1,#dt do
local dk = dt[k]
if dk.tg then
collected[#collected+1] = dk
dk.ni = k -- refresh
+en = en + 1
+dk.ei = en
collect(dk,collected)
end
end
+list.en = en
end
end
apply_axis['descendant-or-self'] = function(list)
@@ -5220,7 +5321,7 @@ local function apply_expression(list,expression,order)
quit_expression = false
for l=1,#list do
local ll = list[l]
- if expression(list,ll,l,order) then -- nasty, alleen valid als n=1
+ if expression(list,ll,l,order) then -- nasty, order alleen valid als n=1
collected[#collected+1] = ll
end
if quit_expression then
@@ -5241,11 +5342,16 @@ local lp_or = P("|") / " or "
local lp_and = P("&") / " and "
local lp_builtin = P (
+P("firstindex") / "1" +
+P("lastindex") / "(#ll.__p__.dt or 1)" +
+P("firstelement") / "1" +
+P("lastelement") / "(ll.__p__.en or 1)" +
P("first") / "1" +
P("last") / "#list" +
- P("position") / "l" + -- is element in finalizer
P("rootposition") / "order" +
+ P("position") / "l" + -- is element in finalizer
P("order") / "order" +
+ P("element") / "(ll.ei or 1)" +
P("index") / "(ll.ni or 1)" +
P("match") / "(ll.mi or 1)" +
P("text") / "(ll.dt[1] or '')" +
@@ -6441,6 +6547,29 @@ end
xml.include = include
+--~ local function manipulate(xmldata,pattern,manipulator) -- untested and might go away
+--~ local collected = xmlparseapply({ xmldata },pattern)
+--~ if collected then
+--~ local xmltostring = xml.tostring
+--~ for c=1,#collected do
+--~ local e = collected[c]
+--~ local data = manipulator(xmltostring(e))
+--~ if data == "" then
+--~ epdt[e.ni] = ""
+--~ else
+--~ local xi = xmlinheritedconvert(data,xmldata)
+--~ if not xi then
+--~ epdt[e.ni] = ""
+--~ else
+--~ epdt[e.ni] = xml.body(xi) -- xml.assign(d,k,xi)
+--~ end
+--~ end
+--~ end
+--~ end
+--~ end
+
+--~ xml.manipulate = manipulate
+
function xml.strip_whitespace(root, pattern, nolines) -- strips all leading and trailing space !
local collected = xmlparseapply({ root },pattern)
if collected then
diff --git a/scripts/context/stubs/mswin/mtxrun.lua b/scripts/context/stubs/mswin/mtxrun.lua
index 6e5d1a848..8a2d7a123 100644
--- a/scripts/context/stubs/mswin/mtxrun.lua
+++ b/scripts/context/stubs/mswin/mtxrun.lua
@@ -1877,6 +1877,7 @@ elseif os.type == "windows" then
elseif name == "linux" then
function os.resolvers.platform(t,k)
+ -- we sometims have HOSTTYPE set so let's check that first
local platform, architecture = "", os.getenv("HOSTTYPE") or os.resultof("uname -m") or ""
if find(architecture,"x86_64") then
platform = "linux-64"
@@ -1890,14 +1891,28 @@ elseif name == "linux" then
return platform
end
-elseif name == "macosx" then -- a rather inconsistent mess
+elseif name == "macosx" then
+
+ --[[
+ Identifying the architecture of OSX is quite a mess and this
+ is the best we can come up with. For some reason $HOSTTYPE is
+ a kind of pseudo environment variable, not known to the current
+ environment. And yes, uname cannot be trusted either, so there
+ is a change that you end up with a 32 bit run on a 64 bit system.
+ Also, some proper 64 bit intel macs are too cheap (low-end) and
+ therefore not permitted to run the 64 bit kernel.
+ ]]--
function os.resolvers.platform(t,k)
- local platform, architecture = "", os.getenv("HOSTTYPE") or ""
+ -- local platform, architecture = "", os.getenv("HOSTTYPE") or ""
+ -- if architecture == "" then
+ -- architecture = os.resultof("echo $HOSTTYPE") or ""
+ -- end
+ local platform, architecture = "", os.resultof("echo $HOSTTYPE") or ""
if architecture == "" then
- architecture = os.resultof("echo $HOSTTYPE") or ""
- end
- if find(architecture,"i386") then
+ -- print("\nI have no clue what kind of OSX you're running so let's assume an 32 bit intel.\n")
+ platform = "osx-intel"
+ elseif find(architecture,"i386") then
platform = "osx-intel"
elseif find(architecture,"x86_64") then
platform = "osx-64"
@@ -1973,8 +1988,10 @@ function os.uuid()
)
end
+local d
+
function os.timezone(delta)
- local d = tonumber(tonumber(os.date("%H")-os.date("!%H")))
+ d = d or tonumber(tonumber(os.date("%H")-os.date("!%H")))
if delta then
if d > 0 then
return format("+%02i:00",d)
@@ -3854,7 +3871,7 @@ element.
local nsremap, resolvens = xml.xmlns, xml.resolvens
local stack, top, dt, at, xmlns, errorstr, entities = { }, { }, { }, { }, { }, nil, { }
-local strip, cleanup, utfize, resolve = false, false, false, false
+local strip, cleanup, utfize, resolve, keep = false, false, false, false, false
local dcache, hcache, acache = { }, { }, { }
local mt = { }
@@ -3951,7 +3968,7 @@ local function add_special(what, spacing, text)
if strip and (what == "@cm@" or what == "@dt@") then
-- forget it
else
- dt[#dt+1] = { special=true, ns="", tg=what, dt={text} }
+ dt[#dt+1] = { special=true, ns="", tg=what, dt={ text } }
end
end
@@ -4057,11 +4074,22 @@ local parsedentity =
xml.parsedentitylpeg = parsedentity
+local predefined = {
+ amp = "&",
+ lt = "<",
+ gt = "<",
+ quot = '"',
+ apos = "'",
+}
+
local function handle_any_entity(str)
if resolve then
local a = acache[str] -- per instance ! todo
if not a then
- if type(resolve) == "function" then
+ a = not keep and predefined[str]
+ if a then
+ -- one of the predefined
+ elseif type(resolve) == "function" then
a = resolve(str) or entities[str]
else
a = entities[str]
@@ -4100,13 +4128,23 @@ local function handle_any_entity(str)
if trace_entities then
logs.report("xml","found entity &%s;",str)
end
- a = "&" .. str .. ";"
- acache[str] = a
+ a = not keep and predefined[str]
+ if a then
+ -- one of the predefined
+ acache[str] = a
+ else
+ a = "&" .. str .. ";"
+ acache[str] = a
+ end
end
return a
end
end
+local function handle_end_entity(chr)
+ logs.report("xml","error in entity, %q found instead of ';'",chr)
+end
+
local space = S(' \r\n\t')
local open = P('<')
local close = P('>')
@@ -4127,12 +4165,15 @@ local utfbom = P('\000\000\254\255') + P('\255\254\000\000') +
local spacing = C(space^0)
-local entitycontent = (1-open-semicolon)^0
+----- entitycontent = (1-open-semicolon)^0
+local anyentitycontent = (1-open-semicolon-space-close)^0
+local hexentitycontent = R("AF","af","09")^0
+local decentitycontent = R("09")^0
local parsedentity = P("#")/"" * (
- P("x")/"" * (entitycontent/handle_hex_entity) +
- (entitycontent/handle_dec_entity)
- ) + (entitycontent/handle_any_entity)
-local entity = ampersand/"" * parsedentity * (semicolon/"")
+ P("x")/"" * (hexentitycontent/handle_hex_entity) +
+ (decentitycontent/handle_dec_entity)
+ ) + (anyentitycontent/handle_any_entity)
+local entity = ampersand/"" * parsedentity * ( (semicolon/"") + #(P(1)/handle_end_entity))
local text_unparsed = C((1-open)^1)
local text_parsed = Cs(((1-open-ampersand)^1 + entity)^1)
@@ -4229,11 +4270,14 @@ local grammar_unparsed_text = P { "preamble",
children = unparsedtext + V("parent") + emptyelement + comment + cdata + instruction,
}
+-- maybe we will add settinsg to result as well
+
local function xmlconvert(data, settings)
settings = settings or { } -- no_root strip_cm_and_dt given_entities parent_root error_handler
strip = settings.strip_cm_and_dt
utfize = settings.utfize_entities
resolve = settings.resolve_entities
+ keep = settings.keep_predefined_entities
cleanup = settings.text_cleanup
stack, top, at, xmlns, errorstr, result, entities = { }, { }, { }, { }, nil, nil, settings.entities or { }
acache, hcache, dcache = { }, { }, { } -- not stored
@@ -4264,7 +4308,7 @@ local function xmlconvert(data, settings)
errorstr = "invalid xml file - no text at all"
end
if errorstr and errorstr ~= "" then
- result = { dt = { { ns = "", tg = "error", dt = { errorstr }, at={}, er = true } } }
+ result = { dt = { { ns = "", tg = "error", dt = { errorstr }, at={ }, er = true } } }
setmetatable(stack, mt)
local error_handler = settings.error_handler
if error_handler == false then
@@ -4279,13 +4323,14 @@ local function xmlconvert(data, settings)
result = stack[1]
end
if not settings.no_root then
- result = { special = true, ns = "", tg = '@rt@', dt = result.dt, at={}, entities = entities, settings = settings }
+ result = { special = true, ns = "", tg = '@rt@', dt = result.dt, at={ }, entities = entities, settings = settings }
setmetatable(result, mt)
local rdt = result.dt
for k=1,#rdt do
local v = rdt[k]
if type(v) == "table" and not v.special then -- always table -)
result.ri = k -- rootindex
+v.__p__ = result -- new, experiment, else we cannot go back to settings, we need to test this !
break
end
end
@@ -4721,12 +4766,37 @@ xml.string = xmlstring
A few helpers:
--ldx]]--
+--~ xmlsetproperty(root,"settings",settings)
+
+function xml.settings(e)
+ while e do
+ local s = e.settings
+ if s then
+ return s
+ else
+ e = e.__p__
+ end
+ end
+ return nil
+end
+
+function xml.root(e)
+ local r = e
+ while e do
+ e = e.__p__
+ if e then
+ r = e
+ end
+ end
+ return r
+end
+
function xml.parent(root)
return root.__p__
end
function xml.body(root)
- return (root.ri and root.dt[root.ri]) or root
+ return (root.ri and root.dt[root.ri]) or root -- not ok yet
end
function xml.name(root)
@@ -4772,6 +4842,24 @@ function xml.assign(dt,k,root)
end
end
+--[[ldx--
+The next helper assigns a tree (or string). Usage:
+
+xml.tocdata(e)
+xml.tocdata(e,"error")
+
+--ldx]]--
+
+function xml.tocdata(e,wrapper)
+ local whatever = xmltostring(e.dt)
+ if wrapper then
+ whatever = format("<%s>%s%s>",wrapper,whatever,wrapper)
+ end
+ local t = { special = true, ns = "", tg = "@cd@", at = {}, rn = "", dt = { whatever }, __p__ = e }
+ setmetatable(t,getmetatable(e))
+ e.dt = { t }
+end
+
end -- of closure
@@ -4920,14 +5008,19 @@ end
apply_axis['child'] = function(list)
local collected = { }
for l=1,#list do
- local dt = list[l].dt
+ local ll = list[l]
+ local dt = ll.dt
+local en = 0
for k=1,#dt do
local dk = dt[k]
if dk.tg then
collected[#collected+1] = dk
dk.ni = k -- refresh
+en = en + 1
+dk.ei = en
end
end
+ll.en = en
end
return collected
end
@@ -4935,14 +5028,18 @@ end
local function collect(list,collected)
local dt = list.dt
if dt then
+local en = 0
for k=1,#dt do
local dk = dt[k]
if dk.tg then
collected[#collected+1] = dk
dk.ni = k -- refresh
+en = en + 1
+dk.ei = en
collect(dk,collected)
end
end
+list.en = en
end
end
apply_axis['descendant'] = function(list)
@@ -4956,14 +5053,18 @@ end
local function collect(list,collected)
local dt = list.dt
if dt then
+local en = 0
for k=1,#dt do
local dk = dt[k]
if dk.tg then
collected[#collected+1] = dk
dk.ni = k -- refresh
+en = en + 1
+dk.ei = en
collect(dk,collected)
end
end
+list.en = en
end
end
apply_axis['descendant-or-self'] = function(list)
@@ -5220,7 +5321,7 @@ local function apply_expression(list,expression,order)
quit_expression = false
for l=1,#list do
local ll = list[l]
- if expression(list,ll,l,order) then -- nasty, alleen valid als n=1
+ if expression(list,ll,l,order) then -- nasty, order alleen valid als n=1
collected[#collected+1] = ll
end
if quit_expression then
@@ -5241,11 +5342,16 @@ local lp_or = P("|") / " or "
local lp_and = P("&") / " and "
local lp_builtin = P (
+P("firstindex") / "1" +
+P("lastindex") / "(#ll.__p__.dt or 1)" +
+P("firstelement") / "1" +
+P("lastelement") / "(ll.__p__.en or 1)" +
P("first") / "1" +
P("last") / "#list" +
- P("position") / "l" + -- is element in finalizer
P("rootposition") / "order" +
+ P("position") / "l" + -- is element in finalizer
P("order") / "order" +
+ P("element") / "(ll.ei or 1)" +
P("index") / "(ll.ni or 1)" +
P("match") / "(ll.mi or 1)" +
P("text") / "(ll.dt[1] or '')" +
@@ -6441,6 +6547,29 @@ end
xml.include = include
+--~ local function manipulate(xmldata,pattern,manipulator) -- untested and might go away
+--~ local collected = xmlparseapply({ xmldata },pattern)
+--~ if collected then
+--~ local xmltostring = xml.tostring
+--~ for c=1,#collected do
+--~ local e = collected[c]
+--~ local data = manipulator(xmltostring(e))
+--~ if data == "" then
+--~ epdt[e.ni] = ""
+--~ else
+--~ local xi = xmlinheritedconvert(data,xmldata)
+--~ if not xi then
+--~ epdt[e.ni] = ""
+--~ else
+--~ epdt[e.ni] = xml.body(xi) -- xml.assign(d,k,xi)
+--~ end
+--~ end
+--~ end
+--~ end
+--~ end
+
+--~ xml.manipulate = manipulate
+
function xml.strip_whitespace(root, pattern, nolines) -- strips all leading and trailing space !
local collected = xmlparseapply({ root },pattern)
if collected then
diff --git a/scripts/context/stubs/unix/mtxrun b/scripts/context/stubs/unix/mtxrun
index 6e5d1a848..8a2d7a123 100755
--- a/scripts/context/stubs/unix/mtxrun
+++ b/scripts/context/stubs/unix/mtxrun
@@ -1877,6 +1877,7 @@ elseif os.type == "windows" then
elseif name == "linux" then
function os.resolvers.platform(t,k)
+ -- we sometims have HOSTTYPE set so let's check that first
local platform, architecture = "", os.getenv("HOSTTYPE") or os.resultof("uname -m") or ""
if find(architecture,"x86_64") then
platform = "linux-64"
@@ -1890,14 +1891,28 @@ elseif name == "linux" then
return platform
end
-elseif name == "macosx" then -- a rather inconsistent mess
+elseif name == "macosx" then
+
+ --[[
+ Identifying the architecture of OSX is quite a mess and this
+ is the best we can come up with. For some reason $HOSTTYPE is
+ a kind of pseudo environment variable, not known to the current
+ environment. And yes, uname cannot be trusted either, so there
+ is a change that you end up with a 32 bit run on a 64 bit system.
+ Also, some proper 64 bit intel macs are too cheap (low-end) and
+ therefore not permitted to run the 64 bit kernel.
+ ]]--
function os.resolvers.platform(t,k)
- local platform, architecture = "", os.getenv("HOSTTYPE") or ""
+ -- local platform, architecture = "", os.getenv("HOSTTYPE") or ""
+ -- if architecture == "" then
+ -- architecture = os.resultof("echo $HOSTTYPE") or ""
+ -- end
+ local platform, architecture = "", os.resultof("echo $HOSTTYPE") or ""
if architecture == "" then
- architecture = os.resultof("echo $HOSTTYPE") or ""
- end
- if find(architecture,"i386") then
+ -- print("\nI have no clue what kind of OSX you're running so let's assume an 32 bit intel.\n")
+ platform = "osx-intel"
+ elseif find(architecture,"i386") then
platform = "osx-intel"
elseif find(architecture,"x86_64") then
platform = "osx-64"
@@ -1973,8 +1988,10 @@ function os.uuid()
)
end
+local d
+
function os.timezone(delta)
- local d = tonumber(tonumber(os.date("%H")-os.date("!%H")))
+ d = d or tonumber(tonumber(os.date("%H")-os.date("!%H")))
if delta then
if d > 0 then
return format("+%02i:00",d)
@@ -3854,7 +3871,7 @@ element.
local nsremap, resolvens = xml.xmlns, xml.resolvens
local stack, top, dt, at, xmlns, errorstr, entities = { }, { }, { }, { }, { }, nil, { }
-local strip, cleanup, utfize, resolve = false, false, false, false
+local strip, cleanup, utfize, resolve, keep = false, false, false, false, false
local dcache, hcache, acache = { }, { }, { }
local mt = { }
@@ -3951,7 +3968,7 @@ local function add_special(what, spacing, text)
if strip and (what == "@cm@" or what == "@dt@") then
-- forget it
else
- dt[#dt+1] = { special=true, ns="", tg=what, dt={text} }
+ dt[#dt+1] = { special=true, ns="", tg=what, dt={ text } }
end
end
@@ -4057,11 +4074,22 @@ local parsedentity =
xml.parsedentitylpeg = parsedentity
+local predefined = {
+ amp = "&",
+ lt = "<",
+ gt = "<",
+ quot = '"',
+ apos = "'",
+}
+
local function handle_any_entity(str)
if resolve then
local a = acache[str] -- per instance ! todo
if not a then
- if type(resolve) == "function" then
+ a = not keep and predefined[str]
+ if a then
+ -- one of the predefined
+ elseif type(resolve) == "function" then
a = resolve(str) or entities[str]
else
a = entities[str]
@@ -4100,13 +4128,23 @@ local function handle_any_entity(str)
if trace_entities then
logs.report("xml","found entity &%s;",str)
end
- a = "&" .. str .. ";"
- acache[str] = a
+ a = not keep and predefined[str]
+ if a then
+ -- one of the predefined
+ acache[str] = a
+ else
+ a = "&" .. str .. ";"
+ acache[str] = a
+ end
end
return a
end
end
+local function handle_end_entity(chr)
+ logs.report("xml","error in entity, %q found instead of ';'",chr)
+end
+
local space = S(' \r\n\t')
local open = P('<')
local close = P('>')
@@ -4127,12 +4165,15 @@ local utfbom = P('\000\000\254\255') + P('\255\254\000\000') +
local spacing = C(space^0)
-local entitycontent = (1-open-semicolon)^0
+----- entitycontent = (1-open-semicolon)^0
+local anyentitycontent = (1-open-semicolon-space-close)^0
+local hexentitycontent = R("AF","af","09")^0
+local decentitycontent = R("09")^0
local parsedentity = P("#")/"" * (
- P("x")/"" * (entitycontent/handle_hex_entity) +
- (entitycontent/handle_dec_entity)
- ) + (entitycontent/handle_any_entity)
-local entity = ampersand/"" * parsedentity * (semicolon/"")
+ P("x")/"" * (hexentitycontent/handle_hex_entity) +
+ (decentitycontent/handle_dec_entity)
+ ) + (anyentitycontent/handle_any_entity)
+local entity = ampersand/"" * parsedentity * ( (semicolon/"") + #(P(1)/handle_end_entity))
local text_unparsed = C((1-open)^1)
local text_parsed = Cs(((1-open-ampersand)^1 + entity)^1)
@@ -4229,11 +4270,14 @@ local grammar_unparsed_text = P { "preamble",
children = unparsedtext + V("parent") + emptyelement + comment + cdata + instruction,
}
+-- maybe we will add settinsg to result as well
+
local function xmlconvert(data, settings)
settings = settings or { } -- no_root strip_cm_and_dt given_entities parent_root error_handler
strip = settings.strip_cm_and_dt
utfize = settings.utfize_entities
resolve = settings.resolve_entities
+ keep = settings.keep_predefined_entities
cleanup = settings.text_cleanup
stack, top, at, xmlns, errorstr, result, entities = { }, { }, { }, { }, nil, nil, settings.entities or { }
acache, hcache, dcache = { }, { }, { } -- not stored
@@ -4264,7 +4308,7 @@ local function xmlconvert(data, settings)
errorstr = "invalid xml file - no text at all"
end
if errorstr and errorstr ~= "" then
- result = { dt = { { ns = "", tg = "error", dt = { errorstr }, at={}, er = true } } }
+ result = { dt = { { ns = "", tg = "error", dt = { errorstr }, at={ }, er = true } } }
setmetatable(stack, mt)
local error_handler = settings.error_handler
if error_handler == false then
@@ -4279,13 +4323,14 @@ local function xmlconvert(data, settings)
result = stack[1]
end
if not settings.no_root then
- result = { special = true, ns = "", tg = '@rt@', dt = result.dt, at={}, entities = entities, settings = settings }
+ result = { special = true, ns = "", tg = '@rt@', dt = result.dt, at={ }, entities = entities, settings = settings }
setmetatable(result, mt)
local rdt = result.dt
for k=1,#rdt do
local v = rdt[k]
if type(v) == "table" and not v.special then -- always table -)
result.ri = k -- rootindex
+v.__p__ = result -- new, experiment, else we cannot go back to settings, we need to test this !
break
end
end
@@ -4721,12 +4766,37 @@ xml.string = xmlstring
A few helpers:
--ldx]]--
+--~ xmlsetproperty(root,"settings",settings)
+
+function xml.settings(e)
+ while e do
+ local s = e.settings
+ if s then
+ return s
+ else
+ e = e.__p__
+ end
+ end
+ return nil
+end
+
+function xml.root(e)
+ local r = e
+ while e do
+ e = e.__p__
+ if e then
+ r = e
+ end
+ end
+ return r
+end
+
function xml.parent(root)
return root.__p__
end
function xml.body(root)
- return (root.ri and root.dt[root.ri]) or root
+ return (root.ri and root.dt[root.ri]) or root -- not ok yet
end
function xml.name(root)
@@ -4772,6 +4842,24 @@ function xml.assign(dt,k,root)
end
end
+--[[ldx--
+The next helper assigns a tree (or string). Usage:
+
+xml.tocdata(e)
+xml.tocdata(e,"error")
+
+--ldx]]--
+
+function xml.tocdata(e,wrapper)
+ local whatever = xmltostring(e.dt)
+ if wrapper then
+ whatever = format("<%s>%s%s>",wrapper,whatever,wrapper)
+ end
+ local t = { special = true, ns = "", tg = "@cd@", at = {}, rn = "", dt = { whatever }, __p__ = e }
+ setmetatable(t,getmetatable(e))
+ e.dt = { t }
+end
+
end -- of closure
@@ -4920,14 +5008,19 @@ end
apply_axis['child'] = function(list)
local collected = { }
for l=1,#list do
- local dt = list[l].dt
+ local ll = list[l]
+ local dt = ll.dt
+local en = 0
for k=1,#dt do
local dk = dt[k]
if dk.tg then
collected[#collected+1] = dk
dk.ni = k -- refresh
+en = en + 1
+dk.ei = en
end
end
+ll.en = en
end
return collected
end
@@ -4935,14 +5028,18 @@ end
local function collect(list,collected)
local dt = list.dt
if dt then
+local en = 0
for k=1,#dt do
local dk = dt[k]
if dk.tg then
collected[#collected+1] = dk
dk.ni = k -- refresh
+en = en + 1
+dk.ei = en
collect(dk,collected)
end
end
+list.en = en
end
end
apply_axis['descendant'] = function(list)
@@ -4956,14 +5053,18 @@ end
local function collect(list,collected)
local dt = list.dt
if dt then
+local en = 0
for k=1,#dt do
local dk = dt[k]
if dk.tg then
collected[#collected+1] = dk
dk.ni = k -- refresh
+en = en + 1
+dk.ei = en
collect(dk,collected)
end
end
+list.en = en
end
end
apply_axis['descendant-or-self'] = function(list)
@@ -5220,7 +5321,7 @@ local function apply_expression(list,expression,order)
quit_expression = false
for l=1,#list do
local ll = list[l]
- if expression(list,ll,l,order) then -- nasty, alleen valid als n=1
+ if expression(list,ll,l,order) then -- nasty, order alleen valid als n=1
collected[#collected+1] = ll
end
if quit_expression then
@@ -5241,11 +5342,16 @@ local lp_or = P("|") / " or "
local lp_and = P("&") / " and "
local lp_builtin = P (
+P("firstindex") / "1" +
+P("lastindex") / "(#ll.__p__.dt or 1)" +
+P("firstelement") / "1" +
+P("lastelement") / "(ll.__p__.en or 1)" +
P("first") / "1" +
P("last") / "#list" +
- P("position") / "l" + -- is element in finalizer
P("rootposition") / "order" +
+ P("position") / "l" + -- is element in finalizer
P("order") / "order" +
+ P("element") / "(ll.ei or 1)" +
P("index") / "(ll.ni or 1)" +
P("match") / "(ll.mi or 1)" +
P("text") / "(ll.dt[1] or '')" +
@@ -6441,6 +6547,29 @@ end
xml.include = include
+--~ local function manipulate(xmldata,pattern,manipulator) -- untested and might go away
+--~ local collected = xmlparseapply({ xmldata },pattern)
+--~ if collected then
+--~ local xmltostring = xml.tostring
+--~ for c=1,#collected do
+--~ local e = collected[c]
+--~ local data = manipulator(xmltostring(e))
+--~ if data == "" then
+--~ epdt[e.ni] = ""
+--~ else
+--~ local xi = xmlinheritedconvert(data,xmldata)
+--~ if not xi then
+--~ epdt[e.ni] = ""
+--~ else
+--~ epdt[e.ni] = xml.body(xi) -- xml.assign(d,k,xi)
+--~ end
+--~ end
+--~ end
+--~ end
+--~ end
+
+--~ xml.manipulate = manipulate
+
function xml.strip_whitespace(root, pattern, nolines) -- strips all leading and trailing space !
local collected = xmlparseapply({ root },pattern)
if collected then
diff --git a/tex/context/base/back-pdf.mkiv b/tex/context/base/back-pdf.mkiv
index 146025716..81f0d3ce4 100644
--- a/tex/context/base/back-pdf.mkiv
+++ b/tex/context/base/back-pdf.mkiv
@@ -29,7 +29,7 @@
\pdfpkresolution = 600
\pdfdecimaldigits = 10
\pdfinclusionerrorlevel = 0
-\pdfminorversion = 5
+\pdfminorversion = 6 % maybe even 7
%pdfuniqueresname = 1
%D This one can be consulted by users although the suffix is also
diff --git a/tex/context/base/cont-new.tex b/tex/context/base/cont-new.tex
index 51b99e3fd..15542b66c 100644
--- a/tex/context/base/cont-new.tex
+++ b/tex/context/base/cont-new.tex
@@ -11,7 +11,7 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-\newcontextversion{2010.02.01 11:19}
+\newcontextversion{2010.02.03 23:06}
%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.tex b/tex/context/base/context.tex
index c6c4b7521..ac06bfa14 100644
--- a/tex/context/base/context.tex
+++ b/tex/context/base/context.tex
@@ -20,7 +20,7 @@
%D your styles an modules.
\edef\contextformat {\jobname}
-\edef\contextversion{2010.02.01 11:19}
+\edef\contextversion{2010.02.03 23:06}
%D For those who want to use this:
diff --git a/tex/context/base/lpdf-mis.lua b/tex/context/base/lpdf-mis.lua
index 1820331f2..429011cc8 100644
--- a/tex/context/base/lpdf-mis.lua
+++ b/tex/context/base/lpdf-mis.lua
@@ -41,12 +41,8 @@ local pdfreserveobj = pdf.reserveobj
local pdfimmediateobj = pdf.immediateobj
local tobasepoints = number.tobasepoints
-
local variables = interfaces.variables
-lpdf.addtoinfo ("Trapped", pdfconstant("False")) -- '/Trapped' in /Info, 'Trapped' in XMP
-lpdf.addtocatalog("Version", pdfconstant(format("1.%s",tex.pdfminorversion)))
-
--
local positive = register(pdfliteral("/GSpositive gs"))
@@ -265,6 +261,8 @@ local function documentspecification()
if fit then
lpdf.addtocatalog("ViewerPreferences",fit)
end
+ lpdf.addtoinfo ("Trapped", pdfconstant("False")) -- '/Trapped' in /Info, 'Trapped' in XMP
+ lpdf.addtocatalog("Version", pdfconstant(format("1.%s",tex.pdfminorversion)))
end
end
diff --git a/tex/context/base/lxml-tab.lua b/tex/context/base/lxml-tab.lua
index 349ab0ac7..b275ef03b 100644
--- a/tex/context/base/lxml-tab.lua
+++ b/tex/context/base/lxml-tab.lua
@@ -144,7 +144,7 @@ element.
local nsremap, resolvens = xml.xmlns, xml.resolvens
local stack, top, dt, at, xmlns, errorstr, entities = { }, { }, { }, { }, { }, nil, { }
-local strip, cleanup, utfize, resolve = false, false, false, false
+local strip, cleanup, utfize, resolve, keep = false, false, false, false, false
local dcache, hcache, acache = { }, { }, { }
local mt = { }
@@ -241,7 +241,7 @@ local function add_special(what, spacing, text)
if strip and (what == "@cm@" or what == "@dt@") then
-- forget it
else
- dt[#dt+1] = { special=true, ns="", tg=what, dt={text} }
+ dt[#dt+1] = { special=true, ns="", tg=what, dt={ text } }
end
end
@@ -268,9 +268,9 @@ local function attribute_specification_error(str)
return str
end
-function xml.unknown_dec_entity_format(str) return format("&%s;", str) end
+function xml.unknown_dec_entity_format(str) return (str == "" and "&error;") or format("&%s;",str) end
function xml.unknown_hex_entity_format(str) return format("%s;",str) end
-function xml.unknown_any_entity_format(str) return format("&%s;", str) end
+function xml.unknown_any_entity_format(str) return format("%s;",str) end
local function handle_hex_entity(str)
local h = hcache[str]
@@ -347,11 +347,22 @@ local parsedentity =
xml.parsedentitylpeg = parsedentity
+local predefined = {
+ amp = "&",
+ lt = "<",
+ gt = "<",
+ quot = '"',
+ apos = "'",
+}
+
local function handle_any_entity(str)
if resolve then
local a = acache[str] -- per instance ! todo
if not a then
- if type(resolve) == "function" then
+ a = not keep and predefined[str]
+ if a then
+ -- one of the predefined
+ elseif type(resolve) == "function" then
a = resolve(str) or entities[str]
else
a = entities[str]
@@ -373,7 +384,11 @@ local function handle_any_entity(str)
if trace_entities then
logs.report("xml","keeping entity &%s;",str)
end
- a = "&" .. str .. ";"
+ if str == "" then
+ a = "&error;"
+ else
+ a = "&" .. str .. ";"
+ end
end
end
acache[str] = a
@@ -390,13 +405,26 @@ local function handle_any_entity(str)
if trace_entities then
logs.report("xml","found entity &%s;",str)
end
- a = "&" .. str .. ";"
- acache[str] = a
+ a = not keep and predefined[str]
+ if a then
+ -- one of the predefined
+ acache[str] = a
+ elseif str == "" then
+ a = "&error;"
+ acache[str] = a
+ else
+ a = "&" .. str .. ";"
+ acache[str] = a
+ end
end
return a
end
end
+local function handle_end_entity(chr)
+ logs.report("xml","error in entity, %q found instead of ';'",chr)
+end
+
local space = S(' \r\n\t')
local open = P('<')
local close = P('>')
@@ -417,12 +445,15 @@ local utfbom = P('\000\000\254\255') + P('\255\254\000\000') +
local spacing = C(space^0)
-local entitycontent = (1-open-semicolon)^0
+----- entitycontent = (1-open-semicolon)^0
+local anyentitycontent = (1-open-semicolon-space-close)^0
+local hexentitycontent = R("AF","af","09")^0
+local decentitycontent = R("09")^0
local parsedentity = P("#")/"" * (
- P("x")/"" * (entitycontent/handle_hex_entity) +
- (entitycontent/handle_dec_entity)
- ) + (entitycontent/handle_any_entity)
-local entity = ampersand/"" * parsedentity * (semicolon/"")
+ P("x")/"" * (hexentitycontent/handle_hex_entity) +
+ (decentitycontent/handle_dec_entity)
+ ) + (anyentitycontent/handle_any_entity)
+local entity = ampersand/"" * parsedentity * ( (semicolon/"") + #(P(1)/handle_end_entity))
local text_unparsed = C((1-open)^1)
local text_parsed = Cs(((1-open-ampersand)^1 + entity)^1)
@@ -526,6 +557,7 @@ local function xmlconvert(data, settings)
strip = settings.strip_cm_and_dt
utfize = settings.utfize_entities
resolve = settings.resolve_entities
+ keep = settings.keep_predefined_entities
cleanup = settings.text_cleanup
stack, top, at, xmlns, errorstr, result, entities = { }, { }, { }, { }, nil, nil, settings.entities or { }
acache, hcache, dcache = { }, { }, { } -- not stored
@@ -708,7 +740,7 @@ function xml.checkbom(root) -- can be made faster
local dt, found = root.dt, false
for k=1,#dt do
local v = dt[k]
- if type(v) == "table" and v.special and v.tg == "@pi" and find(v.dt,"xml.*version=") then
+ if type(v) == "table" and v.special and v.tg == "@pi@" and find(v.dt[1],"xml.*version=") then
found = true
break
end
@@ -1089,3 +1121,39 @@ function xml.assign(dt,k,root)
return xml.body(root)
end
end
+
+-- the following helpers may move
+
+--[[ldx--
+The next helper assigns a tree (or string). Usage:
+
+xml.tocdata(e)
+xml.tocdata(e,"error")
+
+--ldx]]--
+
+function xml.tocdata(e,wrapper)
+ local whatever = xmltostring(e.dt)
+ if wrapper then
+ whatever = format("<%s>%s%s>",wrapper,whatever,wrapper)
+ end
+ local t = { special = true, ns = "", tg = "@cd@", at = {}, rn = "", dt = { whatever }, __p__ = e }
+ setmetatable(t,getmetatable(e))
+ e.dt = { t }
+end
+
+function xml.makestandalone(root)
+ if root.ri then
+ local dt = root.dt
+ for k=1,#dt do
+ local v = dt[k]
+ if type(v) == "table" and v.special and v.tg == "@pi@" then
+ local txt = v.dt[1]
+ if find(txt,"xml.*version=") then
+ v.dt[1] = txt .. " standalone='yes'"
+ break
+ end
+ end
+ end
+ end
+end
diff --git a/tex/context/base/spec-fdf.mkii b/tex/context/base/spec-fdf.mkii
index f160be874..5d180b38c 100644
--- a/tex/context/base/spec-fdf.mkii
+++ b/tex/context/base/spec-fdf.mkii
@@ -321,10 +321,10 @@
\addPDFdocumentinfo
\to \everyfirstshipout
-\def\PDFversion{1.5}
+\def\PDFversion{1.\the\pdfminorversion}
\appendtoksonce
- \def\PDFversion{1.5}%
+ \def\PDFversion{1.\the\pdfminorversion}%
\let\addPDFdocumentinfo\relax
\to \everyresetspecials
--
cgit v1.2.3