Module:Xml2lua

-- https://github.com/manoelcampos/xml2lua/blob/master/xml2lua.lua

--- @module Module providing a non-validating XML stream parser in Lua. -- --  Features: -- ========= --  --      * Tokenises well-formed XML (relatively robustly) --     * Flexible handler based event API (see below) --     * Parses all XML Infoset elements - ie. --          - Tags --         - Text --         - Comments --         - CDATA --         - XML Decl --         - Processing Instructions --         - DOCTYPE declarations --     * Provides limited well-formedness checking --       (checks for basic syntax & balanced tags only) --     * Flexible whitespace handling (selectable) --     * Entity Handling (selectable) -- --  Limitations: -- ============ --  --      * Non-validating --     * No charset handling --     * No namespace support --     * Shallow well-formedness checking only (fails --        to detect most semantic errors) -- --  API: -- ==== -- --  The parser provides a partially object-oriented API with -- functionality split into tokeniser and handler components. -- --  The handler instance is passed to the tokeniser and receives -- callbacks for each XML element processed (if a suitable handler --  function is defined). The API is conceptually similar to the -- SAX API but implemented differently. -- -- XML data is passed to the parser instance through the 'parse' -- method (Note: must be passed a single string currently) -- -- License: -- ======== -- --      This code is freely distributable under the terms of the [MIT license](LICENSE). -- -- --@author Paul Chakravarti (paulc@passtheaardvark.com) --@author Manoel Campos da Silva Filho local xml2lua = {} local XmlParser = require("Module:XmlParser")

---Recursivelly prints a table in an easy-to-ready format --@param tb The table to be printed --@param level the indentation level to start with local function printableInternal(tb, level) if tb == nil then return end level = level or 1 local spaces = string.rep(' ', level*2) for k,v in pairs(tb) do     if type(v) == "table" then print(spaces .. k)        printableInternal(v, level+1) else print(spaces .. k..'='..v)     end end end

---Instantiates a XmlParser object to parse a XML string --@param handler Handler module to be used to convert the XML string --to another formats. See the available handlers at the handler directory. -- Usually you get an instance to a handler module using, for instance: -- local handler = require("xmlhandler/tree"). --@return a XmlParser object used to parse the XML --@see XmlParser function xml2lua.parser(handler) if handler == xml2lua then error("You must call xml2lua.parse(handler) instead of xml2lua:parse(handler)") end

local options = { --Indicates if whitespaces should be striped or not stripWS = 1, expandEntities = 1, errorHandler = function(errMsg, pos) error(string.format("%s [char=%d]\n", errMsg or "Parse Error", pos)) end }

return XmlParser.new(handler, options) end

---Recursivelly prints a table in an easy-to-ready format --@param tb The table to be printed function xml2lua.printable(tb) printableInternal(tb) end

---Handler to generate a string prepresentation of a table --Convenience function for printHandler (Does not support recursive tables). --@param t Table to be parsed --@return a string representation of the table function xml2lua.toString(t) local sep = '' local res = '' if type(t) ~= 'table' then return t   end

for k,v in pairs(t) do       if type(v) == 'table' then v = xml2lua.toString(v) end res = res .. sep .. string.format("%s=%s", k, v)           sep = ',' end res = '{'..res..'}'

return res end

--- Loads an XML file from a specified path -- @param xmlFilePath the path for the XML file to load -- @return the XML loaded file content function xml2lua.loadFile(xmlFilePath) local f, e = io.open(xmlFilePath, "r") if f then --Gets the entire file content and stores into a string return f:read("*a") end error(e) end

return xml2lua