diff options
Diffstat (limited to 'util/stanza.lua')
-rw-r--r-- | util/stanza.lua | 66 |
1 files changed, 37 insertions, 29 deletions
diff --git a/util/stanza.lua b/util/stanza.lua index 3e76bd89..86ec458b 100644 --- a/util/stanza.lua +++ b/util/stanza.lua @@ -11,7 +11,6 @@ local error = error; local t_insert = table.insert; local t_remove = table.remove; local t_concat = table.concat; -local s_format = string.format; local s_match = string.match; local tostring = tostring; local setmetatable = setmetatable; @@ -491,38 +490,47 @@ end if do_pretty_printing then local getstyle, getstring = termcolours.getstyle, termcolours.getstring; - local style_attrk = getstyle("yellow"); - local style_attrv = getstyle("red"); - local style_tagname = getstyle("red"); - local style_punc = getstyle("magenta"); - - local attr_format = " "..getstring(style_attrk, "%s")..getstring(style_punc, "=")..getstring(style_attrv, "'%s'"); - local top_tag_format = getstring(style_punc, "<")..getstring(style_tagname, "%s").."%s"..getstring(style_punc, ">"); - --local tag_format = getstring(style_punc, "<")..getstring(style_tagname, "%s").."%s"..getstring(style_punc, ">").."%s"..getstring(style_punc, "</")..getstring(style_tagname, "%s")..getstring(style_punc, ">"); - local tag_format = top_tag_format.."%s"..getstring(style_punc, "</")..getstring(style_tagname, "%s")..getstring(style_punc, ">"); - function stanza_mt.pretty_print(t) - local children_text = ""; - for _, child in ipairs(t) do - if type(child) == "string" then - children_text = children_text .. xml_escape(child); - else - children_text = children_text .. child:pretty_print(); - end - end - local attr_string = ""; - if t.attr then - for k, v in pairs(t.attr) do if type(k) == "string" then attr_string = attr_string .. s_format(attr_format, k, tostring(v)); end end - end - return s_format(tag_format, t.name, attr_string, children_text, t.name); + local blue1 = getstyle("1b3967"); + local blue2 = getstyle("13b5ea"); + local green1 = getstyle("439639"); + local green2 = getstyle("a0ce67"); + local orange1 = getstyle("d9541e"); + local orange2 = getstyle("e96d1f"); + + local attr_replace = ( + getstring(green2, "%1") .. -- attr name + getstring(green1, "%2") .. -- equal + getstring(orange1, "%3") .. -- quote + getstring(orange2, "%4") .. -- attr value + getstring(orange1, "%5") -- quote + ); + + local text_replace = ( + getstring(green1, "%1") .. -- & + getstring(green2, "%2") .. -- amp + getstring(green1, "%3") -- ; + ); + + local function pretty(s) + -- Tag soup color + -- Outer gsub call takes each <tag>, applies colour to the brackets, the + -- tag name, then applies one inner gsub call to colour the attributes and + -- another for any text content. + return (s:gsub("(</?)([^ >]*)(.-)([?/]?>)([^<]*)", function(opening_bracket, tag_name, attrs, closing_bracket, content) + return getstring(blue1, opening_bracket)..getstring(blue2, tag_name).. + attrs:gsub("([^=]+)(=)([\"'])(.-)([\"'])", attr_replace) .. + getstring(blue1, closing_bracket) .. + content:gsub("(&#?)(%w+)(;)", text_replace); + end, 100)); + end + + function stanza_mt.pretty_print(t) + return pretty(tostring(t)); end function stanza_mt.pretty_top_tag(t) - local attr_string = ""; - if t.attr then - for k, v in pairs(t.attr) do if type(k) == "string" then attr_string = attr_string .. s_format(attr_format, k, tostring(v)); end end - end - return s_format(top_tag_format, t.name, attr_string); + return pretty(t:top_tag()); end else -- Sorry, fresh out of colours for you guys ;) |