More actions
mNo edit summary |
No edit summary |
||
Line 1: | Line 1: | ||
local p = {} | local p = {} | ||
-- Utility: unescape common HTML entities | -- Utility: unescape common HTML entities and escaped unicode sequences | ||
local function htmlUnescape(s) | local function htmlUnescape(s) | ||
s = s:gsub("\\u003C", "<") | s = s:gsub("\\u003C", "<") | ||
Line 13: | Line 13: | ||
end | end | ||
-- Utility: strip inline HTML | -- Utility: strip inline HTML (iframes, br, etc) | ||
local function stripHTML(s) | local function stripHTML(s) | ||
-- | -- Strip iframe blocks | ||
s = s:gsub("<iframe.-</iframe>", "") | s = s:gsub("<iframe.-</iframe>", "") | ||
-- | -- Strip all HTML tags | ||
s = s:gsub("<.->", "") | s = s:gsub("<.->", "") | ||
return s | return s | ||
end | end | ||
-- Main | -- Main logic for Markdown â Wikitext conversion | ||
function p. | function p._convert(markdown) | ||
if not markdown then return "(No content)" end | if not markdown or markdown == "" then return "(No content)" end | ||
-- | -- Unescape sequences | ||
markdown = htmlUnescape(markdown) | markdown = htmlUnescape(markdown) | ||
markdown = markdown:gsub("\\n", "\n")Â Â -- | markdown = markdown:gsub("\\n", "\n")Â Â -- newline | ||
markdown = markdown:gsub("\\%-", "â")Â Â -- | markdown = markdown:gsub("\\%-", "â")Â Â -- dash | ||
markdown = markdown:gsub("\\!", "!")Â Â Â -- | markdown = markdown:gsub("\\!", "!")Â Â Â -- exclamation | ||
markdown = markdown:gsub("\\_", "_")Â Â Â -- | markdown = markdown:gsub("\\_", "_")Â Â Â -- underscores | ||
markdown = markdown:gsub("\\+", "+")Â Â Â -- | markdown = markdown:gsub("\\+", "+")Â Â Â -- plus signs | ||
markdown = markdown:gsub("\\*", "*")Â Â Â -- | markdown = markdown:gsub("\\*", "*")Â Â Â -- asterisks | ||
markdown = markdown:gsub("\\\\", "\\")Â Â -- | markdown = markdown:gsub("\\\\", "\\")Â Â -- backslash | ||
-- Strip inline HTML | -- Strip inline HTML | ||
Line 47: | Line 47: | ||
markdown = markdown:gsub("\n# (.-)\n", "\n= %1 =\n") | markdown = markdown:gsub("\n# (.-)\n", "\n= %1 =\n") | ||
-- Bold | -- Bold and Italic | ||
markdown = markdown:gsub("%*%*%*(.-)%*%*%*", "'''''%1'''''") | markdown = markdown:gsub("%*%*%*(.-)%*%*%*", "'''''%1'''''") | ||
markdown = markdown:gsub("%*%*(.-)%*%*", "'''%1'''") | markdown = markdown:gsub("%*%*(.-)%*%*", "'''%1'''") | ||
markdown = markdown:gsub("%*(.-)%*", "''%1''") | markdown = markdown:gsub("%*(.-)%*", "''%1''") | ||
-- Nested | -- 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] | ||
-- Links: [text](url) | |||
markdown = markdown:gsub("%[(.-)%]%((.-)%)", "[%2 %1]") | markdown = markdown:gsub("%[(.-)%]%((.-)%)", "[%2 %1]") | ||
-- | -- Normalize line endings | ||
markdown = markdown:gsub("\r", "") | markdown = markdown:gsub("\r", "") | ||
markdown = markdown:gsub("\n\n\n+", "\n\n") | 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 | return markdown | ||
end | end | ||
-- | -- Entry point: used from #invoke with raw markdown string | ||
function p. | function p.convertMarkdownToWikitext(frame) | ||
local | local markdown = frame.args[1] | ||
if not markdown then return "(No input received)" end | |||
return p._convert(markdown) | |||
return p. | |||
end | end | ||
return p | return p |
Revision as of 17:05, 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("\\%-", "â") -- 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