Module:CharSwatch

From Wiki of ZZT
Revision as of 23:20, 16 January 2021 by Quantum (talk | contribs) (Fix pixel alignment issue, tweak padding again)
Jump to navigation Jump to search

Documentation for this module may be created at Module:CharSwatch/doc

local p = {}

function p.swatch(frame)
	local char = tonumber(frame.args[1])
	return string.format(
		"[[char|#char]] %d %s (0x%02X)",
		char, tostring(html_swatch(char)), char
	)
end

function html_swatch(i)
	-- Trick: use outer span to get the char to align with pixel grid.
	-- I think this is necessary because preceding text may not be monospaced
	-- or an exact pixel width, so the char gets pushed horizontally by a
	-- fraction of a pixel. Using an outer span fixes it in Chromium/Firefox.
	local outer = mw.html.create("span")
	outer:css({
		display = "inline-flex",
		["justify-content"] = "center",
		["min-width"]  = "11px"
	})
	local inner = outer:tag("span")
	inner:css({
		["background-color"] = "#555",
		["box-shadow"] = "0 0 1px #808080",
		color = "#fff",
		display = "inline-block",
		font = "14px EGA8",
		height = "1em",
		["line-height"] = "100%",
		["min-height"] = "14px",
		["min-width"] = "8px",
		padding = "1px",
		["vertical-align"] = "middle"
	})
	inner:wikitext(char_to_unicode(i))
	return outer
end

local unicode_table = {
	[0] = " ", -- should be null, display as space
	[1] = "☺",
	[2] = "☻",
	[3] = "♥",
	[4] = "♦",
	[5] = "♣",
	[6] = "♠",
	[7] = "•",
	[8] = "◘",
	[9] = "○",
	[10] = "◙",
	[11] = "♂",
	[12] = "♀",
	[13] = "♪",
	[14] = "♫",
	[15] = "☼",
	[16] = "►",
	[17] = "◄",
	[18] = "↕",
	[19] = "‼",
	[20] = "¶",
	[21] = "§",
	[22] = "▬",
	[23] = "↨",
	[24] = "↑",
	[25] = "↓",
	[26] = "→",
	[27] = "←",
	[28] = "∟",
	[29] = "↔",
	[30] = "▲",
	[31] = "▼",
	[127] = "⌂",
	[128] = "Ç",
	[129] = "ü",
	[130] = "é",
	[131] = "â",
	[132] = "ä",
	[133] = "à",
	[134] = "å",
	[135] = "ç",
	[136] = "ê",
	[137] = "ë",
	[138] = "è",
	[139] = "ï",
	[140] = "î",
	[141] = "ì",
	[142] = "Ä",
	[143] = "Å",
	[144] = "É",
	[145] = "æ",
	[146] = "Æ",
	[147] = "ô",
	[148] = "ö",
	[149] = "ò",
	[150] = "û",
	[151] = "ù",
	[152] = "ÿ",
	[153] = "Ö",
	[154] = "Ü",
	[155] = "¢",
	[156] = "£",
	[157] = "¥",
	[158] = "₧",
	[159] = "ƒ",
	[160] = "á",
	[161] = "í",
	[162] = "ó",
	[163] = "ú",
	[164] = "ñ",
	[165] = "Ñ",
	[166] = "ª",
	[167] = "º",
	[168] = "¿",
	[169] = "⌐",
	[170] = "¬",
	[171] = "½",
	[172] = "¼",
	[173] = "¡",
	[174] = "«",
	[175] = "»",
	[176] = "░",
	[177] = "▒",
	[178] = "▓",
	[179] = "│",
	[180] = "┤",
	[181] = "╡",
	[182] = "╢",
	[183] = "╖",
	[184] = "╕",
	[185] = "╣",
	[186] = "║",
	[187] = "╗",
	[188] = "╝",
	[189] = "╜",
	[190] = "╛",
	[191] = "┐",
	[192] = "└",
	[193] = "┴",
	[194] = "┬",
	[195] = "├",
	[196] = "─",
	[197] = "┼",
	[198] = "╞",
	[199] = "╟",
	[200] = "╚",
	[201] = "╔",
	[202] = "╩",
	[203] = "╦",
	[204] = "╠",
	[205] = "═",
	[206] = "╬",
	[207] = "╧",
	[208] = "╨",
	[209] = "╤",
	[210] = "╥",
	[211] = "╙",
	[212] = "╘",
	[213] = "╒",
	[214] = "╓",
	[215] = "╫",
	[216] = "╪",
	[217] = "┘",
	[218] = "┌",
	[219] = "█",
	[220] = "▄",
	[221] = "▌",
	[222] = "▐",
	[223] = "▀",
	[224] = "ɑ",
	[225] = "ϐ",
	[226] = "ᴦ",
	[227] = "ᴨ",
	[228] = "∑",
	[229] = "ơ",
	[230] = "µ",
	[231] = "ᴛ",
	[232] = "ɸ",
	[233] = "ϴ",
	[234] = "Ω",
	[235] = "ẟ",
	[236] = "∞",
	[237] = "∅",
	[238] = "∈",
	[239] = "∩",
	[240] = "≡",
	[241] = "±",
	[242] = "≥",
	[243] = "≤",
	[244] = "⌠",
	[245] = "⌡",
	[246] = "÷",
	[247] = "≈",
	[248] = "°",
	[249] = "∙",
	[250] = "·",
	[251] = "√",
	[252] = "ⁿ",
	[253] = "²",
	[254] = "■",
	[255] = " "
}

function char_to_unicode(i)
	if i < 0 or i > 255 then
		error("char index out of range: " .. i)
	end
	if i >= 32 and i <= 126 then
		-- Handle regular ASCII characters
		return string.char(i)
	end
	return unicode_table[i]
end

return p