Toggle menu
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

Module:MarkdownToWikitext

From Vault Hunters Official Wiki

Documentation for this module may be created at Module:MarkdownToWikitext/doc

local p = {}

-- Utility: unescape common HTML entities and escaped unicode sequences
local function htmlUnescape(s)
	s = s:gsub("\\u003C", "<")
	s = s:gsub("\\u003E", ">")
	s = s:gsub("&lt;", "<")
	s = s:gsub("&gt;", ">")
	s = s:gsub("&amp;", "&")
	s = s:gsub("&quot;", '"')
	s = s:gsub("&#39;", "'")
	return s
end

-- Utility: strip inline HTML (iframes, br, etc)
local function stripHTML(s)
	-- Strip iframe blocks
	s = s:gsub("<iframe.-</iframe>", "")
	-- Strip all HTML tags
	s = s:gsub("<.->", "")
	return s
end

-- Main logic for Markdown β†’ Wikitext conversion
function p._convert(markdown)
	if not markdown or markdown == "" then return "(No content)" end

	-- Unescape sequences
	markdown = htmlUnescape(markdown)
	markdown = markdown:gsub("\\n", "\n")     -- newline
	markdown = markdown:gsub("\\%-", "–")     -- dash
	markdown = markdown:gsub("\\!", "!")      -- exclamation
	markdown = markdown:gsub("\\_", "_")      -- underscores
	markdown = markdown:gsub("\\+", "+")      -- plus signs
	markdown = markdown:gsub("\\*", "*")      -- asterisks
	markdown = markdown:gsub("\\\\", "\\")    -- backslash

	-- Strip inline HTML
	markdown = stripHTML(markdown)

	-- Headings
	markdown = markdown:gsub("\n###### (.-)\n", "\n====== %1 ======\n")
	markdown = markdown:gsub("\n##### (.-)\n", "\n===== %1 =====\n")
	markdown = markdown:gsub("\n#### (.-)\n", "\n==== %1 ====\n")
	markdown = markdown:gsub("\n### (.-)\n", "\n=== %1 ===\n")
	markdown = markdown:gsub("\n## (.-)\n", "\n== %1 ==\n")
	markdown = markdown:gsub("\n# (.-)\n", "\n= %1 =\n")

	-- Bold and Italic
	markdown = markdown:gsub("%*%*%*(.-)%*%*%*", "'''''%1'''''")
	markdown = markdown:gsub("%*%*(.-)%*%*", "'''%1'''")
	markdown = markdown:gsub("%*(.-)%*", "''%1''")

	-- Nested lists: convert space-prefixed - to * with correct level
	markdown = markdown:gsub("\n([ ]*)%- ", function(indent)
		local level = math.floor(#indent / 2) + 1
		return "\n" .. string.rep("*", level) .. " "
	end)

	-- Links: [text](url) β†’ [url text]
	markdown = markdown:gsub("%[(.-)%]%((.-)%)", "[%2 %1]")

	-- Normalize line endings
	markdown = markdown:gsub("\r", "")
	markdown = markdown:gsub("\n\n\n+", "\n\n") -- Collapse extra breaks
	markdown = markdown:gsub("^%s+", "") -- Trim leading space
	markdown = markdown:gsub("%s+$", "") -- Trim trailing space

	return markdown
end

-- Entry point: used from #invoke with raw markdown string
function p.convertMarkdownToWikitext(frame)
	local markdown = frame.args[1]
	if not markdown then return "(No input received)" end
	return p._convert(markdown)
end

return p