Module:Block diagram

local p={}

function p.main(frame) local args=frame.args or {} local parent=frame.getParent(frame) or {} local pargs=parent.args or {} local textinput=args[1] or pargs[1] or "" local nowiki=args.nowiki or pargs.nowiki or nil local totalwidth=args.width or pargs.width or 220 local totalheight=args.height or pargs.height or 200 local debug=args.debug or pargs.debug local debuglog="" --- Allow searching of all text to end with: textinput=textinput.."" --- Give all RECOGNIZED markup a consistent searchable string --- more styling should be added; seeking a first proof of concept now local taglist={'left','top','right','bottom','color','background-color','text-align','vertical-align','vcentertext','border-style','border-color','border-width'} for i,v in pairs(taglist) do      local vn=mw.ustring.gsub(v,"%-","") --- remove dashes from standard html attribute names to allow internal use local vs=mw.ustring.gsub(v,"%-","%-") -- escape those hyphens for pattern search textinput=mw.ustring.gsub(textinput,"<"..vs.."%s*([^>]*)>","") debuglog=debuglog..v..vs..vn..textinput end prowl=mw.ustring.gmatch(textinput,"(.-)]*)>") local tableoutput={} local text,tag,value local default={} default['left']=0 default['right']=100 default['top']=0 default['bottom']=100 default['borderstyle']='solid' default['borderwidth']='1px' default['bordercolor']='black' default['color']='black' default['backgroundcolor']='white' -- elements should usually block elements behind them, like grid lines default['textalign']='center' default['verticalalign']='middle' -- pseudo html value, but this needs a special hack to work default['vcentertext']='' for i,j in pairs(default) do     _G[i]=j debuglog=debuglog..i..j  end repeat text,tag,value = prowl(textinput) debuglog=debuglog..(text or "nil")..(tag or "nil") if not tag then return debuglog end if (text or "")~="" then table.insert(tableoutput,'<div style="position:absolute;top:')        table.insert(tableoutput,top)         table.insert(tableoutput,'%;bottom:')         table.insert(tableoutput,100-bottom)         table.insert(tableoutput,'%;left:')         table.insert(tableoutput,left)         table.insert(tableoutput,'%;right:')         table.insert(tableoutput,100-right)         table.insert(tableoutput,'%;border-style:')         table.insert(tableoutput,borderstyle)         table.insert(tableoutput,';border-width:')         table.insert(tableoutput,borderwidth)         table.insert(tableoutput,';border-color:')         table.insert(tableoutput,bordercolor)         table.insert(tableoutput,';color:')         table.insert(tableoutput,color)         table.insert(tableoutput,';background-color:')         table.insert(tableoutput,backgroundcolor)         table.insert(tableoutput,';">') if textalign~='center' then table.insert(tableoutput,';text-align:'..textalign) end if verticalalign=='top' then table.insert(tableoutput,text) else table.insert(tableoutput,'') end table.insert(tableoutput,' ') end _G[tag]=value or default[tag] until tag=="end" local textoutput=table.concat(tableoutput) textoutput=''..textoutput..' ' if nowiki then textoutput=frame:preprocess(" "..textoutput.."  ") else textoutput=frame:preprocess(textoutput) end if debug then textoutput=textoutput..debuglog end return textoutput end

return p