--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/lxp/lom.lua Wed Jun 01 22:14:25 2011 +0100 @@ -0,0 +1,60 @@ +-- 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 +