<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mywikibiz.com/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://mywikibiz.com/index.php?action=history&amp;feed=atom&amp;title=Module%3ACharmap"/>
	<link rel="alternate" type="text/html" href="https://mywikibiz.com/index.php?title=Module:Charmap&amp;action=history"/>
	<updated>2026-06-14T00:06:10Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.3</generator>
	<entry>
		<id>https://mywikibiz.com/index.php?title=Module:Charmap&amp;diff=471218&amp;oldid=prev</id>
		<title>Zoran: Pywikibot 6.4.0</title>
		<link rel="alternate" type="text/html" href="https://mywikibiz.com/index.php?title=Module:Charmap&amp;diff=471218&amp;oldid=prev"/>
		<updated>2021-07-15T20:55:57Z</updated>

		<summary type="html">&lt;p&gt;Pywikibot 6.4.0&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('Module:Unicode convert')&lt;br /&gt;
local numcr2namecr = mw.loadData('Module:Numcr2namecr')&lt;br /&gt;
local yesno = require('Module:Yesno')&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 ''), '%s+')&lt;br /&gt;
	if #x == 1 and x[1] == '' then return '' 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, ' ')&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 == 'UTF-8' then&lt;br /&gt;
		return unicode_convert.getUTF8{ args = args }&lt;br /&gt;
	elseif title == 'UTF-16' then&lt;br /&gt;
		return unicode_convert.getUTF16{ args = args }&lt;br /&gt;
	elseif title == 'hex2dec' then&lt;br /&gt;
		return tostring(tonumber(args[1], 16))&lt;br /&gt;
	elseif title == 'charmap/numcharref' then&lt;br /&gt;
		local format = args['base'] == 'dec' and '&amp;amp;amp;#%d;&amp;lt;wbr&amp;gt;' or '&amp;amp;amp;#x%02X;&amp;lt;wbr&amp;gt;'&lt;br /&gt;
		return format:format(tonumber(args[1], 16))&lt;br /&gt;
	elseif title == 'charmap/showchar' then&lt;br /&gt;
		return '&amp;amp;#x' .. mw.text.trim(args[1]) .. ';'&lt;br /&gt;
	elseif title == 'GB18030' then&lt;br /&gt;
		if GB18030_cache[args[1]] then&lt;br /&gt;
			if args['base'] == 'dec' then&lt;br /&gt;
				return mw.getCurrentFrame():expandTemplate{&lt;br /&gt;
					title = 'GB18030/decimal', 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;''currently unavailable''&amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			GB18030_cache[args[1]] = mw.getCurrentFrame():expandTemplate{title = 'GB18030', args = {args[1]}}&lt;br /&gt;
			if args['base'] == 'dec' 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 ''&lt;br /&gt;
	local encoding = args[2] or 'UTF-8'&lt;br /&gt;
	local output = ''&lt;br /&gt;
	local pstp_sep = encoding:sub(1, 8) == 'charmap/' and '' or ' '&lt;br /&gt;
	local words = mw.text.split(mw.text.trim(code), '%s')&lt;br /&gt;
	&lt;br /&gt;
	if not (encoding == 'charmap/showchar' or encoding == 'hex2dec') then&lt;br /&gt;
		output = '|| '&lt;br /&gt;
		for i = 1, #words do&lt;br /&gt;
			output = output .. template(encoding, {words[i], base = 'dec'})&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 .. '|| '&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;
p.multiUTF = function(frame) -- temporary&lt;br /&gt;
	return _multiUTF(frame.args)&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] ~= '' then return args[arg1] end&lt;br /&gt;
	if arg2 ~= nil and args[arg2] ~= nil and args[arg2] ~= '' 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['map' .. n] == '' or args['map' .. n] == nil then return ''	end&lt;br /&gt;
	&lt;br /&gt;
	local output = '|-\n| style=&amp;quot;text-align:left;&amp;quot; | ' .. args['map' .. n]&lt;br /&gt;
	local codes = {}&lt;br /&gt;
	for i = 1, 10 do&lt;br /&gt;
		if args['name' .. i] and args['name' .. i] ~= '' then&lt;br /&gt;
			local x = args['map' .. n .. 'char' .. i] or ''&lt;br /&gt;
			output = output .. ' || ' .. hex2dec_words(x) .. ' || ' .. frame:callParserFunction('uc', x)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return output .. '\n'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.head = function(frame)&lt;br /&gt;
	local output = '|- style=&amp;quot;text-align:center;&amp;quot;\n'&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['name' .. i] and args['name' .. i] ~= '' then&lt;br /&gt;
			-- The parser function uc: preserves strip markers.&lt;br /&gt;
			codes[1 + #names] = frame:callParserFunction('uc', mw.text.trim(args[i]))&lt;br /&gt;
			infos[1 + #names] = paramCoalesce(args, 'Info' .. i, 'Info') == 'yes'&lt;br /&gt;
			names[1 + #names] = frame:callParserFunction('uc', args['name' .. 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;| align=\&amp;quot;center\&amp;quot; | '''&amp;quot; .. frame:preprocess('&amp;lt;templatestyles src=&amp;quot;smallcaps/styles.css&amp;quot;/&amp;gt;') ..&lt;br /&gt;
			(next(codes) == nil and 'Character' or 'Unicode') .. &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 .. '|| colspan=2 | &amp;lt;span class=&amp;quot;smallcaps smallcaps-smaller&amp;quot;&amp;gt;' .. n .. '&amp;lt;/span&amp;gt;'&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	output = output .. '\n|-\n! style=&amp;quot;text-align:left;&amp;quot; | Encodings' ..&lt;br /&gt;
		string.rep('|| decimal || hex', #names) ..&lt;br /&gt;
		'\n|-\n| style=&amp;quot;text-align:left;&amp;quot; | [[Unicode]]'&lt;br /&gt;
	for i, n in ipairs(names) do&lt;br /&gt;
		local code = codes[i] or '';&lt;br /&gt;
		-- padleft, get to form U+XXXX or U+XXXX+XXXX.&lt;br /&gt;
		code = (#code &amp;gt;= 4) and code:gsub(' ', '+') or ('0000' .. (code or '')):sub(-4)&lt;br /&gt;
		output = output .. ' || ' .. _multiUTF{codes[i] or '0', 'hex2dec'} .. ' || ' ..&lt;br /&gt;
			(infos[i] and '[http://www.fileformat.info/info/unicode/char/%s/index.htm U+%s]' or 'U+%s'):format(code, code)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	output = output .. '\n|-\n| style=&amp;quot;text-align:left;&amp;quot; | [[UTF-8]]'&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 '', 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 .. '\n|-\n| style=&amp;quot;text-align:left;&amp;quot; | [[UTF-16]]'&lt;br /&gt;
		for i, n in ipairs(names) do&lt;br /&gt;
			output = output .. _multiUTF{codes[i], 'UTF-16'}&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if yesno(args['IncludeGB']) then&lt;br /&gt;
		output = output .. '\n|-\n| style=&amp;quot;text-align:left;&amp;quot; | [[GB 18030]]'&lt;br /&gt;
		for i, n in ipairs(names) do&lt;br /&gt;
			output = output .. _multiUTF{codes[i], 'GB18030'}&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	output = output .. '\n|-\n| style=&amp;quot;text-align:left;&amp;quot; | [[Numeric character reference]]'&lt;br /&gt;
	for i, n in ipairs(names) do&lt;br /&gt;
		output = output .. _multiUTF{codes[i], 'charmap/numcharref'}&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 == 'html') and '[[List of XML and HTML character entity references|Named character reference]]' or&lt;br /&gt;
		args['namedref' .. n] or '';&lt;br /&gt;
	for i = 1, 10 do&lt;br /&gt;
		if args['name' .. i] and args['name' .. i] ~= '' then&lt;br /&gt;
			local x = (n == 'html') and&lt;br /&gt;
				(numcr2namecr[tonumber(args[i], 16)] or '') or&lt;br /&gt;
				args['ref' .. n .. 'char' .. i] or ''&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 '' end&lt;br /&gt;
	return '|- style=&amp;quot;text-align:center&amp;quot;\n| style=&amp;quot;text-align:left&amp;quot; | ' .. namedref ..&lt;br /&gt;
		(' || colspan=&amp;quot;2&amp;quot; | %s'):rep(#refchars):format(unpack(refchars)) .. '\n'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.main = function(frame)&lt;br /&gt;
	-- text-align:center: ''&lt;br /&gt;
	local output = {'{| class=&amp;quot;wikitable template-charmap&amp;quot; style=&amp;quot;text-align:right&amp;quot;\n',&lt;br /&gt;
		'|+Character information\n',&lt;br /&gt;
		'|- style=&amp;quot;text-align:center&amp;quot;\n', -- Otherwise mobile site tries aligning preview cells right&lt;br /&gt;
		'! scope=&amp;quot;row&amp;quot; | Preview'}&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['name' .. i] and args['name' .. i] ~= '' then&lt;br /&gt;
			output[1 + #output] = ' || colspan=&amp;quot;2&amp;quot; style=&amp;quot;font-size:' .. (paramCoalesce(args, 'size' .. i, 'size') or '150%') ..&lt;br /&gt;
				'&amp;quot; | ' .. (paramCoalesce(args, 'image' .. i) or _multiUTF{args[i] or '20', 'charmap/showchar'})&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	output[1 + #output] = '\n' .. p.head(frame) .. '\n' .. p.named(frame, 'html')&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) .. '|}'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Zoran</name></author>
	</entry>
</feed>