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
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 tags (like iframe, br, strong, etc)
local function stripHTML(s)
	-- Remove <iframe ...>...</iframe>
	s = s:gsub("<iframe.-</iframe>", "")
	-- Remove all remaining HTML tags
	s = s:gsub("<.->", "")
	return s
end

-- Main converter
function p.convertMarkdownToWikitext(markdown)
	if not markdown then return "(No content)" end

	-- Decode escapes
	markdown = htmlUnescape(markdown)
	markdown = markdown:gsub("\\n", "\n")     -- convert escaped newlines
	markdown = markdown:gsub("\\%-", "–")     -- hyphen escape
	markdown = markdown:gsub("\\!", "!")      -- unescape exclamation
	markdown = markdown:gsub("\\_", "_")      -- keep underscores
	markdown = markdown:gsub("\\+", "+")      -- unescape pluses
	markdown = markdown:gsub("\\*", "*")      -- unescape asterisks
	markdown = markdown:gsub("\\\\", "\\")    -- backslashes

	-- 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/Italic
	markdown = markdown:gsub("%*%*%*(.-)%*%*%*", "'''''%1'''''")
	markdown = markdown:gsub("%*%*(.-)%*%*", "'''%1'''")
	markdown = markdown:gsub("%*(.-)%*", "''%1''")

	-- Lists (preserve nested indenting)
	markdown = markdown:gsub("\n[ \t]*%- ", "\n* ")

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

	-- Clean up excess line breaks
	markdown = markdown:gsub("\r", "")
	markdown = markdown:gsub("\n\n\n+", "\n\n")

	return markdown
end

-- Pull markdown from API via ExternalData
function p.renderFromAPI(frame)
	local data = mw.ext.externalData.getData{
		url = 'https://api.vaulthunters.gg/patch-notes?limit=1',
		data = { markdown = 'text' }
	}
	local markdown = data[1] and data[1].markdown or '(No data)'
	return p.convertMarkdownToWikitext(markdown)
end

return p