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

Материал из in.wiki
Перейти к навигации Перейти к поиску
( Полностью удалено содержимое страницы)
м (откат правок 37.75.200.122 (обс) к версии EugenG)
Строка 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:28, 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 .. "&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