<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ASandbox%2FDrMeepster%2FC_yes_yes</id>
	<title>Module:Sandbox/DrMeepster/C yes yes - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ASandbox%2FDrMeepster%2FC_yes_yes"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/DrMeepster/C_yes_yes&amp;action=history"/>
	<updated>2026-05-27T00:35:26Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://stockhub.co/index.php?title=Module:Sandbox/DrMeepster/C_yes_yes&amp;diff=145347&amp;oldid=prev</id>
		<title>imported&gt;DrMeepster: css bugfix</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/DrMeepster/C_yes_yes&amp;diff=145347&amp;oldid=prev"/>
		<updated>2020-02-01T18:37:23Z</updated>

		<summary type="html">&lt;p&gt;css bugfix&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
--------------------------------&lt;br /&gt;
-----Code from other people-----&lt;br /&gt;
--------------------------------&lt;br /&gt;
&lt;br /&gt;
TableTools = require(&amp;quot;Module:TableTools&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
--https://stackoverflow.com/a/1283608&lt;br /&gt;
--All stack overflow code is CC BY-SA 3.0&lt;br /&gt;
local function tableMerge(t1, t2)&lt;br /&gt;
	for k,v in pairs(t2) do&lt;br /&gt;
		if type(v) == &amp;quot;table&amp;quot; then&lt;br /&gt;
			if type(t1[k] or false) == &amp;quot;table&amp;quot; then&lt;br /&gt;
				_tableMerge(t1[k] or {}, t2[k] or {})&lt;br /&gt;
			else&lt;br /&gt;
				t1[k] = v&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			t1[k] = v&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return t1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--This function is public domain. See http://lua-users.org/wiki/OrderedTable&lt;br /&gt;
--Modified to be able to accept args&lt;br /&gt;
local function Ordered(t)&lt;br /&gt;
	--nextkey and firstkey are used as markers; nextkey[firstkey] is&lt;br /&gt;
	--the first key in the table, and nextkey[nextkey] is the last key.&lt;br /&gt;
	--nextkey[nextkey[nextkey]] should always be nil.&lt;br /&gt;
&lt;br /&gt;
	local key2val, nextkey, firstkey = {}, {}, {}&lt;br /&gt;
	nextkey[nextkey] = firstkey&lt;br /&gt;
	&lt;br /&gt;
	local function onext(self, key)&lt;br /&gt;
		while key ~= nil do&lt;br /&gt;
			key = nextkey[key]&lt;br /&gt;
			local val = self[key]&lt;br /&gt;
			if val ~= nil then return key, val end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
 &lt;br /&gt;
	-- To save on tables, we use firstkey for the (customised)&lt;br /&gt;
	-- metatable; this line is just for documentation&lt;br /&gt;
	local selfmeta = firstkey&lt;br /&gt;
	&lt;br /&gt;
	-- record the nextkey table, for routines lacking the closure&lt;br /&gt;
	selfmeta.__nextkey = nextkey&lt;br /&gt;
	&lt;br /&gt;
	-- setting a new key (might) require adding the key to the chain&lt;br /&gt;
	function selfmeta:__newindex(key, val)&lt;br /&gt;
		rawset(self, key, val)&lt;br /&gt;
		if nextkey[key] == nil then -- adding a new key&lt;br /&gt;
			nextkey[nextkey[nextkey]] = key&lt;br /&gt;
			nextkey[nextkey] = key&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	out = setmetatable(key2val, selfmeta)&lt;br /&gt;
	&lt;br /&gt;
	if t then&lt;br /&gt;
		tableMerge(out, t)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.Ordered = Ordered&lt;br /&gt;
&lt;br /&gt;
--------------------------------&lt;br /&gt;
----------Code from me----------&lt;br /&gt;
--------------------------------&lt;br /&gt;
&lt;br /&gt;
--metatable of mw.html&lt;br /&gt;
p.htmlMeta = getmetatable(mw.html.create())&lt;br /&gt;
&lt;br /&gt;
p.orderedMeta = getmetatable(p.Ordered())&lt;br /&gt;
&lt;br /&gt;
function p.filter(tabl, typ)&lt;br /&gt;
	local typeCheck = (type(typ) == &amp;quot;string&amp;quot; and type) or (type(typ) == &amp;quot;table&amp;quot; and getmetatable) or error(&amp;quot;Invalid type!&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	local out = {}&lt;br /&gt;
	&lt;br /&gt;
	for k,v in pairs(tabl) do&lt;br /&gt;
		if typeCheck(v) == typ then&lt;br /&gt;
			out[k] = v&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------&lt;br /&gt;
&lt;br /&gt;
--an HTML Element&lt;br /&gt;
local Element = {parent=nil, id = nil}&lt;br /&gt;
&lt;br /&gt;
Element.__index = Element&lt;br /&gt;
&lt;br /&gt;
--Create a new Element&lt;br /&gt;
function Element.new(type)&lt;br /&gt;
	o = setmetatable({}, Element)&lt;br /&gt;
	o.type = type&lt;br /&gt;
	o.children = {}&lt;br /&gt;
	o.style = Ordered()&lt;br /&gt;
	o.classes = {}&lt;br /&gt;
	&lt;br /&gt;
	return o&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--Add Element or mw.html as child&lt;br /&gt;
function Element:add(child)&lt;br /&gt;
	if getmetatable(child) == Element then&lt;br /&gt;
		child.parent = self&lt;br /&gt;
	elseif getmetatable(child) ~= htmlMeta then&lt;br /&gt;
		error(&amp;quot;Inavlid child!&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	table.insert(self.children, child)&lt;br /&gt;
	&lt;br /&gt;
	return child&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--Add string as child&lt;br /&gt;
function Element:wikitext(child)&lt;br /&gt;
	if type(child) ~= &amp;quot;string&amp;quot; then&lt;br /&gt;
		error(&amp;quot;Inavlid child!&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	table.insert(self.children, child)&lt;br /&gt;
	&lt;br /&gt;
	return self&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--create a new Element then add it&lt;br /&gt;
function Element:tag(name)&lt;br /&gt;
	elem = Element.new(name)&lt;br /&gt;
	&lt;br /&gt;
	return self:add(elem)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--add a newline (br)&lt;br /&gt;
function Element:newline()&lt;br /&gt;
	self:tag(&amp;quot;br&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	return self&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--add a css property&lt;br /&gt;
function Element:css(k, v)&lt;br /&gt;
	&lt;br /&gt;
	if type(k) == &amp;quot;table&amp;quot; then&lt;br /&gt;
		for _,kv in ipairs(k) do&lt;br /&gt;
			self:css(kv[1], kv[2])&lt;br /&gt;
		end&lt;br /&gt;
	elseif type(k) == &amp;quot;string&amp;quot; and type(v) == &amp;quot;string&amp;quot; then&lt;br /&gt;
		self.style[k] = v&lt;br /&gt;
	else&lt;br /&gt;
		error(&amp;quot;CSS keys and values should be string!&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return self&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--add classes&lt;br /&gt;
function Element:class(class)&lt;br /&gt;
	if type(class) == &amp;quot;table&amp;quot; then&lt;br /&gt;
		tableMerge(self.classes, class)&lt;br /&gt;
	elseif type(class) == &amp;quot;string&amp;quot; then&lt;br /&gt;
		table.insert(self.classes, class)&lt;br /&gt;
	else&lt;br /&gt;
		error(&amp;quot;Invalid class type!&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return self&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--set the id&lt;br /&gt;
function Element:setId(id)&lt;br /&gt;
	if type(id) ~= &amp;quot;string&amp;quot; then&lt;br /&gt;
		error(&amp;quot;Id must be string!&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	self.id = id&lt;br /&gt;
	&lt;br /&gt;
	return self&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--returns parent. used for function chaining&lt;br /&gt;
function Element:done()&lt;br /&gt;
	return self.parent or self&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--returns the root Element&lt;br /&gt;
function Element:allDone()&lt;br /&gt;
	local parent = self.parent&lt;br /&gt;
	&lt;br /&gt;
	if parent == nil then return self end&lt;br /&gt;
	&lt;br /&gt;
	while parent.parent do&lt;br /&gt;
		parent = parent.parent&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return parent&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--turn this Element into an mw.html object&lt;br /&gt;
function Element:bake()&lt;br /&gt;
	local root = mw.html.create(self.type):css(self.style)&lt;br /&gt;
	&lt;br /&gt;
	for _,class in ipairs(self.classes) do&lt;br /&gt;
		root:addClass(class)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for _, child in ipairs(self.children) do&lt;br /&gt;
		if getmetatable(child) == Element then&lt;br /&gt;
			--must bake Element&lt;br /&gt;
			root:node(child:bake())&lt;br /&gt;
		elseif getmetatable(child) == htmlMeta then&lt;br /&gt;
			--do not need to bake mw.html&lt;br /&gt;
			root:node(child)&lt;br /&gt;
		elseif type(child) == &amp;quot;string&amp;quot; then&lt;br /&gt;
			--if string add as wikitext&lt;br /&gt;
			root:wikitext(child)&lt;br /&gt;
		else&lt;br /&gt;
			error(&amp;quot;Unknown child of element!&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return root&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--bakes the root Element&lt;br /&gt;
function Element:bakeAll()&lt;br /&gt;
	return self:allDone():bake()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--wip dont use&lt;br /&gt;
function Element:stylesheet(css)&lt;br /&gt;
	for _,c in ipairs(css) do&lt;br /&gt;
		for _,s in ipairs(c.selectors) do&lt;br /&gt;
			if s:check(self) then&lt;br /&gt;
				self:css(c.properties)&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for _,child in pairs(p.filter(self.children, Element)) do&lt;br /&gt;
		child:stylesheet(css)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return self&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------&lt;br /&gt;
&lt;br /&gt;
local Selector = {&lt;br /&gt;
	yes = false,&lt;br /&gt;
	id = nil,&lt;br /&gt;
	type = nil,&lt;br /&gt;
	class = {},&lt;br /&gt;
	&lt;br /&gt;
	directParent = nil,&lt;br /&gt;
	parent = nil,&lt;br /&gt;
	next = nil&lt;br /&gt;
}&lt;br /&gt;
--[[&lt;br /&gt;
	selections ordered roughly by price, cheapest to most expensive&lt;br /&gt;
	&lt;br /&gt;
	--basic selections--&lt;br /&gt;
	yes - Makes the selector always be true (*)&lt;br /&gt;
	id - Element must have this id (#id)&lt;br /&gt;
	type - Element must be of this type (type)&lt;br /&gt;
	class - Element must have all these classes (.class1.class2 etc)&lt;br /&gt;
	&lt;br /&gt;
	--combinator selections--&lt;br /&gt;
	directParent- Element must have its parent element match this selector  (parentElement &amp;gt; element)&lt;br /&gt;
	parent - Element must be inside an element matching this selector (parentElement element)&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
Selector.__index = Selector&lt;br /&gt;
&lt;br /&gt;
function Selector.new(s)&lt;br /&gt;
	s = s or {}&lt;br /&gt;
	&lt;br /&gt;
	if type(s.class) == &amp;quot;string&amp;quot; then&lt;br /&gt;
		s.class = {s.class}&lt;br /&gt;
	elseif type(s.class) ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
		s.class = {}&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return setmetatable(s, Selector)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Selector:check(e)&lt;br /&gt;
	if getmetatable(e) ~= Element then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- all selector&lt;br /&gt;
	if self.yes then&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- id selector&lt;br /&gt;
	if self.id and e.id ~= self.id then&lt;br /&gt;
		 return false&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- type selector&lt;br /&gt;
	if self.type and e.type ~= self.type then&lt;br /&gt;
		 return false&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- class selector&lt;br /&gt;
	if #self.class &amp;gt; 0 then&lt;br /&gt;
		local class = true&lt;br /&gt;
		for _,v in pairs(self.class) do&lt;br /&gt;
			if not TableTools.inArray(e.classes, v) then&lt;br /&gt;
				class = false&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if not class then&lt;br /&gt;
			return false&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- direct parent check&lt;br /&gt;
	&lt;br /&gt;
	if self.directParent and not self.directParent:check(e.parent) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- parent check&lt;br /&gt;
&lt;br /&gt;
	if self.parent then&lt;br /&gt;
		local nextParent = e.parent&lt;br /&gt;
		&lt;br /&gt;
		while true do&lt;br /&gt;
			if nextParent == nil then&lt;br /&gt;
				return false&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			if self.parent:check(nextParent) then&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			nextParent = nextParent.parent&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	 &lt;br /&gt;
	-- all selectors passed&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------&lt;br /&gt;
p.Element = Element&lt;br /&gt;
p.Selector = Selector&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;DrMeepster</name></author>
	</entry>
</feed>