diff options
author | Hans Hagen <pragma@wxs.nl> | 2009-11-07 17:59:00 +0100 |
---|---|---|
committer | Hans Hagen <pragma@wxs.nl> | 2009-11-07 17:59:00 +0100 |
commit | 128e5756b60274b62fa31304324abd31c48d711a (patch) | |
tree | 017c6ef0e011a1d0be8091942af0044ed9779c13 /tex/context/base/lxml-aux.lua | |
parent | f903426253431aaaf98c55ba9567d67a0193df65 (diff) | |
download | context-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.lua | 84 |
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 |