More actions
No edit summary |
No edit summary |
||
Line 29: | Line 29: | ||
markdown = htmlUnescape(markdown) | markdown = htmlUnescape(markdown) | ||
markdown = markdown:gsub("\\n", "\n")Â Â -- newline | markdown = markdown:gsub("\\n", "\n")Â Â -- newline | ||
markdown = markdown:gsub("\\r", "")Â -- just in case | |||
  markdown = markdown:gsub("\\\"", "\"") -- handle escaped quotes | |||
  markdown = markdown:gsub("\\/", "/") -- optional: fix slashes | |||
markdown = markdown:gsub("\\%-", "â")Â Â -- dash | markdown = markdown:gsub("\\%-", "â")Â Â -- dash | ||
markdown = markdown:gsub("\\!", "!")Â Â Â -- exclamation | markdown = markdown:gsub("\\!", "!")Â Â Â -- exclamation |
Revision as of 17:07, 24 July 2025
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("<", "<")
s = s:gsub(">", ">")
s = s:gsub("&", "&")
s = s:gsub(""", '"')
s = s:gsub("'", "'")
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("\\r", "") -- just in case
markdown = markdown:gsub("\\\"", "\"") -- handle escaped quotes
markdown = markdown:gsub("\\/", "/") -- optional: fix slashes
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