Модуль:Languages: различия между версиями
Перейти к навигации
Перейти к поиску
(← Полностью удалено содержимое страницы) |
м (откат правок 37.75.200.122 (обс) к версии Saint Johann) |
||
Строка 1: | Строка 1: | ||
+ | --[[ Модуль для работы с языками 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 |
Версия от 09:51, 12 июня 2014
Для документации этого модуля может быть создана страница Модуль:Languages/doc
--[[ Модуль для работы с языками 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