Модуль:Languages
Документация
Этот модуль используется в шаблоне {{l6e}} при создании собственно языковых ссылок путём конструкции {{#invoke:Languages|list|множество языков}}. За более подробной документацией насчёт работы шаблона следует идти в его документацию.
Также модуль используется для различных преобразований кодов языков.
Тесты
All tests passed.
test_getRefHtml:
Text | Expected | Actual | |
---|---|---|---|
Шаблон:Tick | {{#invoke:Languages | getRefHtmlFrame | }} | ||
Шаблон:Tick | {{#invoke:Languages | getRefHtmlFrame | QNNN }} | ||
Шаблон:Tick | {{#invoke:Languages | getRefHtmlFrame | Q1860 }} | (англ.) | (англ.) |
Шаблон:Tick | {{#invoke:Languages | getRefHtmlFrame | Q7737 }} | (рус.) | (рус.) |
--[[ Модуль для работы с языками ISO 639
Наверное его надо целиком переписать, это только proof of concept
]]
-- загрузка модуля данных с таблицей языков
local languages = mw.loadData("Module:Languages/data")
local p = {}
-- вспомогательная функция, удаляет пробелы
local function trimstr(s)
return (s:gsub("^%s*(.-)%s*$", "%1"))
end
-- получает код языка, возвращает ссылку и нормализованный код языка (или пустые строки)
local function get_lang_data(code)
local l = languages[code];
if l ~= nil then
return "[[" .. l[2] .. "|" .. l[1] .. "]]", code
elseif code ~= "" then
return code, ""
else
return "", ""
end
end
function p.getRefHtmlFrame( frame )
return p.getRefHtml( trimstr( frame.args[1] ) )
end
function p.getRefHtml( wikidataItemId )
local codeByItemId = mw.loadData( "Module:Wikidata/Language-codes" )
local code = codeByItemId[ wikidataItemId ];
if code == nil then
mw.log( 'Language code not found for ' .. wikidataItemId )
return ""
else
local l = languages[code];
if l == nil then
mw.log( 'Language description for code ' .. code .. ' not found' )
return ""
else
return '<span class="ref-info" title="' .. l[ 2 ] .. '" style="font-size:85%; cursor:help; color:#888;">(' .. l[ 1 ] .. ')</span>'
end
end
end
-- принимает zh|我|tt|мин, возвращает список через запятую
function p.list(frame)
local curr_lang = nil
local result = nil
for n, v in frame:argumentPairs() do
local trimmed = trimstr(v)
if curr_lang == nil then
if trimmed ~= '' then
-- если язык пропущен, оставим прошлый
curr_lang = trimstr(v)
end
else
if trimmed ~= '' then
local link, lang_code = get_lang_data(curr_lang)
local list_item
if lang_code ~= '' then
list_item = link .. " <span lang='" .. lang_code .. "'>" .. trimmed .. "</span>"
else
list_item = link .. " <span class='unknown-foreign-lang'>" .. trimmed .. "</span>"
end
if result == nil then
result = list_item
else
result = result .. ", " .. list_item
end
else
-- Пустой текст — значит, текущий язык совпадает с следующим
local link, lang_code = get_lang_data(curr_lang)
if result == nil then
result = link
else
result = result .. ", " .. link
end
end
curr_lang = nil
end
end
-- просто #invoke:Languages|list|yue должно возвращать всё же ссылку без текста
if curr_lang ~= nil then
local link, lang_code = get_lang_data(curr_lang)
if result ~= nil then
result = result .. ", " .. link
else
result = link
end
end
return result
end
return p