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 = {}

function p._convert(markdown)
  if not markdown or markdown == "" then return "(No content)" end

  -- 1. Decode JSON-style escapes
  markdown = markdown:gsub("\\u003C", "<")
                     :gsub("\\u003E", ">")
                     :gsub("\\n", "\n")
                     :gsub("\\r", "")
                     :gsub("\\\"", '"')
                     :gsub("\\/", "/")
                     :gsub("\\%", "%%")  -- preserve percent signs

  -- 2. Strip all inline HTML tags
  markdown = markdown:gsub("<iframe.-</iframe>", "")
                     :gsub("<.->", "")

  -- 3. Normalize blank-lines around headers
  markdown = markdown:gsub("\n#+ ", "\n%1%s") -- ensure line breaks before headings

  -- 4. Convert headings
  for i = 6,1,-1 do
    local hashes = string.rep("#", i)
    local equals = string.rep("=", i)
    markdown = markdown:gsub("\n"..hashes.." (.-)\n", "\n"..equals.." %1 "..equals.."\n")
  end

  -- 5. Bold & Italics
  markdown = markdown:gsub("%*%*%*(.-)%*%*%*", "'''''%1'''''")
                     :gsub("%*%*(.-)%*%*", "'''%1'''")
                     :gsub("%*(.-)%*", "''%1''")

  -- 6. Nested lists from spaces
  markdown = markdown:gsub("(\n[ ]*)%- ", function(spaces)
    local level = math.floor(#spaces / 2) + 1
    return "\n" .. string.rep("*", level) .. " "
  end)

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

  -- 8. Clean up extra blank lines
  markdown = markdown:gsub("\r", "")
                     :gsub("\n\n\n+", "\n\n")
                     :gsub("^%s+", ""):gsub("%s+$", "")

  return markdown
end

function p.convertMarkdownToWikitext(frame)
  local md = frame.args[1]
  if not md then return "(No input received)" end
  return p._convert(md)
end

return p