| ------------------------------------------------------------------------------- | |
| -- Copyright (c) 2012 Sierra Wireless and others. | |
| -- All rights reserved. This program and the accompanying materials | |
| -- are made available under the terms of the Eclipse Public License v1.0 | |
| -- which accompanies this distribution, and is available at | |
| -- http://www.eclipse.org/legal/epl-v10.html | |
| -- | |
| -- Contributors: | |
| -- Sierra Wireless - initial API and implementation | |
| ------------------------------------------------------------------------------- | |
| --- @module xmlformatter | |
| local M = {} | |
| local nodetostring ={}-- a map (key=NODE_TYPE, value=conversion function) | |
| -- convert xml to table | |
| local function xmltotable(domtable,result,indent,indentlevel) | |
| local f = nodetostring[domtable._type] | |
| if f then return f(domtable,result,indent,indentlevel) end | |
| return nil | |
| end | |
| -- print ROOT in table | |
| local function roottotable(domtable,result,indent,indentlevel) | |
| for i,child in ipairs(domtable._children) do | |
| xmltotable(child,result,indent,indentlevel) | |
| end | |
| return result | |
| end | |
| -- print ELEMENT in table | |
| local function elementtotable(domtable,result,indent,indentlevel) | |
| -- detect if this element has children | |
| local havechildren = domtable._children and (#(domtable._children) > 0) | |
| -- indent if needed | |
| if indent then | |
| result[#result+1] = "\n" | |
| result[#result+1] = string.rep(" ",indentlevel) | |
| end | |
| -- open element | |
| result[#result+1] = "<" | |
| result[#result+1] = domtable._name | |
| -- print attributes | |
| if domtable._attr then | |
| for id, val in pairs(domtable._attr) do | |
| result[#result+1] = " " | |
| result[#result+1] = id | |
| result[#result+1] = "=\"" | |
| result[#result+1] = val | |
| result[#result+1] = "\"" | |
| end | |
| end | |
| -- auto close balise if needed | |
| if havechildren then | |
| result[#result+1] = ">" | |
| else | |
| result[#result+1] = "/>" | |
| end | |
| -- do not indent in a pre balise | |
| indent = indent and domtable._name ~= "pre" | |
| local indentnext = true | |
| -- print children | |
| if havechildren then | |
| for i,child in ipairs(domtable._children) do | |
| xmltotable(child,result,indent and indentnext,indentlevel+1) | |
| indentnext = child._type ~= "TEXT" | |
| end | |
| end | |
| -- close element | |
| if havechildren then | |
| if indent and indentnext then | |
| result[#result+1] = "\n" | |
| result[#result+1] = string.rep(" ",indentlevel) | |
| end | |
| result[#result+1] = "</" | |
| result[#result+1] = domtable._name | |
| result[#result+1] = ">" | |
| end | |
| return result | |
| end | |
| -- print TEXT in table | |
| local function texttotable(domtable,result,indent,indentlevel) | |
| -- just print the text | |
| result[#result+1] = domtable._text | |
| return result | |
| end | |
| nodetostring.ROOT=roottotable | |
| nodetostring.ELEMENT=elementtotable | |
| nodetostring.TEXT=texttotable | |
| ---------------------------------------------- | |
| -- @function [parent=#xmlformatter] xmltostring | |
| -- @param #table domtable return by domhandler | |
| function M.xmltostring(domtable) | |
| local result = xmltotable(domtable,{},true,0) | |
| return table.concat(result); | |
| end | |
| return M | |