|
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 |