Module:Sandbox/pppery/list markup

local p = {} local yesno = require("Module:Yesno") function p.main(frame) if frame.args.text == nil then if frame.args.page == nil then frame.args.text = mw.title.getCurrentTitle:getContent else frame.args.text = mw.title.new(frame.args.page):getContent end end return p._main(frame.args.text,yesno(frame.args.strict)) end function p._main(text, strict) local out = "" local lastindent = "" local blanklines = "" for line in mw.text.gsplit(text, "\n") do		local _, endindent = line:find("^[:*#]+") if endindent == nil then -- not an indented comment if #lastindent ~= 0 and #mw.text.trim(line) == 0 then -- buffer blank lines or lines containing whitespace until we see the next non-blank line blanklines = blanklines .. line .. "\n" else -- reset state, emitting any blank lines out = out .. blanklines .. line .. "\n" blanklines = "" lastindent = "" end else local thisindent = line:sub(1, endindent) if endindent > #lastindent then thisindent = lastindent .. line:sub(#lastindent + 1, endindent) elseif endindent == #lastindent then if strict then thisindent = lastindent else -- err on the side of keeping markup that causes visual changes, despite being incorrect if #thisindent == 1 and #lastindent == 1 and thisindent ~= lastindent then -- add back blank lines if there is going to be a breakpoint anyway out = out .. blanklines end thisindent = lastindent:sub(1, -2) .. thisindent:sub(-1) end elseif strict then thisindent = lastindent:sub(1, endindent - #lastindent - 1) else -- as before, erring on the side of keeping markup that causes a visual change if #thisindent == 1 and #lastindent == 1 and thisindent ~= lastindent then -- add back blank lines if there is going to be a breakpoint anyway out = out .. blanklines end thisindent = lastindent:sub(1, endindent - #lastindent - 2) .. thisindent:sub(-1) end blanklines = "" lastindent = thisindent out = out .. (thisindent .. line:sub(endindent + 1)) .. "\n" end end return out end return p