diff options
Diffstat (limited to 'Master/texmf-dist/tex/lualatex/luamml/luamml-xmlwriter.lua')
-rw-r--r-- | Master/texmf-dist/tex/lualatex/luamml/luamml-xmlwriter.lua | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/lualatex/luamml/luamml-xmlwriter.lua b/Master/texmf-dist/tex/lualatex/luamml/luamml-xmlwriter.lua new file mode 100644 index 00000000000..a2b5abefbfb --- /dev/null +++ b/Master/texmf-dist/tex/lualatex/luamml/luamml-xmlwriter.lua @@ -0,0 +1,58 @@ +-- FIXME: Not sure yet if this will be needed +local function escape_name(name) + return name +end + +local escapes = { + ['"'] = """, + ['<'] = "<", + ['>'] = ">", + ['&'] = "&", +} +local function escape_text(text) + return string.gsub(string.gsub(tostring(text), '["<>&]', escapes), '[\x00-\x08\x0B\x0C\x0E-\x1F]', function(x) + return string.format('^^%02x', string.byte(x)) + end) +end + +local attrs = {} +local function write_elem(tree, indent) + if not tree[0] then print('ERR', require'inspect'(tree)) end + local escaped_name = escape_name(assert(tree[0])) + local i = 0 + for attr, val in next, tree do if type(attr) == 'string' then + if not string.find(attr, ':', 1, true) then + -- if string.byte(attr) ~= 0x3A then + i = i + 1 + attrs[i] = string.format(' %s="%s"', escape_name(attr), escape_text(val)) + end + end end + table.sort(attrs) + local out = string.format('%s<%s%s', indent or '', escaped_name, table.concat(attrs)) + for j = 1, i do attrs[j] = nil end + if not tree[1] then + return out .. '/>' + end + out = out .. '>' + local inner_indent = indent and indent .. ' ' + local is_string + for _, elem in ipairs(tree) do + if type(elem) == 'string' then + if inner_indent and not is_string then + out = out .. inner_indent + end + out = out .. escape_text(elem) + is_string = true + else + out = out .. write_elem(elem, inner_indent) + is_string = nil + end + end + if indent then out = out .. indent end + return out .. '</' .. escaped_name .. '>' +end + +return function(element, indent, version) + return (version == '11' and '<?xml version="1.1"?>' or '') .. + write_elem(element, indent and '\n' or nil) +end |