Comparison

tools/migration/migrator/jabberd14.lua @ 5218:8350eaa3f3f3

tools/migration/migrator/jabberd14: Use util.xml.
author Waqas Hussain <waqas20@gmail.com>
date Mon, 03 Dec 2012 05:44:48 +0500
parent 4445:0434eb77d18c
child 7881:4e3067272fae
comparison
equal deleted inserted replaced
5217:f2becd36d1d0 5218:8350eaa3f3f3
1 1
2 local lfs = require "lfs"; 2 local lfs = require "lfs";
3 local lxp = require "lxp";
4 local st = require "util.stanza"; 3 local st = require "util.stanza";
4 local parse_xml = require "util.xml".parse;
5 local os_getenv = os.getenv; 5 local os_getenv = os.getenv;
6 local io_open = io.open; 6 local io_open = io.open;
7 local assert = assert; 7 local assert = assert;
8 local ipairs = ipairs; 8 local ipairs = ipairs;
9 local coroutine = coroutine; 9 local coroutine = coroutine;
14 local function is_dir(path) return lfs.attributes(path, "mode") == "directory"; end 14 local function is_dir(path) return lfs.attributes(path, "mode") == "directory"; end
15 local function is_file(path) return lfs.attributes(path, "mode") == "file"; end 15 local function is_file(path) return lfs.attributes(path, "mode") == "file"; end
16 local function clean_path(path) 16 local function clean_path(path)
17 return path:gsub("\\", "/"):gsub("//+", "/"):gsub("^~", os_getenv("HOME") or "~"); 17 return path:gsub("\\", "/"):gsub("//+", "/"):gsub("^~", os_getenv("HOME") or "~");
18 end 18 end
19
20 local parse_xml = (function()
21 local ns_prefixes = {
22 ["http://www.w3.org/XML/1998/namespace"] = "xml";
23 };
24 local ns_separator = "\1";
25 local ns_pattern = "^([^"..ns_separator.."]*)"..ns_separator.."?(.*)$";
26 return function(xml)
27 local handler = {};
28 local stanza = st.stanza("root");
29 function handler:StartElement(tagname, attr)
30 local curr_ns,name = tagname:match(ns_pattern);
31 if name == "" then
32 curr_ns, name = "", curr_ns;
33 end
34 if curr_ns ~= "" then
35 attr.xmlns = curr_ns;
36 end
37 for i=1,#attr do
38 local k = attr[i];
39 attr[i] = nil;
40 local ns, nm = k:match(ns_pattern);
41 if nm ~= "" then
42 ns = ns_prefixes[ns];
43 if ns then
44 attr[ns..":"..nm] = attr[k];
45 attr[k] = nil;
46 end
47 end
48 end
49 stanza:tag(name, attr);
50 end
51 function handler:CharacterData(data)
52 stanza:text(data);
53 end
54 function handler:EndElement(tagname)
55 stanza:up();
56 end
57 local parser = lxp.new(handler, "\1");
58 local ok, err, line, col = parser:parse(xml);
59 if ok then ok, err, line, col = parser:parse(); end
60 --parser:close();
61 if ok then
62 return stanza.tags[1];
63 else
64 return ok, err.." (line "..line..", col "..col..")";
65 end
66 end;
67 end)();
68 19
69 local function load_xml(path) 20 local function load_xml(path)
70 local f, err = io_open(path); 21 local f, err = io_open(path);
71 if not f then return f, err; end 22 if not f then return f, err; end
72 local data = f:read("*a"); 23 local data = f:read("*a");