<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.pttlink.org/index.php?action=history&amp;feed=atom&amp;title=Module%3ATincture</id>
	<title>Module:Tincture - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.pttlink.org/index.php?action=history&amp;feed=atom&amp;title=Module%3ATincture"/>
	<link rel="alternate" type="text/html" href="https://wiki.pttlink.org/index.php?title=Module:Tincture&amp;action=history"/>
	<updated>2026-05-05T00:49:20Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.5</generator>
	<entry>
		<id>https://wiki.pttlink.org/index.php?title=Module:Tincture&amp;diff=11203&amp;oldid=prev</id>
		<title>Kg7qin: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://wiki.pttlink.org/index.php?title=Module:Tincture&amp;diff=11203&amp;oldid=prev"/>
		<updated>2022-01-24T07:59:47Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left diff-editfont-monospace&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 07:59, 24 January 2022&lt;/td&gt;
				&lt;/tr&gt;
&lt;!-- diff cache key mediawiki:diff::1.12:old-11202:rev-11203 --&gt;
&lt;/table&gt;</summary>
		<author><name>Kg7qin</name></author>
	</entry>
	<entry>
		<id>https://wiki.pttlink.org/index.php?title=Module:Tincture&amp;diff=11202&amp;oldid=prev</id>
		<title>Mediawiki&gt;Sarang: +parm</title>
		<link rel="alternate" type="text/html" href="https://wiki.pttlink.org/index.php?title=Module:Tincture&amp;diff=11202&amp;oldid=prev"/>
		<updated>2021-12-17T09:39:12Z</updated>

		<summary type="html">&lt;p&gt;+parm&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}  -- Tincture&lt;br /&gt;
&lt;br /&gt;
-------------- locals &lt;br /&gt;
local function draw(color, ss, tc, pf, gt)&lt;br /&gt;
	return mw.getCurrentFrame():expandTemplate{ title = 'Tincture/draw' .. ss, args = { color, gt, tc = tc, pf = pf } }&lt;br /&gt;
end -- local function draw&lt;br /&gt;
-- &lt;br /&gt;
local function sortc ( itab, otab, ccode )&lt;br /&gt;
	for i, v in ipairs(itab) do&lt;br /&gt;
		if v == ccode then &lt;br /&gt;
			table.insert(otab, v)&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end -- local function sortc&lt;br /&gt;
--&lt;br /&gt;
local function category(colors, ss, tc, cat, no_error_cat)&lt;br /&gt;
	return mw.getCurrentFrame():expandTemplate{ title = 'Tincture/cat' .. ss, args = { table.concat(colors, '/'), tc = tc, cat = cat, ['no error cat'] = no_error_cat and '1' or nil } }&lt;br /&gt;
end -- local function category&lt;br /&gt;
&lt;br /&gt;
-- local function: converts 'ddd ddd ddd'  to  '#rrggbb' (or '#rgb')&lt;br /&gt;
local function convdh ( p1, p2, p3 )&lt;br /&gt;
	local lpar = {}; -- separated by either pipe, slash, minus, comma or space &lt;br /&gt;
	local dect = {}&lt;br /&gt;
	local hext = {}&lt;br /&gt;
	local numb = {}&lt;br /&gt;
	local same = true&lt;br /&gt;
	lpar [1] = mw.text.trim ( p1 );&lt;br /&gt;
	if p3 == nil then				 -- split-pattern: REGEXP won't work&lt;br /&gt;
		if p2 ~= nil then &lt;br /&gt;
			lpar[1] = lpar[1] .. '-' .. mw.text.trim(p2)&lt;br /&gt;
		end&lt;br /&gt;
		lpar[1] = mw.ustring.gsub (lpar[1], '-', '/', 3)&lt;br /&gt;
		lpar[1] = mw.ustring.gsub (lpar[1], ',', '/', 3)&lt;br /&gt;
		lpar[1] = mw.ustring.gsub (lpar[1], ' ', '/', 3)&lt;br /&gt;
		dect = mw.text.split(lpar[1] or '1/2/3', '/');&lt;br /&gt;
	else&lt;br /&gt;
		lpar [2] = mw.text.trim ( p2 );&lt;br /&gt;
		lpar [3] = mw.text.trim ( p3 );&lt;br /&gt;
		dect = lpar;&lt;br /&gt;
	end&lt;br /&gt;
	for i = 1, 3 do&lt;br /&gt;
		numb[i] = tonumber( dect[i] )&lt;br /&gt;
		if numb[i] == nil or numb[i] &amp;gt; 255 then&lt;br /&gt;
			error (i .. 'value &amp;quot;' .. dect[i] or '?' .. '&amp;quot; cannot be converted to hexadecimal')&lt;br /&gt;
