local md = {} function md.parse(md) local it = {} it.l = {} it[#it+1] = {["content"]="",["bold"]=false,["italic"]=false} local lc,llc = "","" local function newpart() it[#it+1] = {["content"]=""} end newpart() local lm = false for c in md:gmatch(".") do if c == "[" then newpart() elseif c == "(" and lc == "]" then lm = true it[#it].content = it[#it].content:sub(1,-2) it[#it].address = "" elseif c == ")" and lm then lm = false it.l[#it.l+1] = it[#it].address it[#it].addrid = #it.l newpart() elseif c == "\n" and lc == "\n" then newpart() it[#it].content = "\n\n" newpart() else if not lm then it[#it].content = it[#it].content .. c else it[#it].address = it[#it].address .. c end end llc = lc lc = c end return it end function md.reflow(text,len) local words, lines, links = {}, {""}, {} for k,v in ipairs(md.parse(text)) do if v.content == "\n\n" then words[#words+1] = {"\n\n"} elseif not v.address then for word in v.content:gmatch("%S+") do words[#words+1] = {word} end else words[#words+1] = {v.content,v.address} end end for k,v in pairs(words) do if v[2] then if lines[#lines]:len()+v[1]:len()+2 > len then lines[#lines+1] = "" end links[#links+1] = {#lines, lines[#lines]:len()+1, v[1], v[2]} lines[#lines] = lines[#lines] .. "<"..v[1].."> " elseif v[1] == "\n\n" then lines[#lines+1] = "" lines[#lines+1] = "" else if lines[#lines]:len()+v[1]:len() > len then lines[#lines+1] = "" end lines[#lines] = lines[#lines] .. v[1].." " end end return lines, links end return md