Документация

Данный модуль возвращает данные о символах Юникода по их десятеричному или шестнадцатеричному представлению.

Использование

править
local unicodeData = require('Module:Unicode/data').getData

unicodeData(3807) -- работает с десятеричным вводом
unicodeData('0EDF') -- если используете шестнадцатеричный ввод, то в строке должно быть минимум 4 символа (`0EDF` вместо `EDF`).

В результате вы получите данные о символе в виде таблицы.

Генерация данных

править

Для генерации данных можете воспользоваться следующим JS-скриптом и данными из этой ссылки: https://www.unicode.org/Public/15.0.0/ucd/UnicodeData.txt:

const fs = require('fs');

const input = `
<здесь вставьте текст и ссылки выше>
`.trim();

function transformToLuaTable(text) {
    const lines = text.split('\n');
    const result = [];
    
    lines.forEach(line => {
        const parts = line.split(';');
        const key = parts[0];
        const luaTable = {};
        
        for (let i = 0; i < 13; i++) {
            luaTable[i + 1] = parts[i + 1] !== undefined && parts[i + 1] !== '' ? parts[i + 1] : null;
        }

        result.push({ key, luaTable });
    });

    return result;
}

function formatLuaTable(luaTable) {
    let result = '{\n';
    
    luaTable.forEach(entry => {
        result += `    ["${entry.key}"] = {\n`;
        const entries = entry.luaTable;
        for (const index in entries) {
            result += `        [${index}] = ${entries[index] === null ? 'nil' : `"${entries[index]}"`},\n`;
        }
        result += '    },\n';
    });

    result += '}';
    return result;
}

const luaTable = transformToLuaTable(input);
const formattedLuaTable = formatLuaTable(luaTable);

fs.writeFile('unicode_data.lua', formattedLuaTable, 'utf8', (err) => {
    if (err) {
        console.error('Error writing file:', err);
    } else {
        console.log('File has been saved as unicode_data.lua');
    }
});

Полученную таблицу нужно разделить на несколько частей и записать их в подстраницы данного модуля. Также не забудьте задать границы в функции getModuleIndex(). Например в Модуль:Unicode/data/1 последним символом является 0EDF, поэтому в функции прописано следующее:

if number <= tonumber('0x0EDF') then
		return 1
local p = {}

local data = {}

local function getModuleIndex(number)
	if number <= tonumber('0x0EDF') then
		return 1
	elseif number <= tonumber('0x1D61') then
		return 2
	elseif number <= tonumber('0x2BFF') then
		return 3
	elseif number <= tonumber('0xA4C6') then
		return 4
	elseif number <= tonumber('0xFEFC') then
		return 5
	elseif number <= tonumber('0x11241') then
		return 6
	elseif number <= tonumber('0x13455') then
		return 7
	elseif number <= tonumber('0x18CD5') then
		return 8
	elseif number <= tonumber('0x1DAAF') then
		return 9
	else
		return 10
	end
end

function p.getData(character)
	local moduleIndex = 0
	local charKey
	
	if type(character) == 'string' then
		charKey = character:upper()
		character = '0x' .. charKey
		
		moduleIndex = getModuleIndex(tonumber(character))
	else
		charKey = string.format("%03x", character):upper()
		moduleIndex = getModuleIndex(character)
	end
	
	if not data[moduleIndex] then
		data[moduleIndex] = mw.loadData('Module:Unicode/data/' .. moduleIndex)
	end
	
	return data[moduleIndex][charKey]
end

return p