summaryrefslogtreecommitdiff
path: root/tex/context/base/lxml-aux.lua
diff options
context:
space:
mode:
authorHans Hagen <pragma@wxs.nl>2009-11-07 17:59:00 +0100
committerHans Hagen <pragma@wxs.nl>2009-11-07 17:59:00 +0100
commit128e5756b60274b62fa31304324abd31c48d711a (patch)
tree017c6ef0e011a1d0be8091942af0044ed9779c13 /tex/context/base/lxml-aux.lua
parentf903426253431aaaf98c55ba9567d67a0193df65 (diff)
downloadcontext-128e5756b60274b62fa31304324abd31c48d711a.tar.gz
beta 2009.11.07 17:59
Diffstat (limited to 'tex/context/base/lxml-aux.lua')
-rw-r--r--tex/context/base/lxml-aux.lua84
1 files changed, 63 insertions, 21 deletions
diff --git a/tex/context/base/lxml-aux.lua b/tex/context/base/lxml-aux.lua
index 9eab06e45..e52b3f629 100644
--- a/tex/context/base/lxml-aux.lua
+++ b/tex/context/base/lxml-aux.lua
@@ -17,6 +17,21 @@ local type = type
local insert, remove = table.insert, table.remove
local gmatch, gsub = string.gmatch, string.gsub
+
+function xml.inheritedconvert(data,xmldata)
+ local settings = xmldata.settings
+ settings.parent_root = xmldata -- to be tested
+--~ settings.no_root = true
+ local xc = xmlconvert(data,settings)
+--~ xc.settings = nil
+--~ xc.entities = nil
+--~ xc.special = nil
+--~ xc.ri = nil
+--~ print(xc.tg)
+-- for k,v in pairs(xc) do print(k,tostring(v)) end
+ return xc
+end
+
local function withelements(e,handle,depth)
if e and handle then
local edt = e.dt
@@ -144,24 +159,33 @@ end
local no_root = { no_root = true }
+function xml.redo_ni(d)
+ for k=1,#d do
+ local dk = d[k]
+ if type(dk) == "table" then
+ dk.ni = k
+ end
+ end
+end
+
function xml.inject_element(root, pattern, element, prepend)
if root and element then
if type(element) == "string" then
- element = xmlconvert(element,no_root)
+--~ element = xmlconvert(element,no_root)
+ element = xml.inheritedconvert(element,root)
end
if element then
+ if element.ri then
+ element = element.dt[element.ri].dt
+ else
+ element = element.dt
+ end
+ -- we need to re-index
local collected = xmlparseapply({ root },pattern)
if collected then
for c=1,#collected do
local e = collected[c]
- local r = e.__p__
- local d = r.dt
- local k = e.ni
- if element.ri then
- element = element.dt[element.ri].dt
- else
- element = element.dt
- end
+ local r, d, k = e.__p__, r.dt, e.ni
local edt
if r.ri then
edt = r.dt[r.ri].dt
@@ -172,8 +196,11 @@ function xml.inject_element(root, pattern, element, prepend)
local be, af
if prepend then
be, af = xmlcopy(element), edt
+be.__p__ = e
+
else
be, af = edt, xmlcopy(element)
+af.__p__ = e
end
for i=1,#af do
be[#be+1] = af[i]
@@ -186,6 +213,7 @@ function xml.inject_element(root, pattern, element, prepend)
else
-- r.dt = element.dt -- todo
end
+xml.redo_ni(d)
end
end
end
@@ -201,7 +229,8 @@ function xml.insert_element(root, pattern, element, before) -- todo: element als
else
local matches, collect = { }, nil
if type(element) == "string" then
- element = xmlconvert(element,true)
+--~ element = xmlconvert(element,no_root)
+ element = xml.inheritedconvert(element,root)
end
if element and element.ri then
element = element.dt[element.ri]
@@ -217,17 +246,25 @@ function xml.insert_element(root, pattern, element, before) -- todo: element als
if not before then
k = k + 1
end
+ local ce = xmlcopy(element)
+ce.__p__ = r
if element.tg then
- insert(d,k,element) -- untested
+ insert(d,k,ce) -- untested
else
- local edt = element.dt
+ -- maybe bugged
+ local edt = ce.dt
if edt then
for i=1,#edt do
- insert(d,k,edt[i])
+local edti = edt[i]
+ insert(d,k,edti)
+if type(edti) == "table" then
+ edti.__p__ = r
+end
k = k + 1
end
end
end
+xml.redo_ni(d)
end
end
end
@@ -252,10 +289,11 @@ function xml.delete_element(root, pattern)
local p = e.__p__
if p then
if trace_manipulations then
- report('deleting',pattern,c,e)
+ report('deleting',pattern,c,tostring(e)) -- fails
end
- remove(p.dt,e.ni)
- e.ni = nil
+ local d = p.dt
+ remove(d,e.ni)
+xml.redo_ni(d)
end
end
end
@@ -263,7 +301,8 @@ end
function xml.replace_element(root, pattern, element)
if type(element) == "string" then
- element = xmlconvert(element,true)
+--~ element = xmlconvert(element,true)
+ element = xml.inheritedconvert(element,root)
end
if element and element.ri then
element = element.dt[element.ri]
@@ -278,7 +317,9 @@ function xml.replace_element(root, pattern, element)
if trace_manipulations then
report('replacing',pattern,c,e)
end
- p.dt[e.ni] = element.dt -- maybe not clever enough
+ local d = p.dt
+ d[e.ni] = element.dt -- maybe not clever enough
+--~ xml.redo_ni(d)
end
end
end
@@ -314,9 +355,10 @@ local function include(xmldata,pattern,attribute,recursive,loaddata)
-- for the moment hard coded
epdt[ek.ni] = xml.escaped(data) -- d[k] = xml.escaped(data)
else
- local settings = xmldata.settings
- settings.parent_root = xmldata -- to be tested
- local xi = xmlconvert(data,settings)
+--~ local settings = xmldata.settings
+--~ settings.parent_root = xmldata -- to be tested
+--~ local xi = xmlconvert(data,settings)
+ local xi = xml.inheritedconvert(element,xmldata)
if not xi then
epdt[ek.ni] = "" -- xml.empty(d,k)
else