Модуль:Wdl-cmn

Материал из Викисловаря

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

local p = {}

-- Return the first form of the lexeme which has exactly the given grammatical feature.
local function formWithSingleGrammaticalFeature( lexeme, item_id )
	for i, form in pairs( lexeme:getForms() ) do
		local grammaticalFeatures = form:getGrammaticalFeatures()
		if #grammaticalFeatures == 1 and grammaticalFeatures[1] == item_id then
			return form
		end
	end
	return nil
end

-- Return the representation of the form in the given language code,
-- or the first representation otherwise.
local function representationInLanguage( form, language_code )
	for i, representation in pairs( form:getRepresentations() ) do
		if representation[2] == language_code then
			return representation
		end
	end
	return form:getRepresentations()[1]
end


local function termSpan( term )
	local text = term[1]
	local lang = term[2]
	local dir = mw.language.new( lang ):getDir()
	local span = mw.html.create( 'span' )
	span:attr( 'lang', lang )
		:attr( 'dir', dir )
		:attr( 'style', 'font-size:30px')
		:wikitext( text )
	return '[[' .. text .. '|' .. tostring( span ) .. ']]'
end

local function getPinyin ( current_lexeme )
	form = current_lexeme:getForms()[1] -- assuming there is only 1 form, or the first is the main
	pin_forms = form:getAllStatements('P1721')
	for i, stmt in pairs(pin_forms) do
		return '[[d:Lexeme:' .. lexeme_id .. '#F1|<span style="font-size:20px">' .. tostring(stmt.mainsnak.datavalue.value) .. '</span>]]'
	end
	return tostring(pin_forms)
--	return termSpan(representationInLanguage (form, 'zh-x-Q42222')) -- if there is "pinyin" representation
end

local function getHieroLink ( current_lexeme )
	hieros = current_lexeme:getAllStatements('P5425')
	if #hieros == 0 then
		return "[[File:Biáng-red.png|100px]] "
	end
	for i, stmt in pairs(hieros) do
		qid =  stmt.mainsnak.datavalue.value.id
		hiero = mw.wikibase.getEntity(qid)
		stroke_order = hiero:getAllStatements('P6655')
		if #stroke_order > 0 then
			return '([[d:' .. qid .. '|' .. qid .. ']]) [[File:' .. stroke_order[1].mainsnak.datavalue.value .. '|50px]] '
		else
			return '[[d:' .. qid .. '|' .. qid .. ']]'
		end
	end
	return tostring(hieros)
end

function getLemmata( current_lexeme )
	lemma_string = ''
	for i, rep in pairs(current_lexeme:getLemmas()) do
		lemma_string = lemma_string .. termSpan(rep)
	end
	return lemma_string
end

function getCategory ( current_lexeme )
	cat_id = current_lexeme:getLexicalCategory()
	cat_text = mw.wikibase.getLabelByLang( cat_id, 'ru' )
	if cat_id == 'Q1084' then -- noun
		cat_text = cat_text .. '[[Категория:Существительные]]'
	elseif cat_id == 'Q34698' then -- adjective
		cat_text = cat_text .. '[[Категория:Прилагательные]]'
	elseif cat_id == 'Q24905' then -- verb
		cat_text = cat_text .. '[[Категория:Глаголы]]'
	end
	return cat_text
end

function getMeanings ( current_lexeme )
    meanings = mw.html.create( 'ol' )
    langs = {'ru', 'en', 'fr', 'de', 'uk'}
    for i, sense in pairs(current_lexeme:getSenses()) do
        local gloss_text = ""
        glosses = sense:getGlosses()
        for j, gloss in pairs(glosses) do
            if gloss[2] == 'ru' then
                gloss_text = gloss[1]
            end
        end
        if gloss_text == '' then
        	gloss_text = glosses[1][1]
        end
        --examples = getExamples ( current_lexeme, sense:getId() )
       	gloss_text = '[[d:Lexeme:' .. lexeme_id .. '#S' .. tostring(i) .. '|' .. gloss_text .. ']]'
        items = sense:getAllStatements('P5137')
        if #items > 0 then  --берём из элемента значения, если есть
        	label = nil
        	i = 1
        	while label == nil and i<#langs do
        		label = mw.wikibase.getLabelByLang( items[1].mainsnak.datavalue.value.id , langs[i] )
        		i = i + 1
        		end
        	if label == nil then
        		label = tostring(items[1].mainsnak.datavalue.value.id)
        		end
        	gloss_text = gloss_text .. ' ([[d:' .. items[1].mainsnak.datavalue.value.id .. '|' .. label .. ']])'
        end
        meanings:tag('li'):wikitext(gloss_text)--:wikitext(examples)
    end
    return meanings 
end

function p.all( frame )
	lexeme_id = frame.args[1]
    current_lexeme = mw.wikibase.getEntity(lexeme_id)
	cat_text = '===' .. getCategory ( current_lexeme ) .. '==='
	lemmata = getLemmata ( current_lexeme )
    meanings = getMeanings ( current_lexeme )
    cat_id = current_lexeme:getLexicalCategory()
    if cat_id == 'Q24905' then
        conjTable = getConjTable ( frame, current_lexeme )
    elseif cat_id == 'Q1084' then
        conjTable = getConjTable ( frame, current_lexeme )
    else
        conjTable = ''
    end
	return cat_text .. '\n\n' .. tostring(meanings) .. '\n\n' .. conjTable
end

function p.buildCell( frame )
	lexeme_id = frame.args[1]
    current_lexeme = mw.wikibase.getEntity(lexeme_id)
    cell = '|-\n'
	cell = cell .. '| [[:d:Lexeme:' .. lexeme_id .. '|' .. lexeme_id .. ']] '
	cell = cell .. '|| ' .. getLemmata(current_lexeme) .. ' '
	cell = cell .. '|| ' .. getHieroLink(current_lexeme) .. ' '
	cell = cell .. '|| ' .. getPinyin(current_lexeme)
	cell = cell .. ' || ' .. tostring(getMeanings(current_lexeme))
	return cell
end

return p