Модуль:Language

Материал из свободной русской энциклопедии «Традиция»
Перейти к навигации Перейти к поиску

Назначение

Получение универсальной информации о языках

Описание функций и параметров

  • get — основная функция получения данных, принимает два параметра:
    • lang — код языка (например, ru, orv и пр.)
    • param — тип получаемой информации (при этом от регистра параметра зависит регистр результата)
      • name, title, им, наз, название, имя — возвращается название языка
      • cat, category, кат, категория — возвращается категория для языка
      • cat2 — возвращается вторая категория для языка (если указана)
      • from, от, gen, genitive, род, его — возвращается название в родительном падеже
      • on, на, pre, пред — возвращается название в предложном падеже
      • pl, мн, plural, они — возвращается название во множественном числе
      • adj, прил, прилагательное — возвращается форма прилагательного
      • short, сокр, сокращение — возвращается сокращение
  • print_table — функция для распечатки текущих данных модуля language/data в красивом и понятном виде (используется на странице документации модуля language/data)
  • list — вывод списка ссылок на языки с кодами, переданными в параметрах, с использованием общепринятых сокращений. Используется шаблоном {{l6e}}:
  • getRefHtmlFrame — вывод сокращённого названия языка со всплывающей подсказкой по коду на Q (что за код?):
    • {{#invoke:Language|getRefHtmlFrame|Q7737}} → (рус.).

Используемые модули

Данные по языкам хранятся в модуле language/data

См. также


-- Наброски модуля для универсальной работы с языками

-- загрузка модуля данных с таблицей языков
local languages = mw.loadData("Module:language/data");
local p = {};

local function get_param (param)
	local param = mw.ustring.lower (param)
	if param == '' or param == 'наз' or param == 'название' or param == 'имя' or param == 'title' or param == 'им' then
		param = 'name'
	end
	if param == 'category' or param == 'кат' or param == 'категория' then
		param = 'cat'
	end
	if param == 'gen' or param == 'genitive' or param == 'от' or param == 'род' or param == 'его' then
		param = 'from'
	end
	if param == 'pre' or param == 'на' or param == 'пред' then
		param = 'on'
	end
	if param == 'прил' or param == 'прилагательное' then
		param = 'adj'
	end
	if param == 'сокр' or param == 'сокращение' then
		param = 'short'
	end
	if param == 'мн' or param == 'plural' or param == 'они' then
		param = 'pl'
	end
	return param
end

local function inflect (paradigm, endings)
	local result = mw.ustring.gsub (paradigm, '%{(%l*)%}', endings)
	return result
end	-- local function inflect (paradigm, endings)
	
local function nom_case (value)
	return inflect (value, {
		['']   = ''
	  , ['ий'] = 'ий'
	  , ['ый'] = 'ый'
	  , ['ое'] = 'ое'
	})
end	-- local function nom_case (value)

local function gen_case (value)
	return inflect (value, {
		['']   = 'а'
	  , ['ий'] = 'ого'
	  , ['ый'] = 'ого'
	  , ['ое'] = 'ого'
	})	
end	-- local function gen_case (value)

local function pre_case (value)
	return inflect (value, {
		['']   = 'е'
	  , ['ий'] = 'ом'
	  , ['ый'] = 'ом'
	  , ['ое'] = 'ом'
	})	
end	-- local function pre_case (value)

local function plural (value)
	return inflect (value, {
		['']   = 'и'
	  , ['ий'] = 'ие'
	  , ['ый'] = 'ие'
	  , ['ое'] = 'ие'
	})	
end	-- local function plural (value)

local gsub = mw.ustring.gsub

local function substitute_taxons (paradigm, apostrophes, with)
	local result = gsub (paradigm, "'([^']+)'", apostrophes)
	for _, taxon in ipairs {'язык', 'диалект', 'наречие', 'говор'} do
		result = gsub (result, '%[(' .. taxon .. ')%]', with)
	end
	result = gsub (result, '  ', ' ')
	result = gsub (result, '%(%)', '')	
	return result
end	-- local function substitute_taxons (paradigm, apostrophes, with)
	
local function get_name (value)
	return substitute_taxons (value, '%1', '')
end	-- local function get_name (value)

local function get_category (value)
	return substitute_taxons (value, '', '%1{}')
end	-- local function get_category (value)

local function implement_get (code, param)
	local result = param
	local data = languages [code] or languages ['-']
	local name_tpl = data.name
	local name = get_name (name_tpl)
	if param == 'name' then
		result = nom_case (name)
	elseif param == 'cat' then
		result = nom_case (get_category (name_tpl))
	elseif param == 'cat2' then
		if data.cat2 then
			result = nom_case (data.cat2)
		else
			result = ''
		end
	elseif param == 'adj' then
		if data.adj then
			adj = data.adj
			if adj == '=' then
				adj = name
			end
			result = nom_case (adj)
		else
			result = '(нет значения)'
		end
	elseif param == 'from' then
		result = gen_case (name)
	elseif param == 'on' then
		result = pre_case (name)
	elseif param == 'pl' then
		result = plural (name)
	elseif param == 'short' then
		if data.short then
			result = data.short
		else
			result = mw.ustring.lower (implement_get (code, 'name')) -- "(нет значения)"
		end
	else
		result = '(ошибка параметра)'
	end
	return mw.text.trim (result)
end	-- local function implement_get (code, param)

function p.get (frame)
	local code = frame.args ['lang']
	local param = frame.args ['param']
	local is_lower = (param ~= '' and mw.ustring.lower (param) == param)
	param = get_param (param)
	local result = implement_get (code, param)
	if is_lower and param ~= 'cat' then
		result = mw.ustring.lower (result)
	end
	return result
end

function p.name (code)
	return implement_get (code, 'cat')
end	-- function p.name (code)

local function colorize(value)
	local result = gsub (value, '(%{[^}]*%})', '<span style="color: darkblue">%1</span>')
	result = gsub (result, "('[^']+')", '<span style="color: green">%1</span>')
	result = gsub (result, '(%[язык%])', '<span style="color: maroon">%1</span>')
	result = gsub (result, '(%[диалект%])', '<span style="color: maroon">%1</span>')
	result = gsub (result, '(%[наречие%])', '<span style="color: maroon">%1</span>')	
	return result
end
local codeByItemId = mw.loadData "Module:Wikidata/Language-codes"
function p.print_table(frame)
	local WDcodes = {}
	for WD, iso in pairs (codeByItemId) do
		WDcodes [iso] = WD
	end
	local result = ''
	local codes = {}
	result = result .. '{| class="sortable prettytable" style="text-align: center;" cellpadding="0" cellspacing="0"\n'
	result = result .. '! Код || Код || Код WikiData || Название || Доп. категория || Прилагательное || Сокращение || Другие названия || Родительный падеж  || Предложный падеж || Множественное число\n'
	
	for code, data in pairs(languages) do
		table.insert(codes, code)
	end
	table.sort (codes)
	for i, code in ipairs (codes) do
		result = result .. '|-'
		if languages [code] .redirect then
			result = result .. "style='background-color: #eeeeee; color: gray;'"
		end
		result = result .. '\n'
		result = result .. '| ' .. code .. ' || ' 
		if languages [code].code then
			result = result .. languages [code].code
		end
		result = result .. ' || ' 
		result = result .. (WDcodes [code] or '')
		result = result .. ' || ' 
		result = result .. colorize (languages [code].name)
		result = result .. ' || '
		if languages [code].cat2 then
			result = result .. colorize (languages [code].cat2)
		end
		result = result .. ' || '
		if languages [code].adj then
			result = result .. colorize (languages [code].adj)
		end
		result = result .. ' || '
		if languages [code].short then
			result = result .. languages [code].short
		end
		result = result .. ' || style="text-align: left;" | '
		if languages [code].other then
			result = result .. colorize (languages [code].other)
		end
		result = result .. ' || style="text-align: left;" | '
		local case = implement_get (code, 'from')
		if case then
			result = result .. colorize (case)
		end
		result = result .. ' || style="text-align: left;" | '
		local case = implement_get (code, 'on')
		if case then
			result = result .. colorize (case)
		end
		result = result .. ' || style="text-align: left;" | '
		local case = implement_get (code, 'pl')
		if case then
			result = result .. colorize (case)
		end
		result = result .. '\n'
	end
	result = result .. '|}'
	return result
end

--[[
	Moved from Module:Languages
--]]

-- получает код языка, возвращает ссылку и нормализованный код языка (или пустые строки)
local function get_lang_data (code)
	local name, short = implement_get (code, 'cat'), implement_get (code, 'short')
    if short ~= 'неизв.' then
        return '<span class="lang-link">[[:' .. name .. '|' .. short .. ']]</span>', code
    elseif code ~= '' then
        return code, ''
    else
        return '', ''
    end
end

-- принимает zh|我|tt|мин, возвращает список через запятую
function p.list (frame)
    local curr_lang = nil
    local result = nil
    for _, v in pairs (frame.args) do
      local trimmed = mw.text.trim (v)
      if curr_lang == nil then
          if trimmed ~= '' then
              -- если язык пропущен, оставим прошлый
              curr_lang = mw.text.trim (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 class="foreign-lang" 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	-- function p.list (frame)

--[[
	From Module:Languages
--]]
local function getRefHtml (wikidataItemId)
	local code = codeByItemId [wikidataItemId]
	if code then
		local name, short = implement_get (code, 'cat'), implement_get (code, 'short')		
		if short ~= 'неизв.' then
	        return '<span class="ref-info" title="' ..name .. '" style="font-size:85%; cursor:help; color:#888;">(' .. short .. ')</span>'
	    else
			mw.log ('Language description for code ' .. code .. ' not found')
			return ''
	    end
	else
		mw.log ('Language code not found for ' .. wikidataItemId)
		return ''
	end	
end	-- local function getRefHtml (wikidataItemId)

function p.getRefHtmlFrame (frame)
	return getRefHtml (mw.text.trim (frame.args [1]))
end

return p