Module:Sandbox/Andreyyshore/Vertical header

This is an old revision of this page, as edited by Andreyyshore (talk | contribs) at 12:27, 21 June 2018. The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.
local p = {}

function p.stack(frame)
   local t = {}
   local str = frame.args[1]
   local breakPattern = "<[bB][rR] */? *>"
   local function splitLines(line)
      table.insert(t, line)
      return ""
   end
   splitLines((str:gsub("(.-)(" .. breakPattern .. ")", splitLines)))
   for k, v in pairs(t) do
      t[k] = (v
         :gsub("([^'%[%]])", "%1<br>")
         :gsub("'([^'])", "'<br>%1")
         :gsub("(''+)<br>", "%1")
         :gsub("(%[%[+)<br>", "%1")
         :gsub("<br>(%]+)", "%1<br>")
         :gsub("%[%[([^%[%]]+)%]%]", function(n)
            local inBrackets = n
            local stripped = ""
            if inBrackets:find("%|") == nil then
               inBrackets = inBrackets:gsub("<br>", "") .. "|" .. inBrackets
            else
               stripped = inBrackets:match("^[^%|]+%|"):gsub("<br>", "")
               inBrackets = stripped .. inBrackets:gsub("^[^%|]+%|<br>", "")
            end
            return "[[" .. inBrackets .. "]]"
         end)
         :gsub("<br>$", "")
      )
   end
   if #t == 1 then
      return t[1]
   end
   local dom1 = mw.html.create("tr")
   local dom2
   for _, v in pairs(t) do
      dom1:wikitext(
         tostring(
            mw.html.create("td")
               :css({
                  ["border"] = "none",
                  ["padding"] = 0,
                  
               })
               :wikitext(v)
         )
      )
   end
   dom2 = mw.html.create("table")
      :wikitext(tostring(
         mw.html.create("tbody")
            :css("vertical-align", "inherit")
            :wikitext(tostring(dom1))
         )
      )
      :css({
         ["margin"] = 0,
         ["border-collapse"] = "collapse",
         ["vertical-align"] = "inherit"
      })
      :attr({cellspacing = 0, cellpadding = 0})
   return tostring(dom2)
end

function p.cell(frame)
	local text = frame.args.text
	local sortPadding = frame.args.sortPadding
	local vertAlign = frame.args.vertAlign
	local maxWidth = frame.args.maxWidth
	local noBold = frame.args.noBold
	local style = frame.args.style
	local wikiText = "class = \"nowrap"
	local normalAlign = ""
	-- local stupidIEAlign = ""
	local breakPattern = "<[bB][rR] */? *>"
	local rows = 1
	local width = 0
	if maxWidth ~= "" then
		width = maxWidth
	else
		for eachMatch in text:gmatch(breakPattern) do
			rows = rows + 1
		end
		width = rows * 0.875
		width = width .. "em"
	end
	if sortPadding == "" then
		wikiText = wikiText .. " unsortable"
	end
	wikiText = wikiText .. "\" style=\"line-height:99%;vertical-align:" .. vertAlign .. ";padding:"
	if sortPadding == "" then
		wikiText = wikiText .. ".4em"
	else
		wikiText = wikiText .. "21px"
	end
	wikiText = wikiText .. " .4em .2em;background-position:50% .4em !important;"
	wikiText = wikiText .. "min-width:" .. width .. ";max-width:" .. width .. ";width:" .. width .. ";overflow:hidden\""
	wikiText = wikiText .. " | <div style=\"" .. frame:preprocess("{{writing-mode|v1}}{{Transform-rotate|180}}") .. "-ms-transform: none \ ;padding-left:1px;text-align:"
	if vertAlign == "top" then
		normalAlign = "right"
		-- stupidIEAlign = "left"
	elseif vertAlign == "middle" then
		normalAlign = "center"
		-- stupidIEAlign = "center"
	else
		normalAlign = "left"
		-- stupidIEAlign = "right"
	end
	wikiText = wikiText .. normalAlign .. ";" -- text-align:" .. stupidIEAlign .. " \ ;"
	wikiText = wikiText .. style .. "\">"
	if noBold == "" then
		wikiText = wikiText .. text
	else
		wikiText = wikiText .. frame:preprocess("{{nobold|1=" .. text .. "}}")
	end
	wikiText = wikiText .. "</div>"
	return wikiText
end

return p