diff options
| -rw-r--r-- | lib/xmllib.lua | 58 | 
1 files changed, 43 insertions, 15 deletions
| diff --git a/lib/xmllib.lua b/lib/xmllib.lua index c3d6358..1ef0f33 100644 --- a/lib/xmllib.lua +++ b/lib/xmllib.lua @@ -1,16 +1,38 @@ +local xml_remplacements = { +    { "&", "&" }, +    { "<", "<" }, +    { ">", ">" }, +} + +local attribute_replacements = { +    { '"', '\\"' }, +} + +local function generic_escape(str, remplacements) +    local _, r +     +    for _, r in pairs(xml_replacements) do +        str = string.gsub(str, r[1], r[2]) +    end +end +  local function xml_escape(str) -    return string.gsub(str, "&", "&") +    return generic_escape(str, xml_replacements) +end + +local function attribute_replacements(str) +    return generic_escape(str, attribute_replacements)  end -local function process_comment(table, a) +local function process_comment(xm, a)      return "<!-- " .. a .. " -->"  end -local function process_tag(table, key, a) -    local middle, options, options_str, k, v, b +local function process_tag(xm, key, a) +    local middle, attrs, attrs_str, k, v, b      middle = "" -    options = {} +    attrs = {}      if type(a) == "table" then          for k, v in ipairs(a) do @@ -18,7 +40,7 @@ local function process_tag(table, key, a)          end          for k, v in pairs(a) do              if (type(k) == "string") then -                options[k] = string.gsub(v, '"', '\\"') +                attrs[k] = attribute_replacements(xml_replacements(v))              end          end      elseif type(a) == "string" then @@ -26,24 +48,24 @@ local function process_tag(table, key, a)      end      if middle ~= "" then -        options_str = "" -        for k, v in pairs(options) do +        attrs_str = "" +        for k, v in pairs(attrs) do              if (v == "") then -                options_str = " " .. options_str .. k +                attrs_str = " " .. attrs_str .. k              else -                options_str = " " .. options_str .. k .. '="' .. v .. '"' +                attrs_str = " " .. attrs_str .. k .. '="' .. v .. '"'              end          end -        return "<" .. key .. options_str .. ">" .. middle .. "</" .. key .. ">" +        return "<" .. key .. attrs_str .. ">" .. middle .. "</" .. key .. ">"      else          return "<" .. key .. " />"      end  end  local xmlmarkup_metatable = { -    __index = function(table, key) +    __index = function(xm, key)          local k = key -        return function(t, a) return process_tag(t, k, a) end +        return function(xm, a) return process_tag(xm, k, a) end      end  } @@ -57,11 +79,17 @@ function NewXmlMarkup()      return r  end ---[[ + +--[[ example of use: + +-- result is: +-- <html><head><title>Test</title></head><body bgcolor="#ffeedd">Normal test<br /><b>Bold test.</b><!-- Hi there... --></body></html> +  xm = NewXmlMarkup() -s = xm:html { +s = +xm:html {      xm:head {          xm:title "Test"      }, | 
