61 lines
1.4 KiB
Lua
Executable File
61 lines
1.4 KiB
Lua
Executable File
-- See Copyright Notice in license.html
|
|
-- $Id: lom.lua,v 1.6 2005/06/09 19:18:40 tuler Exp $
|
|
|
|
require "lxp"
|
|
|
|
local tinsert, tremove, getn = table.insert, table.remove, table.getn
|
|
local assert, type, print = assert, type, print
|
|
local lxp = lxp
|
|
|
|
module ("lxp.lom")
|
|
|
|
local function starttag (p, tag, attr)
|
|
local stack = p:getcallbacks().stack
|
|
local newelement = {tag = tag, attr = attr}
|
|
tinsert(stack, newelement)
|
|
end
|
|
|
|
local function endtag (p, tag)
|
|
local stack = p:getcallbacks().stack
|
|
local element = tremove(stack)
|
|
assert(element.tag == tag)
|
|
local level = getn(stack)
|
|
tinsert(stack[level], element)
|
|
end
|
|
|
|
local function text (p, txt)
|
|
local stack = p:getcallbacks().stack
|
|
local element = stack[getn(stack)]
|
|
local n = getn(element)
|
|
if type(element[n]) == "string" then
|
|
element[n] = element[n] .. txt
|
|
else
|
|
tinsert(element, txt)
|
|
end
|
|
end
|
|
|
|
function parse (o)
|
|
local c = { StartElement = starttag,
|
|
EndElement = endtag,
|
|
CharacterData = text,
|
|
_nonstrict = true,
|
|
stack = {{}}
|
|
}
|
|
local p = lxp.new(c)
|
|
local status, err
|
|
if type(o) == "string" then
|
|
status, err = p:parse(o)
|
|
if not status then return nil, err end
|
|
else
|
|
for l in o do
|
|
status, err = p:parse(l)
|
|
if not status then return nil, err end
|
|
end
|
|
end
|
|
status, err = p:parse()
|
|
if not status then return nil, err end
|
|
p:close()
|
|
return c.stack[1][1]
|
|
end
|
|
|