Module:User:Erutuon/Unicode

local export = {}

local Array = require("Module:array") local fun = require("Module:fun") local m_table = require("Module:table") local m_Unicode_data = require("Module:Unicode data") local lookup_name = m_Unicode_data.lookup_name local is_combining = m_Unicode_data.is_combining

local capitalize = m_table.listToSet { "latin", "greek", "coptic", "cyrillic", "armenian", "hebrew", "arabic", "syriac", "thaana", "samaritan", "mandaic", "devanagari", "bengali", } -- ... local special = { ipa = "IPA", nko = "NKo", }

local function get_name(char) return lookup_name(mw.ustring.codepoint(char)) :lower :gsub("%S+",			function(word)				if capitalize[word] then					return word:gsub("^%l", string.upper)				else					return special[word]				end			end) end

function export.get_names(frame) local text = fun.map(get_name, frame.args[1]) return table.concat(text, ", ") end

local function exists(pagename) return mw.title.new(pagename).exists end

local function safe_exists(pagename) local success, exists = pcall(exists, pagename) return success and exists end

local output_mt = {} function output_mt:insert(str) self.n = self.n + 1 self[self.n] = str end

function output_mt:insert_format(...) self:insert(string.format(...)) end

output_mt.join = table.concat

output_mt.__index = output_mt

local function Output return setmetatable({ n = 0 }, output_mt) end

function export.show_modules local output = Output output:insert [[

{| class="wikitable" style="text-align: center;"' for i = -1, 0xF do		if i >= 0 then output:insert_format('\n! %X', i)		else output:insert '\n!' end end output:insert '\n|-'
 * + Unicode name and image modules, organized by first three digits of codepoint in hexadecimal base]]

local function range(start, ending) if not (start and ending) then error("Expected two arguments") end local output = Array for i = start, ending do			output:insert(i) end return output end local function make_module_row(type, first_two_digits, attribute) local found_module = false local output = range(0x0, 0xF):map(			function(i)				local first_three_digits = first_two_digits * 0x10 + i				local module = ('Module:Unicode data/' .. type .. '/%03X')					:format(first_three_digits)				local link				if safe_exists(module) then					link = ("" .. type .. ""):format(module)					found_module = true				else					link = " "				end				return ('| title="U+%Xxxx"%s | %s')					:format(first_three_digits, attribute, link)			end) :concat "\n" return output, found_module end local first = true for first_two_digits = 0x00, 0x0E do		local attribute = not first and ' style="border-top-width: 3px;"' or "" local row1, found_module1 = make_module_row("names", first_two_digits, attribute) local row2, found_module2 = make_module_row("images", first_two_digits, "") if found_module1 or found_module2 then output:insert_format('\n|-\n! rowspan="2"%s | %02Xx\n%s\n|-\n%s',				attribute, first_two_digits, row1, row2) first = false end end output:insert "\n|}" return output:join end

export.show = export.show_modules

return export