<?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%3ACharmap</id>
	<title>Module:Charmap - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ACharmap"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Charmap&amp;action=history"/>
	<updated>2026-06-07T03:41:29Z</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:Charmap&amp;diff=135526&amp;oldid=prev</id>
		<title>imported&gt;GKFX: Update from sandbox.</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Charmap&amp;diff=135526&amp;oldid=prev"/>
		<updated>2021-12-13T20:45:26Z</updated>

		<summary type="html">&lt;p&gt;Update from sandbox.&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;
local unicode_convert = require(&amp;#039;Module:Unicode convert&amp;#039;)&lt;br /&gt;
local numcr2namecr = mw.loadData(&amp;#039;Module:Numcr2namecr&amp;#039;)&lt;br /&gt;
local yesno = require(&amp;#039;Module:Yesno&amp;#039;)&lt;br /&gt;
local GB18030_cache = {}&lt;br /&gt;
&lt;br /&gt;
-- Input e.g. &amp;quot;  A  B  FF  &amp;quot;, output &amp;quot;10 11 255&amp;quot;&lt;br /&gt;
local function hex2dec_words(s)&lt;br /&gt;
	local x = mw.text.split(mw.text.trim(s or &amp;#039;&amp;#039;), &amp;#039;%s+&amp;#039;)&lt;br /&gt;
	if #x == 1 and x[1] == &amp;#039;&amp;#039; then return &amp;#039;&amp;#039; end&lt;br /&gt;
	for i = 1, #x do&lt;br /&gt;
		x[i] = tonumber(x[i], 16) or 0&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat(x, &amp;#039; &amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Wrapper to let us replace Template:UTF-8 and Template:UTF-16&lt;br /&gt;
local function template(title, args)&lt;br /&gt;
	if title == &amp;#039;UTF-8&amp;#039; then&lt;br /&gt;
		return unicode_convert.getUTF8{ args = args }&lt;br /&gt;
	elseif title == &amp;#039;UTF-16&amp;#039; then&lt;br /&gt;
		return unicode_convert.getUTF16{ args = args }&lt;br /&gt;
	elseif title == &amp;#039;hex2dec&amp;#039; then&lt;br /&gt;
		return tostring(tonumber(args[1], 16))&lt;br /&gt;
	elseif title == &amp;#039;charmap/numcharref&amp;#039; then&lt;br /&gt;
		local format = args[&amp;#039;base&amp;#039;] == &amp;#039;dec&amp;#039; and &amp;#039;&amp;amp;amp;#%d;&amp;lt;wbr&amp;gt;&amp;#039; or &amp;#039;&amp;amp;amp;#x%02X;&amp;lt;wbr&amp;gt;&amp;#039;&lt;br /&gt;
		return format:format(tonumber(args[1], 16))&lt;br /&gt;
	elseif title == &amp;#039;charmap/showchar&amp;#039; then&lt;br /&gt;
		return &amp;#039;&amp;amp;#x&amp;#039; .. mw.text.trim(args[1]) .. &amp;#039;;&amp;#039;&lt;br /&gt;
	elseif title == &amp;#039;GB18030&amp;#039; then&lt;br /&gt;
		if GB18030_cache[args[1]] then&lt;br /&gt;
			if args[&amp;#039;base&amp;#039;] == &amp;#039;dec&amp;#039; then&lt;br /&gt;
				return mw.getCurrentFrame():expandTemplate{&lt;br /&gt;
					title = &amp;#039;GB18030/decimal&amp;#039;, args = { GB18030_cache[args[1]] }}&lt;br /&gt;
			else return GB18030_cache[args[1]] end&lt;br /&gt;
		elseif os.clock() &amp;gt; 7 then&lt;br /&gt;
			return &amp;quot;&amp;#039;&amp;#039;currently unavailable&amp;#039;&amp;#039;&amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			GB18030_cache[args[1]] = mw.getCurrentFrame():expandTemplate{title = &amp;#039;GB18030&amp;#039;, args = {args[1]}}&lt;br /&gt;
			if args[&amp;#039;base&amp;#039;] == &amp;#039;dec&amp;#039; then&lt;br /&gt;
				return hex2dec_words(GB18030_cache[args[1]])&lt;br /&gt;
			else return GB18030_cache[args[1]] end&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return mw.getCurrentFrame():expandTemplate{ title = title, args = args }&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function _multiUTF(args)&lt;br /&gt;
	local code = args[1] or &amp;#039;&amp;#039;&lt;br /&gt;
	local encoding = args[2] or &amp;#039;UTF-8&amp;#039;&lt;br /&gt;
	local output = &amp;#039;&amp;#039;&lt;br /&gt;
	local pstp_sep = encoding:sub(1, 8) == &amp;#039;charmap/&amp;#039; and &amp;#039;&amp;#039; or &amp;#039; &amp;#039;&lt;br /&gt;
	local words = mw.text.split(mw.text.trim(code), &amp;#039;%s&amp;#039;)&lt;br /&gt;
	&lt;br /&gt;
	if not (encoding == &amp;#039;charmap/showchar&amp;#039; or encoding == &amp;#039;hex2dec&amp;#039;) then&lt;br /&gt;
		output = &amp;#039;|| &amp;#039;&lt;br /&gt;
		for i = 1, #words do&lt;br /&gt;
			output = output .. template(encoding, {words[i], base = &amp;#039;dec&amp;#039;})&lt;br /&gt;
			if i == 4 then break end&lt;br /&gt;
			output = output .. pstp_sep&lt;br /&gt;
		end&lt;br /&gt;
		output = output .. &amp;#039;|| &amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for i = 1, #words do&lt;br /&gt;
		output = output .. template(encoding, {words[i]})&lt;br /&gt;
		if i == 4 then break end&lt;br /&gt;
		output = output .. pstp_sep&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return output&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function paramCoalesce(args, arg1, arg2)&lt;br /&gt;
	if args[arg1] ~= nil and args[arg1] ~= &amp;#039;&amp;#039; then return args[arg1] end&lt;br /&gt;
	if arg2 ~= nil and args[arg2] ~= nil and args[arg2] ~= &amp;#039;&amp;#039; then return args[arg2] end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.alt = function(frame, n)&lt;br /&gt;
	n = n or frame.args[1]&lt;br /&gt;
	local args = frame:getParent().args&lt;br /&gt;
	if args[&amp;#039;map&amp;#039; .. n] == &amp;#039;&amp;#039; or args[&amp;#039;map&amp;#039; .. n] == nil then return &amp;#039;&amp;#039;	end&lt;br /&gt;
	&lt;br /&gt;
	local output = &amp;#039;|-\n| &amp;#039; .. args[&amp;#039;map&amp;#039; .. n]&lt;br /&gt;
	local codes = {}&lt;br /&gt;
	for i = 1, 10 do&lt;br /&gt;
		if args[&amp;#039;name&amp;#039; .. i] and args[&amp;#039;name&amp;#039; .. i] ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			local x = args[&amp;#039;map&amp;#039; .. n .. &amp;#039;char&amp;#039; .. i] or &amp;#039;&amp;#039;&lt;br /&gt;
			output = output .. &amp;#039; || &amp;#039; .. hex2dec_words(x) .. &amp;#039; || &amp;#039; .. frame:callParserFunction(&amp;#039;uc&amp;#039;, x)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return output .. &amp;#039;\n&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.head = function(frame)&lt;br /&gt;
	local output = &amp;#039;|- style=&amp;quot;text-align:center;&amp;quot;\n&amp;#039;&lt;br /&gt;
	codes = {} -- May contain nils if bad input&lt;br /&gt;
	infos = {} -- boolean array&lt;br /&gt;
	names = {} -- string array&lt;br /&gt;
	args = frame:getParent().args&lt;br /&gt;
	for i = 1, 10 do&lt;br /&gt;
		if args[&amp;#039;name&amp;#039; .. i] and args[&amp;#039;name&amp;#039; .. i] ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			-- The parser function uc: preserves strip markers.&lt;br /&gt;
			codes[1 + #names] = frame:callParserFunction(&amp;#039;uc&amp;#039;, mw.text.trim(args[i]))&lt;br /&gt;
			infos[1 + #names] = paramCoalesce(args, &amp;#039;Info&amp;#039; .. i, &amp;#039;Info&amp;#039;) == &amp;#039;yes&amp;#039;&lt;br /&gt;
			names[1 + #names] = frame:callParserFunction(&amp;#039;uc&amp;#039;, args[&amp;#039;name&amp;#039; .. i])&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if #names &amp;gt; 0 then&lt;br /&gt;
		output = output .. &amp;quot;! &amp;quot; .. frame:preprocess(&amp;#039;&amp;lt;templatestyles src=&amp;quot;Module:Charmap/styles.css&amp;quot;/&amp;gt;&amp;#039;) ..&lt;br /&gt;
			(next(codes) == nil and &amp;#039;Character&amp;#039; or &amp;#039;Unicode&amp;#039;) .. &amp;quot; name&amp;quot;&lt;br /&gt;
		for i, n in ipairs(names) do&lt;br /&gt;
			-- Display the character in smallcaps&lt;br /&gt;
			output = output .. &amp;#039;\n| colspan=&amp;quot;2&amp;quot; class=&amp;quot;smallcaps-cm&amp;quot; | &amp;#039; .. n&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	output = output .. &amp;#039;\n|-\n! style=&amp;quot;text-align:left;&amp;quot; | Encodings || decimal || hex&amp;#039; ..&lt;br /&gt;
		string.rep(&amp;#039;|| dec || hex&amp;#039;, #names - 1) ..&lt;br /&gt;
		&amp;#039;\n|-\n| [[Unicode]]&amp;#039;&lt;br /&gt;
	for i, n in ipairs(names) do&lt;br /&gt;
		local code = codes[i] or &amp;#039;&amp;#039;;&lt;br /&gt;
		-- padleft, get to form U+XXXX or U+XXXX+XXXX.&lt;br /&gt;
		code = (#code &amp;gt;= 4) and code:gsub(&amp;#039; &amp;#039;, &amp;#039;+&amp;#039;) or (&amp;#039;0000&amp;#039; .. (code or &amp;#039;&amp;#039;)):sub(-4)&lt;br /&gt;
		output = output .. &amp;#039; || &amp;#039; .. _multiUTF{codes[i] or &amp;#039;0&amp;#039;, &amp;#039;hex2dec&amp;#039;} .. &amp;#039; || &amp;#039; ..&lt;br /&gt;
			(infos[i] and &amp;#039;[http://www.fileformat.info/info/unicode/char/%s/index.htm U+%s]&amp;#039; or &amp;#039;U+%s&amp;#039;):format(code, code)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	output = output .. &amp;#039;\n|-\n| [[UTF-8]]&amp;#039;&lt;br /&gt;
	for i, n in ipairs(names) do&lt;br /&gt;
		output = output .. _multiUTF{codes[i]}&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local outsideBMP = false -- Do we need to show surrogate pairs?&lt;br /&gt;
	for i, n in ipairs(names) do&lt;br /&gt;
		if (tonumber(codes[i] or &amp;#039;&amp;#039;, 16) or 0) &amp;gt; 0xFFFF then&lt;br /&gt;
			outsideBMP = true&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if outsideBMP then&lt;br /&gt;
		output = output .. &amp;#039;\n|-\n| [[UTF-16]]&amp;#039;&lt;br /&gt;
		for i, n in ipairs(names) do&lt;br /&gt;
			output = output .. _multiUTF{codes[i], &amp;#039;UTF-16&amp;#039;}&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if yesno(args[&amp;#039;IncludeGB&amp;#039;]) then&lt;br /&gt;
		output = output .. &amp;#039;\n|-\n| [[GB 18030]]&amp;#039;&lt;br /&gt;
		for i, n in ipairs(names) do&lt;br /&gt;
			output = output .. _multiUTF{codes[i], &amp;#039;GB18030&amp;#039;}&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if #names &amp;gt; 4 then&lt;br /&gt;
		output = output .. &amp;#039;\n|- class=&amp;quot;template-charmap-numchr&amp;quot;\n| [[Numeric character reference]]&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		output = output .. &amp;#039;\n|-\n| [[Numeric character reference]]&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	for i, n in ipairs(names) do&lt;br /&gt;
		output = output .. _multiUTF{codes[i], &amp;#039;charmap/numcharref&amp;#039;}&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return output&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.named = function(frame, n)&lt;br /&gt;
	n = n or frame.args[1]&lt;br /&gt;
	local args = frame:getParent().args&lt;br /&gt;
	local refchars = {}&lt;br /&gt;
	local empty = true;&lt;br /&gt;
	local namedref = (n == &amp;#039;html&amp;#039;) and &amp;#039;[[List of XML and HTML character entity references|Named character reference]]&amp;#039; or&lt;br /&gt;
		args[&amp;#039;namedref&amp;#039; .. n] or &amp;#039;&amp;#039;;&lt;br /&gt;
	for i = 1, 10 do&lt;br /&gt;
		if args[&amp;#039;name&amp;#039; .. i] and args[&amp;#039;name&amp;#039; .. i] ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			local x = (n == &amp;#039;html&amp;#039;) and&lt;br /&gt;
				(numcr2namecr[tonumber(args[i], 16)] or &amp;#039;&amp;#039;) or&lt;br /&gt;
				args[&amp;#039;ref&amp;#039; .. n .. &amp;#039;char&amp;#039; .. i] or &amp;#039;&amp;#039;&lt;br /&gt;
			empty = empty and #x == 0&lt;br /&gt;
			refchars[1 + #refchars] = x&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if empty then return &amp;#039;&amp;#039; end&lt;br /&gt;
	return &amp;#039;|- style=&amp;quot;text-align:center&amp;quot;\n| &amp;#039; .. namedref ..&lt;br /&gt;
		(&amp;#039; || colspan=&amp;quot;2&amp;quot; | %s&amp;#039;):rep(#refchars):format(unpack(refchars)) .. &amp;#039;\n&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Draw a preview block, possibly with multiple styles&lt;br /&gt;
function preview(args, i)&lt;br /&gt;
	local result = &amp;#039;&amp;#039;&lt;br /&gt;
	for j = 1, math.huge do&lt;br /&gt;
		local label = paramCoalesce(args, &amp;#039;style&amp;#039; .. i .. &amp;#039;-&amp;#039; .. j .. &amp;#039;label&amp;#039;, &amp;#039;style&amp;#039; .. j .. &amp;#039;label&amp;#039;)&lt;br /&gt;
		if not label then break end&lt;br /&gt;
		local div = mw.html.create(&amp;#039;div&amp;#039;):tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
		div:tag(&amp;#039;span&amp;#039;):wikitext(label)&lt;br /&gt;
		div:tag(&amp;#039;span&amp;#039;)&lt;br /&gt;
			:cssText(args[&amp;#039;style&amp;#039; .. j]):cssText(args[&amp;#039;style&amp;#039; .. i .. &amp;#039;-&amp;#039; .. j])&lt;br /&gt;
			:wikitext(paramCoalesce(args, &amp;#039;image&amp;#039; .. i .. &amp;#039;-&amp;#039; .. j, &amp;#039;image&amp;#039; .. i) or&lt;br /&gt;
				_multiUTF{args[i] or &amp;#039;20&amp;#039;, &amp;#039;charmap/showchar&amp;#039;})&lt;br /&gt;
		result = result .. tostring(div)&lt;br /&gt;
	end&lt;br /&gt;
	-- Setting the font-size on the cell changes its padding.&lt;br /&gt;
	local size = (result == &amp;#039;&amp;#039;) and (paramCoalesce(args, &amp;#039;size&amp;#039; .. i, &amp;#039;size&amp;#039;) or &amp;#039;150%&amp;#039;) or &amp;#039;100%&amp;#039;&lt;br /&gt;
	local cell =  &amp;#039; || colspan=&amp;quot;2&amp;quot; style=&amp;quot;font-size:&amp;#039; .. size .. &amp;#039;&amp;quot; | &amp;#039;&lt;br /&gt;
	if result == &amp;#039;&amp;#039; then&lt;br /&gt;
		return cell .. (paramCoalesce(args, &amp;#039;image&amp;#039; .. i) or _multiUTF{args[i] or &amp;#039;20&amp;#039;, &amp;#039;charmap/showchar&amp;#039;})&lt;br /&gt;
	else&lt;br /&gt;
		return cell .. &amp;#039;&amp;lt;div&amp;gt;&amp;#039; .. result .. &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.main = function(frame)&lt;br /&gt;
	-- text-align:center: &amp;#039;&amp;#039;&lt;br /&gt;
	local output = {&amp;#039;{| class=&amp;quot;wikitable template-charmap&amp;quot; style=&amp;quot;text-align:right&amp;quot;\n&amp;#039;,&lt;br /&gt;
		&amp;#039;|+Character information\n&amp;#039;,&lt;br /&gt;
		&amp;#039;|- style=&amp;quot;text-align:center&amp;quot;\n&amp;#039;, -- Otherwise mobile site tries aligning preview cells right&lt;br /&gt;
		&amp;#039;! scope=&amp;quot;row&amp;quot; | Preview&amp;#039;}&lt;br /&gt;
	local args = frame:getParent().args&lt;br /&gt;
	for i = 1, 10 do&lt;br /&gt;
		--  Header row with the symbol in a large font or an image&lt;br /&gt;
		if args[&amp;#039;name&amp;#039; .. i] and args[&amp;#039;name&amp;#039; .. i] ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			output[1 + #output] = preview(args, i)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	output[1 + #output] = &amp;#039;\n&amp;#039; .. p.head(frame) .. &amp;#039;\n&amp;#039; .. p.named(frame, &amp;#039;html&amp;#039;)&lt;br /&gt;
	for i = 1, 10 do&lt;br /&gt;
		output[1 + #output] = p.alt(frame, i)&lt;br /&gt;
	end&lt;br /&gt;
	for i = 1, 5 do&lt;br /&gt;
		output[1 + #output] = p.named(frame, i)&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat(output) .. &amp;#039;|}&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;GKFX</name></author>
	</entry>
</feed>