Модуль:Languages: различия между версиями

Материал из in.wiki
Перейти к навигации Перейти к поиску
м (откат правок 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 .. "&nbsp;<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
 

Версия от 10:27, 12 июня 2014

Для документации этого модуля может быть создана страница Модуль:Languages/doc