--				..dect[1]..','..dect[2]..','..dect[3]..'.'..i)&lt;br /&gt;
		end&lt;br /&gt;
		hext [i] = mw.ustring.format ( &amp;quot;%X&amp;quot;, numb[i] )&lt;br /&gt;
		if numb[i] &amp;lt; 16 then hext[i] = '0' .. hext[i] end;&lt;br /&gt;
		if mw.ustring.byte ( hext [i], 1 )  ~= mw.ustring.byte ( hext[i], 2 )  then&lt;br /&gt;
			same = false&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if same then &lt;br /&gt;
		hext[1] = mw.ustring.sub (hext[1], 2)&lt;br /&gt;
		hext[2] = mw.ustring.sub (hext[2], 2)&lt;br /&gt;
		hext[3] = mw.ustring.sub (hext[3], 2)&lt;br /&gt;
	end&lt;br /&gt;
	return '#'..hext[1]..hext[2]..hext[3]&lt;br /&gt;
end -- local function convdh&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-------------------- local / global ----------``-------------------------------&lt;br /&gt;
-- local / global function: converts h → d: #rrggbb or #rgb to table {rr, gg, bb}&lt;br /&gt;
function p.convht ( frame )&lt;br /&gt;
	local gpar = {};	&lt;br /&gt;
	local hexv =  nil;&lt;br /&gt;
	local hexi =  '000';&lt;br /&gt;
	local hwxt =  '0';&lt;br /&gt;
 	local gpar = frame.args;&lt;br /&gt;
 	if gpar then &lt;br /&gt;
 		hexv = tostring (gpar[1]);	-- global&lt;br /&gt;
 	else	 &lt;br /&gt;
		hexv = tostring ( frame );	-- local&lt;br /&gt;
 	end&lt;br /&gt;
