module(..., package.seeall) require("medialike") medialike.heading_tags={ "h4", "h3", "h2", "h4", "h5" } local markdown = require("sputnik.markup.markdown") -- l = l.replace(" ", "\t") -- l = l.replace("\t\t\t", "***").replace("\t\t*", "\t**").replace("\t*", "*").replace("\t", " ") function do_code(match) return string.gsub("\n"..match, "\n", "\n ") end local function do_indented_code(match) return string.gsub("\n"..match, "\n", "\n ") end local function dolist(match) match = string.gsub(match, " %*", "***") match = string.gsub(match, " %*", "**") match = string.gsub(match, " %*", "*") return match end CODE_PLACEHOLDER = "JKDKIEJHSYKLSDNMSKJDLJWQYUISAKNMGHWELKDSMLNSQIYOPNKLAKAWEIOOUKHJAJKHGQWBVBN" CODE_PLACEHOLDER_INDENTED = "BNMKJHLKLKWPEIRUIOAHJKLSADVBNVAMLKJQEWHJHGRJKWJGHGKAJHGDBCVCVDDSOIGDHGVCDED" CODE_PLACEHOLDER_INLINE = "UIYFDJLJFDSCNLIOHRXGBNMNMHEQDHIKUTGGDHHUJJJNFCFRDDHBGFGEFJHJFEIKFNUESWXHMKI" function new(sputnik) return { transform = function(text) local function dolink(wikilink) return markdown.wikify_link(wikilink, sputnik) end -- normalize by getting rid of \r and \t text = string.gsub(text, "\r\n", "\n").."\n\n" text = string.gsub(text, "\t", " ") text = string.gsub(text, "<", "<") text = string.gsub(text, ">", ">") -- stash code sections local code = {} local function store_code(match) code[#code+1] = string.gsub("\n"..match, "\n", "\n ") return "\n\n"..CODE_PLACEHOLDER.."\n" end local function store_indented_code(match) code[#code+1] = string.gsub("\n"..match, "\n", "\n ") return "\n\n"..CODE_PLACEHOLDER_INDENTED.."\n" end local function store_inline_code(match) code[#code+1] = ""..match.."" return CODE_PLACEHOLDER_INLINE end local code_position = 0 local function next_code_segment() code_position = code_position+1 return code[code_position] end text = string.gsub(text, "\n %s*{{{(.-)}}}", store_indented_code) text = string.gsub(text, "{{{(.-)}}}", store_code) text = string.gsub(text, "{{(.-)}}", store_inline_code) --function(x) return ""..x.."" end) -- Do lists and links text = string.gsub(text, "([A-Z][a-z]%w*[A-Z][a-z]%w*)", function(x) return "[["..x.."]]" end) text = string.gsub(text, "( %*.-\n\n)", dolist) --"(\t|( ))\*.*?\n\n", dolist) -- Put the code back text = string.gsub(text, CODE_PLACEHOLDER_INDENTED, next_code_segment) text = string.gsub(text, CODE_PLACEHOLDER, next_code_segment) text = string.gsub(text, CODE_PLACEHOLDER_INLINE, next_code_segment) return medialike.format_content(text, dolink) end } end