Module:HighlightWikicode

From Soyjak Wiki, the free ensoyclopedia
Jump to navigationJump to search

local p = {}
local colors = {
	heading = "#0077aa",
	bold = "#000000",
	italic = "#000000",
	link = "#0645ad",
	template = "#dd1144",
	parameter = "#aa7700",
	tag = "#008800",
	comment = "#888888",
	variable = "#bb00bb",
	table = "#cc6600",
	list = "#0077aa"
}

local function escapeHTML(t)
	return t:gsub("&", "&amp;"):gsub("<", "&lt;"):gsub(">", "&gt;")
end

function p.highlight(frame)
	local code = frame.args[1] or ""
	code = escapeHTML(code)
	local spans = {}
	local function mark(html)
		table.insert(spans, html)
		return "\x00SPAN" .. #spans .. "\x00"
	end
	
	-- HTML comments
	code = code:gsub("(&lt;!%-%-.-%-%-%gt;)", function(c) 
		return mark('<span style="color:'..colors.comment..';">'..c..'</span>') 
	end)
	
	-- HTML/MediaWiki tags
	code = code:gsub("(&lt;/?[%a][%w:]*.-&gt;)", function(c) 
		return mark('<span style="color:'..colors.tag..';">'..c..'</span>') 
	end)
	
	-- Headings
	code = code:gsub("(==+.-==+)", function(c) 
		return mark('<span style="color:'..colors.heading..'; font-weight:bold;">'..c..'</span>') 
	end)
	
	-- Templates and parser functions
	code = code:gsub("({{.-}})", function(c)
		-- Highlight parameters inside templates
		local highlighted = c:gsub("(%|[%s]*[%w_]+[%s]*=)", function(p)
			return mark('<span style="color:'..colors.parameter..';">'..p..'</span>')
		end)
		return mark('<span style="color:'..colors.template..'; font-weight:bold;">'..highlighted..'</span>')
	end)
	
	-- Variables (magic words)
	code = code:gsub("({{{{.-}}}})", function(c) 
		return mark('<span style="color:'..colors.variable..'; font-weight:bold;">'..c..'</span>') 
	end)
	
	-- Internal links
	code = code:gsub("(%[%[.-%]%])", function(c) 
		return mark('<span style="color:'..colors.link..'; font-weight:bold;">'..c..'</span>') 
	end)
	
	-- External links
	code = code:gsub("(%[http.-%])", function(c) 
		return mark('<span style="color:'..colors.link..';">'..c..'</span>') 
	end)
	
	-- Table syntax
	code = code:gsub("({%|.-%|})", function(c) 
		return mark('<span style="color:'..colors.table..';">'..c..'</span>') 
	end)
	code = code:gsub("^(%|%-)", function(c) 
		return mark('<span style="color:'..colors.table..';">'..c..'</span>') 
	end)
	code = code:gsub("(\n%|%-)", function(c) 
		return "\n" .. mark('<span style="color:'..colors.table..';">'..c:sub(2)..'</span>') 
	end)
	code = code:gsub("^(%|)", function(c) 
		return mark('<span style="color:'..colors.table..';">'..c..'</span>') 
	end)
	code = code:gsub("(\n%|)", function(c) 
		return "\n" .. mark('<span style="color:'..colors.table..';">'..c:sub(2)..'</span>') 
	end)
	code = code:gsub("^(!)", function(c) 
		return mark('<span style="color:'..colors.table..'; font-weight:bold;">'..c..'</span>') 
	end)
	code = code:gsub("(\n!)", function(c) 
		return "\n" .. mark('<span style="color:'..colors.table..'; font-weight:bold;">'..c:sub(2)..'</span>') 
	end)
	
	-- Lists
	code = code:gsub("^([*#:;]+)", function(c) 
		return mark('<span style="color:'..colors.list..'; font-weight:bold;">'..c..'</span>') 
	end)
	code = code:gsub("(\n[*#:;]+)", function(c) 
		return "\n" .. mark('<span style="color:'..colors.list..'; font-weight:bold;">'..c:sub(2)..'</span>') 
	end)
	
	-- Bold text (after other patterns to avoid conflicts)
	code = code:gsub("('''.-''')", function(c) 
		return mark('<span style="font-weight:bold;">'..c..'</span>') 
	end)
	
	-- Italic text
	code = code:gsub("(''.-'')", function(c) 
		return mark('<span style="font-style:italic;">'..c..'</span>') 
	end)
	
	-- Replace placeholders
	code = code:gsub("\x00SPAN(%d+)\x00", function(i) return spans[tonumber(i)] or "" end)
	
	return '<pre style="background:#f8f8f8; padding:0.5em; border:1px solid #ddd; overflow-x:auto; white-space:pre-wrap;">'
		.. code ..
		'</pre>'
end

return p