&lt;br /&gt;
	hexv = mw.text.trim( hexv )&lt;br /&gt;
	if  mw.ustring.sub ( hexv, 1, 1 ) == '#' then &lt;br /&gt;
		hexi = mw.ustring.sub (hexv, 2)&lt;br /&gt;
		hext = '1'&lt;br /&gt;
	elseif mw.ustring.sub ( hexv, 1, 3) == '\\35' then &lt;br /&gt;
		hexi = mw.ustring.sub (hexv, 4)&lt;br /&gt;
		hext = '2'&lt;br /&gt;
	elseif mw.ustring.sub ( hexv, 1, 5) == '&amp;amp;#35;' then &lt;br /&gt;
		hexi = mw.ustring.sub (hexv, 6)&lt;br /&gt;
		hext = '3'&lt;br /&gt;
	elseif mw.ustring.sub ( hexv, 1, 6) == '&amp;amp;#035;' then &lt;br /&gt;
		hexi = mw.ustring.sub (hexv, 7)&lt;br /&gt;
		hext = '4'&lt;br /&gt;
	elseif mw.ustring.sub ( hexv, 1, 6) == '&amp;amp;#x23;' then &lt;br /&gt;
		hexi = mw.ustring.sub (hexv, 7, #hexv)&lt;br /&gt;
		hext = '5'&lt;br /&gt;
	elseif mw.ustring.sub ( hexv, 1, 7) == '&amp;amp;#x023;' then &lt;br /&gt;
		hexi = mw.ustring.sub (hexv, 8, #hexv)&lt;br /&gt;
		hext = '6'&lt;br /&gt;
	else	&lt;br /&gt;
		hext = '9'&lt;br /&gt;
		error ('value &amp;quot;' .. hexv .. '&amp;quot; cannot be converted to decimal ' .. #hexv )&lt;br /&gt;
	end&lt;br /&gt;
	if #hexi ~= 3 and #hexi ~= 6 then&lt;br /&gt;
		error ('value &amp;quot;' .. hexi .. '&amp;quot; with length ' .. #hexi .. ' are invalid' )&lt;br /&gt;
	end&lt;br /&gt;
--	error ('value &amp;quot;' .. hexv .. '&amp;quot; type ' .. hext .. ' = ' .. hexi)&lt;br /&gt;
	local dec  =  {};&lt;br /&gt;
	for i = 1, 3 do&lt;br /&gt;
		if #hexi == 3 then&lt;br /&gt;
			dec [i] = tonumber ( mw.ustring.sub (hexi, i, i)..mw.ustring.sub (hexi, i, i), 16 ) &lt;br /&gt;
		else&lt;br /&gt;
			dec [i] = tonumber ( mw.ustring.sub (hexi, 2*i - 1, 2*i), 16 ) &lt;br /&gt;
		end&lt;br /&gt;
	end	&lt;br /&gt;
	return dec;&lt;br /&gt;
end -- function convht&lt;br /&gt;
&lt;br /&gt;
-- local / global function: converts h ← d '#rrggbb' or '#rgb' and returns 'ddd ddd ddd'&lt;br /&gt;
function p.convhd ( frame )&lt;br /&gt;
	local gpar = frame.args;&lt;br /&gt;
	if gpar then decval = p.convht (gpar[1]);	-- global&lt;br /&gt;
		else	 decval = p.convht ( frame );	-- local&lt;br /&gt;
	end&lt;br /&gt;
	return decval[1]..' '..decval[2]..' '..decval[3]&lt;br /&gt;
end -- function convhd&lt;br /&gt;
&lt;br /&gt;
-- local / global function: converts h → d'#rrggbb' or '#rgb' and returns 'ddd ddd ddd' formatted&lt;br /&gt;
function p.convhdf ( frame )&lt;br /&gt;
	local gpar = frame.args;&lt;br /&gt;
	if gpar then dtab = p.convht (gpar[1]);	-- global&lt;br /&gt;
			else dtab = p.convht ( frame );	-- local&lt;br /&gt;
	end&lt;br /&gt;
	local dtxt = '&amp;amp;nbsp;'&lt;br /&gt;
	for i = 1, 3 do&lt;br /&gt;
		if dtab[i] &amp;lt; 100 then&lt;br /&gt;
			if dtab[i] &amp;lt; 10 then &lt;br /&gt;
				dtxt = dtxt .. ' '&lt;br /&gt;
			end&lt;br /&gt;
			dtxt = dtxt .. '&amp;amp;nbsp;'&lt;br /&gt;
		end&lt;br /&gt;
		dtxt = dtxt .. ' ' .. tostring ( dtab [i] ) &lt;br /&gt;
	end&lt;br /&gt;
	local contrast = '0';&lt;br /&gt;
	if  dtab [1] + dtab [2] + dtab [3] &amp;lt; 400 then &lt;br /&gt;
		  contrast = 'F'; &lt;br /&gt;
	end&lt;br /&gt;
-- TEST ----------&lt;br /&gt;
--	local contval = dtab [1] + dtab [2] + dtab [3]&lt;br /&gt;
-- 	contrast = contrast .. ' - ';&lt;br /&gt;
--	if contval &amp;lt; 100 then&lt;br /&gt;
--		if contval &amp;lt; 10 then &lt;br /&gt;
--			contrast = contrast .. '&amp;amp;nbsp;'&lt;br /&gt;
--		end&lt;br /&gt;
--		contrast = contrast .. '&amp;amp;nbsp;'&lt;br /&gt;
--	end&lt;br /&gt;
-- 	contrast = contrast .. tostring ( contval ); &lt;br /&gt;
-- TEST ----------&lt;br /&gt;
	dtxt = contrast .. dtxt; &lt;br /&gt;
	return dtxt&lt;br /&gt;
end -- function convhdf&lt;br /&gt;
&lt;br /&gt;
-- function returns contrast color&lt;br /&gt;
function p.titcolor ( frame )&lt;br /&gt;
	local gpar = frame.args&lt;br /&gt;
	local decval = p.convhdf ( gpar[1] );&lt;br /&gt;
	if mw.ustring.sub ( decval, 1, 1 ) == 'F'&lt;br /&gt;
		then return 'FFF'&lt;br /&gt;
		else return '000'&lt;br /&gt;
	end&lt;br /&gt;
end -- function titcolor &lt;br /&gt;
&lt;br /&gt;
-- global function tbcbox: returns a Tbc box&lt;br /&gt;
function p.tbcbox ( frame )&lt;br /&gt;
	local gpar = frame.args&lt;br /&gt;
	local hstr = convdh ( gpar[1], gpar[2], gpar[3] )	&lt;br /&gt;
	return frame:expandTemplate { title = 'colorbox', args = { hstr, title = '&amp;quot;' .. hstr ..'&amp;quot;' } }&lt;br /&gt;
end -- function tbxbox&lt;br /&gt;
&lt;br /&gt;
-- global function convgpl: gets #rgb, contrast, name; returns line formatted&lt;br /&gt;
function p.convgpl ( frame )&lt;br /&gt;
	local gpar = frame.args;&lt;br /&gt;
	local line = p.convhdf ( gpar [1] );						-- convert #rgb  &lt;br /&gt;
	local expl = mw.ustring.sub ( line, 2) .. ' ' .. gpar [1];	-- d d d   #rgb&lt;br /&gt;
	if #gpar[1] == 4 then&lt;br /&gt;
		expl = expl .. '&amp;amp;nbsp; &amp;amp;nbsp;'&lt;br /&gt;
	end&lt;br /&gt;
	local contrast = gpar [2] or '#001'&lt;br /&gt;
--	expl = expl .. ' ' .. contrast;								-- contrast		-test &lt;br /&gt;
	if mw.ustring.sub ( contrast, 2, 2) == mw.ustring.sub ( line, 1, 1) &lt;br /&gt;
		then	expl = expl .. '&amp;lt;tt&amp;gt; &amp;lt;/tt&amp;gt;'&lt;br /&gt;
		else	expl = expl .. '&amp;lt;tt&amp;gt;·&amp;lt;/tt&amp;gt;'&lt;br /&gt;
	end&lt;br /&gt;
	expl = expl .. gpar [3];									-- name&lt;br /&gt;
	return expl&lt;br /&gt;
end -- function convgpl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- global function convert:  gets 3 num, returns hex and dec formatted&lt;br /&gt;
function p.convert ( frame )&lt;br /&gt;
	local gpar = frame.args;&lt;br /&gt;
	local hcod = convdh ( gpar[1], gpar[2], gpar[3] );&lt;br /&gt;
	local fnum = p.convhdf (hcod)&lt;br /&gt;
	return '&amp;amp;#35;' .. mw.ustring.sub ( hcod, 2 ) .. mw.ustring.sub ( fnum, 2);&lt;br /&gt;
end -- function convert&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--  ============================================================================&lt;br /&gt;
--  main function tincture&lt;br /&gt;
function p.main (frame)&lt;br /&gt;
	local getArgs = require( 'Module:Arguments' ).getArgs&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
	local ss = args.ss  or '0'&lt;br /&gt;
	if ss == '≈' then ss = '0' end&lt;br /&gt;
	local top = ''&lt;br /&gt;
	if args.s == 'f' then top = 'flag ' end&lt;br /&gt;
	local tc = args.tc&lt;br /&gt;
	local pf = args.pf&lt;br /&gt;
	local gt = args.gpltab or &amp;quot;&amp;quot;&lt;br /&gt;
	local align = 'tincturebox-left'&lt;br /&gt;
	local error_cat = true&lt;br /&gt;
	local InFi = (args['+'] == '+')&lt;br /&gt;
	local cols = args&lt;br /&gt;
	local colors = {}&lt;br /&gt;
	local box = {}&lt;br /&gt;
	local tab = {}&lt;br /&gt;
	local out = {}&lt;br /&gt;
	local ordtab = { }&lt;br /&gt;
	local insert = false&lt;br /&gt;
&lt;br /&gt;
	if gt == &amp;quot;&amp;quot; then &lt;br /&gt;
		if mw.title.getCurrentTitle().namespace == 4 then gt = '3' &lt;br /&gt;
		else gt = '1'&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if gt == &amp;quot;2&amp;quot; or gt == &amp;quot;3&amp;quot; then&lt;br /&gt;
		InFi = true&lt;br /&gt;
		error_cat = false&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	ss = mw.ustring.upper( ss )&lt;br /&gt;
	if type(args[1]) == 'string' and args[1]:sub(1, 6) == '&amp;lt;table' then&lt;br /&gt;
		return args[1]&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if args[2] == nil  then&lt;br /&gt;
		cols = mw.text.split(args[1] or '', '%s*/%s*')&lt;br /&gt;
	end&lt;br /&gt;
	if cols.ss	then&lt;br /&gt;
		ss =  mw.ustring.upper( cols.ss )&lt;br /&gt;
	end 	&lt;br /&gt;
	for _, v in ipairs(cols) do&lt;br /&gt;
		if not v or v == '' then&lt;br /&gt;
			break&lt;br /&gt;
		elseif v == '-' then&lt;br /&gt;
			error_cat = false&lt;br /&gt;
		elseif v == '+' then&lt;br /&gt;
			InFi = true&lt;br /&gt;
		elseif mw.ustring.sub( v, 1, 3 ) == 'ss=' then  -- any case when ss=&lt;br /&gt;
			ss = mw.ustring.upper( mw.ustring.sub( v, 4 ) )&lt;br /&gt;
		elseif mw.ustring.len( v ) == 2 &lt;br /&gt;
		   and v == mw.ustring.upper( v ) then  -- belongs to character class %u&lt;br /&gt;
			ss = v&lt;br /&gt;
		else&lt;br /&gt;
			table.insert(colors, v)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
--  0) headline and boxes&lt;br /&gt;
	if gt == &amp;quot;2&amp;quot; or gt ==&amp;quot;3&amp;quot; then&lt;br /&gt;
		table.insert(out, frame:expandTemplate{title='=', args={'&amp;lt;h4&amp;gt;GPLtab '..draw('gpltabnam',ss,'','','tab')..'&amp;lt;/h4&amp;gt;'}})&lt;br /&gt;
	end&lt;br /&gt;
	for i, v in ipairs(colors) do&lt;br /&gt;
		box[i] = draw(v, ss, tc, pf, 'box')&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
-- 1) cat: sorted table&lt;br /&gt;
	if error_cat == true then&lt;br /&gt;
		insort = sortc (colors, ordtab, 'a' )&lt;br /&gt;
		insort = sortc (colors, ordtab, 'A' )&lt;br /&gt;
		insort = sortc (colors, ordtab, 'o' )&lt;br /&gt;
		insort = sortc (colors, ordtab, 'b' )&lt;br /&gt;
		insort = sortc (colors, ordtab, 'B' )&lt;br /&gt;
		insort = sortc (colors, ordtab, 'c' )&lt;br /&gt;
		insort = sortc (colors, ordtab, 'C' )&lt;br /&gt;
		insort = sortc (colors, ordtab, 'g' )&lt;br /&gt;
		insort = sortc (colors, ordtab, 'n' )&lt;br /&gt;
		insort = sortc (colors, ordtab, 'p' )&lt;br /&gt;
		insort = sortc (colors, ordtab, 's' )&lt;br /&gt;
		insort = sortc (colors, ordtab, 't' )&lt;br /&gt;
		insort = sortc (colors, ordtab, 'v' )&lt;br /&gt;
		insort = sortc (colors, ordtab, 'x' )&lt;br /&gt;
		table.insert(box, category(ordtab, ss, tc, args.cat, no_error_cat))&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
-- 2) box&lt;br /&gt;
	if gt == &amp;quot;1&amp;quot; or gt ==&amp;quot;3&amp;quot; then&lt;br /&gt;
		if args.align == 'right' or args.align == 'center' then&lt;br /&gt;
			align = 'tincturebox-' .. align&lt;br /&gt;
		end&lt;br /&gt;
		local frame = mw.getCurrentFrame()&lt;br /&gt;
		text = frame:extensionTag('templatestyles', '', { src = 'Tincture/styles.css' }) ..&lt;br /&gt;
			'&amp;lt;div class=&amp;quot;tincturebox ' .. align .. '&amp;quot;&amp;gt;' .. table.concat(box) .. '&amp;lt;/div&amp;gt;'&lt;br /&gt;
		if InFi then&lt;br /&gt;
			local name = mw.getContentLanguage():ucfirst(frame:expandTemplate{ title = 'I18n/COA', args = { top .. 'tincture' } })&lt;br /&gt;
			local link = ' &amp;lt;small&amp;gt;([[Template:Tincture/draw'..ss..'|'..ss..']])&amp;lt;/small&amp;gt;'&lt;br /&gt;
			if ss ~= '' and ss ~= '0' then name = name .. link end &lt;br /&gt;
			table.insert(out, frame:expandTemplate{ title = 'InFi', args = { name, text } })&lt;br /&gt;
		else&lt;br /&gt;
			table.insert(out, text )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
-- 3) tab&lt;br /&gt;
	if gt == &amp;quot;2&amp;quot; or gt ==&amp;quot;3&amp;quot; then&lt;br /&gt;
		table.insert(out, frame:expandTemplate{ title = '=', args = { &amp;quot;&amp;amp;#35;&amp;lt;br&amp;gt;&amp;quot; } })&lt;br /&gt;
		for i, v in ipairs(colors) do&lt;br /&gt;
			table.insert(out, draw( v, ss, tc, pf, 'tab') ) &lt;br /&gt;
		end&lt;br /&gt;
		table.insert(out, frame:expandTemplate{ title = '=', args = { &amp;quot;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;quot; } })&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat(out)&lt;br /&gt;
end -- function main / tincture &lt;br /&gt;
&lt;br /&gt;
return p;&lt;/div&gt;</summary>
		<author><name>Mediawiki&gt;Sarang</name></author>
	</entry>
</feed>