src/lxp/lom.lua

changeset 0
24d141cb2d1e
child 10
e981a82571cf
equal deleted inserted replaced
-1:000000000000 0:24d141cb2d1e
1 -- See Copyright Notice in license.html
2 -- $Id: lom.lua,v 1.6 2005/06/09 19:18:40 tuler Exp $
3
4 require "lxp"
5
6 local tinsert, tremove, getn = table.insert, table.remove, table.getn
7 local assert, type, print = assert, type, print
8 local lxp = lxp
9
10 module ("lxp.lom")
11
12 local function starttag (p, tag, attr)
13 local stack = p:getcallbacks().stack
14 local newelement = {tag = tag, attr = attr}
15 tinsert(stack, newelement)
16 end
17
18 local function endtag (p, tag)
19 local stack = p:getcallbacks().stack
20 local element = tremove(stack)
21 assert(element.tag == tag)
22 local level = getn(stack)
23 tinsert(stack[level], element)
24 end
25
26 local function text (p, txt)
27 local stack = p:getcallbacks().stack
28 local element = stack[getn(stack)]
29 local n = getn(element)
30 if type(element[n]) == "string" then
31 element[n] = element[n] .. txt
32 else
33 tinsert(element, txt)
34 end
35 end
36
37 function parse (o)
38 local c = { StartElement = starttag,
39 EndElement = endtag,
40 CharacterData = text,
41 _nonstrict = true,
42 stack = {{}}
43 }
44 local p = lxp.new(c)
45 local status, err
46 if type(o) == "string" then
47 status, err = p:parse(o)
48 if not status then return nil, err end
49 else
50 for l in o do
51 status, err = p:parse(l)
52 if not status then return nil, err end
53 end
54 end
55 status, err = p:parse()
56 if not status then return nil, err end
57 p:close()
58 return c.stack[1][1]
59 end
60

mercurial