Модуль:Unicode/data
Перейти к навигации
Перейти к поиску
Данный модуль возвращает данные о символах Юникода по их десятеричному или шестнадцатеричному представлению.
Использование
[править код]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