local p = {}
local i18n = require('Module:Wikidata lexicographical data/i18n')
local references = require('Module:Wikidata reference format')
local getArgs = require('Module:Arguments').getArgs
base_lang_code_labels = 'en' -- আইটেম লেবেল/বিবরণ/উপনাম, শব্দার্থের বিবরণ
base_lang_code_forms = 'en' -- লেক্সিম লেমা, শব্দরূপের বানান
base_lang_wiki = 'enwiki' -- উইকিপিডিয়া সংযোগ
formatter_urls = { -- https://w.wiki/ELuT
-- বহুভাষিক
= 'https://ids.clld.org/units/$1',
= 'https://diacl.uni-frankfurt.de/Lexeme/Details/$1',
= 'https://www.termania.net/slovarji/presisov-vecjezicni-slovar/$1/_',
-- Q11051
= 'http://udb.gov.pk/result_details.php?word=$1',
= 'https://www.cfilt.iitb.ac.in/hindishabdamitra/class/CBSE/1/1/$1/?page=1',
-- Q56356571
= 'https://dehkhoda.ut.ac.ir/fa/dictionary/detail/$1',
= 'https://vazhaju.tj/word/_/$1',
= 'https://qamosona.com/G3/index.php/term/57,$1.xhtml',
= 'https://farhang.ru/lexeme/$1.html',
-- Q13955
= 'https://ontology.birzeit.edu/lemma/$1',
= 'https://ontology.birzeit.edu/wordform/$1',
= 'https://corpus.quran.com/qurandictionary.jsp?q=$1',
= ' https://ontology.birzeit.edu/lexicalconcept/$1',
= 'http://arabiclexicon.hawramani.com/?p=$1',
-- Q9072
= 'https://sonaveeb.ee/worddetails/unif/$1',
= 'https://www.letonika.lv/groups/default.aspx?cid=$1&r=10611062',
-- Q150
= 'https://www.larousse.fr/dictionnaires/francais/_/$1',
= 'https://www.dictionnaire-academie.fr/article/A1$1',
= 'https://www.dictionnaire-academie.fr/article/A2$1',
= 'https://www.dictionnaire-academie.fr/article/A3$1',
= 'https://www.dictionnaire-academie.fr/article/A4$1',
= 'https://www.dictionnaire-academie.fr/article/A5$1',
= 'https://www.dictionnaire-academie.fr/article/A6$1',
= 'https://www.dictionnaire-academie.fr/article/A7$1',
= 'https://www.dictionnaire-academie.fr/article/A8$1',
= 'https://www.dictionnaire-academie.fr/article/A9$1',
-- Q58635
= 'https://wikidata-externalid-url.toolforge.org/?url=https%3A%2F%2Fpunjabipedia.org%2Ftopic.aspx%3Ftxt%3D%251&exp=%28.%2A%29&id=$1',
= 'https://wikidata-externalid-url.toolforge.org/?url=https%3A%2F%2Fwww.srigranth.org%2Fservlet%2Fgurbani.dictionary%3FParam%3D%251&exp=%28.%2A%29&id=$1',
-- Q1860
= 'http://www.oed.com/view/Entry/$1',
= 'https://doi.org/10.1093/OED/$1',
= 'https://www.oxfordreference.com/display/10.1093/acref/9780199571123.001.0001/m_en_gb$1',
= 'https://www.oxfordreference.com/display/10.1093/acref/9780195392883.001.0001/m_en_us$1',
= 'https://www.oxfordreference.com/display/10.1093/acref/9780195418163.001.0001/m_en_ca$1',
= 'https://www.oxfordreference.com/display/10.1093/acref/9780195517965.001.0001/m-en_au-msdict-00001-$1',
= 'https://www.oxfordreference.com/display/10.1093/acref/9780195584516.001.0001/m-en_nz-msdict-00001-$1',
= 'https://greensdictofslang.com/entry/$1',
= 'https://www.daredictionary.com/view/dare/$1',
= 'https://wikidata-externalid-url.toolforge.org/?url=https%3A%2F%2Fwww.merriam-webster.com%2Fdictionary%2F%251&exp=%28.%2A%29&id=$1',
= 'https://wikidata-externalid-url.toolforge.org/?url=https%3A%2F%2Fwww.britannica.com%2Fdictionary%2F%251&exp=%28.%2A%29&id=$1',
= 'https://ahdictionary.com/word/search.html?id=$1',
-- Q188
= 'https://www.owid.de/artikel/$1',
= 'https://www.owid.de/artikel/$1',
= 'https://www.owid.de/artikel/$1',
= 'https://www.owid.de/artikel/$1',
= 'https://www.owid.de/artikel/$1',
= 'https://www.owid.de/artikel/$1',
= 'https://www.duden.de/rechtschreibung/$1',
= 'https://www.woerterbuchnetz.de/Adelung?lemid=$1',
= 'https://www.woerterbuchnetz.de/DWB?lemid=$1',
= 'https://www.woerterbuchnetz.de/DWB2?lemid=$1',
= 'https://www.woerterbuchnetz.de/GWB?lemid=$1',
= 'https://www.woerterbuchnetz.de/Meyers?lemid=$1',
= 'https://www.woerterbuchnetz.de/RDWB1?lemid=$1',
= 'https://www.woerterbuchnetz.de/Wander?lemid=$1',
= 'https://www.dwds.de/wb/$1',
}
-- 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 == 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 == language_code then
return representation
end
end
return form:getRepresentations()
end
local function getArticleLinkTemplate(frame, stmt_value)
template = ''
stmt_item = mw.wikibase.getEntity(stmt_value)
if stmt_item:getSitelink(base_lang_wiki) ~= nil then
template = frame:expandTemplate{
title=i18n,
args={stmt_item:getSitelink(base_lang_wiki)}
}
end
return template
end
local function getArticleLinks ( frame, sense )
article_links = ''
for i, stmt in pairs(sense:getAllStatements('P5137')) do -- এই অর্থের জন্য আইটেম
stmt_value = stmt.mainsnak.datavalue.value.id
article_links = article_links .. getArticleLinkTemplate(frame, stmt_value)
end
for i, stmt in pairs(sense:getAllStatements('P9970')) do -- এই অর্থের জন্য বিধেয়
stmt_value = stmt.mainsnak.datavalue.value.id
article_links = article_links .. getArticleLinkTemplate(frame, stmt_value)
end
return article_links
end
local function getExternalLinks ( lexeme )
local external_links = {}
for property_id, formatter_url in pairs(formatter_urls) do
for i, stmt in ipairs(lexeme:getAllStatements(property_id)) do
property_source = mw.wikibase.getBestStatements(property_id, 'P9073') -- প্রযোজ্য 'এই উৎসে বিবৃত' মান
if next(property_source) ~= nil then
source_name = mw.wikibase.getLabel(property_source.mainsnak.datavalue.value.id)
if source_name == nil then
source_name = property_source.mainsnak.datavalue.value.id
end
else
source_name = mw.wikibase.getLabel(property_id)
if source_name == nil then
source_name = property_id
end
end
formatted_link = mw.ustring.gsub(formatter_url, '$1', stmt.mainsnak.datavalue.value)
new_link = '* '
table.insert(external_links, new_link)
end
end
return table.concat(external_links, '\n')
end
local function termSpan( term )
local text = term
local lang = term
local dir = mw.language.new( lang ):getDir()
local span = mw.html.create( 'span' )
span:attr( 'lang', lang )
:attr( 'dir', dir )
:wikitext( text )
return tostring( span )
end
local function termLink( term )
local text = term
local lang = term
local dir = mw.language.new( lang ):getDir()
local span = mw.html.create( 'span' )
span:attr( 'lang', lang )
:attr( 'dir', dir )
:wikitext( ']' )
return tostring( span )
end
function getLemmata( current_lexeme )
lemma_string = ''
for i, rep in pairs(current_lexeme:getLemmas()) do
if lemma_string == '' then
lemma_string = termSpan(rep)
else
lemma_string = lemma_string .. '/' .. termSpan(rep)
end
end
return lemma_string
end
function getLinkedLemmata( current_lexeme )
lemma_string = ''
for i, rep in pairs(current_lexeme:getLemmas()) do
if lemma_string == '' then
lemma_string = termLink(rep)
else
lemma_string = lemma_string .. '/' .. termLink(rep)
end
end
return lemma_string
end
function getExamples( current_lexeme, sense_id )
examples = mw.html.create('dl')
for i, stmt in pairs(current_lexeme:getAllStatements('P5831')) do -- ব্যবহারের উদাহরণ
if stmt.qualifiers.datavalue.value.id == sense_id then -- বিষয়ে লেক্সিমের অর্থ
example_text = stmt.mainsnak.datavalue.value.text
example_lang = stmt.mainsnak.datavalue.value.language
example_form = mw.wikibase.getEntity(stmt.qualifiers.datavalue.value.id) -- বিষয়ে লেক্সিমের রূপ
example_form_str = example_form:getRepresentation(base_lang_code_forms)
if example_form_str == nil then
example_form_str = example_form:getRepresentations()
end
example_text = mw.ustring.gsub(example_text, example_form_str, "'''" .. example_form_str .. "'''")
example_str = termSpan({example_text, example_lang})
local reference_text = ''
for j, reference in pairs(stmt.references) do
reference_text = reference_text .. '\n\n' .. references.format(reference)
end
examples:tag('dd'):wikitext("''" .. example_str .. "''"):done():tag('dd'):css('text-indent', '2em'):wikitext(reference_text)
end
end
for i, stmt in pairs(mw.wikibase.getAllStatements(sense_id, 'P5831')) do -- ব্যবহারের উদাহরণ
example_text = stmt.mainsnak.datavalue.value.text
example_lang = stmt.mainsnak.datavalue.value.language
example_form = mw.wikibase.getEntity(stmt.qualifiers.datavalue.value.id) -- বিষয়ে লেক্সিমের রূপ
example_form_str = example_form:getRepresentation(base_lang_code_forms)
if example_form_str == nil then
example_form_str = example_form:getRepresentations()
end
example_text = mw.ustring.gsub(example_text, example_form_str, "'''" .. example_form_str .. "'''")
example_str = termSpan({example_text, example_lang})
local reference_text = ''
for j, reference in pairs(stmt.references) do
reference_text = reference_text .. '\n\n' .. references.format(reference)
end
examples:tag('dd'):wikitext("''" .. example_str .. "''"):done():tag('dd'):css('text-indent', '2em'):wikitext(reference_text)
end
return tostring(examples)
end
function getLanguageForCategories ( frame, lang_id )
local current_page_title = mw.title.getCurrentTitle().text
-- বিশেষ ভাষার জন্য
if lang_id == 'Q11051' and mw.ustring.find( current_page_title, '' ) ~= nil then -- U+0600 - U+06FF
lang_id = 'Q11051ur'
elseif lang_id == 'Q11051' and mw.ustring.find( current_page_title, '' ) ~= nil then -- U+0900 - U+097F
lang_id = 'Q11051hi'
end
return lang_id
end
function getCategory ( frame, current_lexeme )
local lang_id = current_lexeme:getLanguage()
local cat_id = current_lexeme:getLexicalCategory()
local cat_text = mw.wikibase.getLabelByLang( cat_id, base_lang_code_labels )
lang_id = getLanguageForCategories(frame , lang_id)
if i18n ~= nil then
if i18n ~= nil then
cat_text = cat_text .. ' .. ']]'
end
end
return cat_text
end
local createicon = function(langcode, entityID, propertyID)
langcode = langcode or ""
propertyID = propertyID or ""
local icon = " <span class='penicon autoconfirmed-show'>[["
-- " <span data-bridge-edit-flow='overwrite' class='penicon'>[[" -> enable Wikidata Bridge
.. "File:OOjs UI icon edit-ltr-progressive.svg |frameless |text-top |10px |alt="
.. i18n
.. "|link=https://www.wikidata.org/entity/" .. entityID
if langcode ~= "" then icon = icon .. "?uselang=" .. langcode end
if propertyID ~= "" then icon = icon .. "#" .. propertyID end
icon = icon .. "|" .. i18n .. "]]</span>"
return icon
end
function getMeanings ( frame, args, current_lexeme )
if #current_lexeme:getSenses() == 0 then
return createicon(base_lang_code_labels, current_lexeme:getId()) .. frame:expandTemplate{
title=i18n,
args={'und'}
}
end
meanings = mw.html.create( 'ol' )
for i, sense in pairs(current_lexeme:getSenses()) do
local gloss_text_parts = {}
local main_gloss_text = frame:expandTemplate{
title=i18n,
args={sense:getId()}
}
local specifiers = {}
for k, property_id in ipairs({'P6084', 'P6191', 'P9488'}) do -- অবস্থান যেখানে শব্দার্থ ব্যবহৃত, যে রীতিতে শব্দার্থ ব্যবহৃত হয়, যে ক্ষেত্রে ব্যবহৃত
for i, stmt in pairs(sense:getAllStatements(property_id)) do
stmt_value = stmt.mainsnak.datavalue.value.id
table.insert(specifiers, mw.wikibase.getLabel(stmt_value))
end
end
if #specifiers > 0 then
main_gloss_text = main_gloss_text .. "(''" .. table.concat(specifiers, "'', ''") .. "'') "
end
if sense:getGloss( base_lang_code_labels ) ~= nil then
main_gloss_text = main_gloss_text .. sense:getGloss( base_lang_code_labels)
else
local other_gloss = nil
for i, fallback_lang in ipairs(mw.language.getFallbacksFor( base_lang_code_labels )) do
if sense:getGloss( fallback_lang ) ~= nil then
other_gloss_text, other_gloss_lang = sense:getGloss( fallback_lang )
end
end
if other_gloss_lang == '' then
local glosses = sense:getGlosses()
for j, gloss in pairs(glosses) do
other_gloss_text, other_gloss_lang = gloss
break
end
end
main_gloss_text = main_gloss_text .. other_gloss_text .. "<sup><em>" .. mw.language.fetchLanguageName(other_gloss_lang, base_lang_code_labels) .. "</em></sup>"
end
table.insert(gloss_text_parts, main_gloss_text .. createicon(base_lang_code_labels, sense:getId()))
for i, stmt in pairs(sense:getAllStatements('P8394')) do -- টিপ্পনীর উদ্ধৃতি
gloss_quote = termSpan({stmt.mainsnak.datavalue.value.text, stmt.mainsnak.datavalue.value.language})
if stmt.references ~= nil then
gloss_quote = '"' .. gloss_quote .. '" ' .. references.format ( stmt.references )
end
table.insert(gloss_text_parts, frame:extensionTag('ref', gloss_quote))
end
for i, stmt in pairs(sense:getAllStatements('P1343')) do -- বর্ণিত উৎস
-- TODO: do away with making fake reference objects
fake_reference = { = stmt.id, = stmt.qualifiers }
fake_reference.snaks = { = stmt.mainsnak }
table.insert(gloss_text_parts, frame:extensionTag('ref', references.format ( fake_reference )))
end
first_sense_image = ''
sense_images = sense:getAllStatements('P18')
if next(sense_images) ~= nil then
first_sense_image = sense_images.mainsnak.datavalue.value
end
if first_sense_image ~= '' then
table.insert(gloss_text_parts, ']')
end
externallinks = getArticleLinks(frame, sense)
if externallinks ~= '' then
table.insert(gloss_text_parts, externallinks)
end
local new_notes = {}
sense_keys = { sense:getId(), string.sub(sense:getId(), string.find(sense:getId(), '-')+1) }
for i, v in ipairs(sense_keys) do
if args ~= nil then
table.insert(new_notes, args)
end
end
if #new_notes > 0 then
for i, v in ipairs(new_notes) do
if i == 1 then
table.insert(gloss_text_parts, '<br/>' .. v)
else
table.insert(gloss_text_parts, v)
end
end
end
examples = getExamples ( current_lexeme, sense:getId() )
local gloss_text = table.concat(gloss_text_parts, '\n')
meanings:tag('li'):wikitext(gloss_text):wikitext(examples)
end
return meanings
end
function get_pronunciation_base_form( current_lexeme )
base_form = nil
-- (!) অন্য ভাষার শব্দের যদি অন্য রকম মূল ফর্ম থাকে সেগুলো এখানে নতুন if বিবৃতি দিয়ে যোগ করা যায়।
if current_lexeme:getLanguage() == 'Q9610' then -- বাংলা
if current_lexeme:getLexicalCategory() == 'Q1084' then -- বিশেষ্য
base_form = formWithSingleGrammaticalFeature( current_lexeme, 'Q131105' ) -- কর্তৃকারক
elseif current_lexeme:getLexicalCategory() == 'Q24905' then -- ক্রিয়া
base_form = formWithSingleGrammaticalFeature( current_lexeme, 'Q1350145' ) -- ক্রিয়া বিশেষ্য
end
end
if base_form == nil then
for i, form in pairs(current_lexeme:getForms()) do
base_form = form
break
end
end
return base_form
end
function getCombines ( current_lexeme )
local combines = ''
local index_mappings = {}
for i, stmt in pairs(current_lexeme:getAllStatements('P5238')) do
if stmt.qualifiers ~= nil then -- ক্রম
local current_index = tonumber(stmt.qualifiers.datavalue.value)
index_mappings = stmt
end
end
if #index_mappings ~= 0 then
for i, stmt in ipairs(index_mappings) do
local part_lexeme_id = stmt.mainsnak.datavalue.value.id
local current_substring = getLinkedLemmata(mw.wikibase.getEntity(part_lexeme_id))
if combines == '' then
combines = current_substring
else
combines = combines .. ' + ' .. current_substring
end
end
end
return combines
end
function getEtymology ( current_lexeme )
-- At the moment only goes two levels up.
etymology = ''
for i, stmt in pairs(current_lexeme:getAllStatements('P5191')) do
origin_lexeme = mw.wikibase.getEntity(stmt.mainsnak.datavalue.value.id)
origin_lexeme_lang = origin_lexeme:getLanguage()
origin_origin = ''
for j, stmt2 in pairs(origin_lexeme:getAllStatements('P5191')) do
origin_origin_lexeme = mw.wikibase.getEntity(stmt2.mainsnak.datavalue.value.id)
origin_origin_lexeme_lang = origin_origin_lexeme:getLanguage()
if origin_origin ~= '' then
origin_origin = getLinkedLemmata(origin_origin_lexeme) .. ' (' .. mw.wikibase.getLabel(origin_origin_lexeme_lang) .. ')'
else
origin_origin = origin_origin .. ' ' .. getLinkedLemmata(origin_origin_lexeme) .. ' (' .. mw.wikibase.getLabel(origin_origin_lexeme_lang) .. ')'
end
end
if origin_origin ~= '' then
new_etymology_string = getLinkedLemmata(origin_lexeme) .. ' (' .. mw.wikibase.getLabel(origin_lexeme_lang) .. ') ← ' .. origin_origin
else
new_etymology_string = getLinkedLemmata(origin_lexeme) .. ' (' .. mw.wikibase.getLabel(origin_lexeme_lang) .. ')'
end
if etymology == '' then
etymology = new_etymology_string
else
etymology = etymology .. ' ' .. getLinkedLemmata(origin_lexeme) .. ' (' .. mw.wikibase.getLabel(origin_lexeme_lang) .. ')'
end
end
return etymology
end
function getPronunciation ( frame, current_lexeme )
local pronunciations = {}
base_form = get_pronunciation_base_form(current_lexeme)
if base_form ~= nil then
for i, stmt in pairs(base_form:getAllStatements('P443')) do
pronunciation_file = stmt.mainsnak.datavalue.value
pronunciation = table.insert(pronunciations, '* ' .. frame:expandTemplate{
title= i18n,
args = {base_lang_code_forms, pronunciation_file }
})
end
end
return table.concat(pronunciations, '\n')
end
function heading_level(text, level)
local heading_delimiter = string.rep('=', level)
return heading_delimiter .. ' ' .. text .. ' ' .. heading_delimiter
end
function add_any_notes(sections, args, keys)
for i, v in ipairs(keys) do
if args ~= nil then
table.insert(sections, args)
end
end
end
function p.all( frame )
local args = getArgs(frame, { parentOnly = True })
lexeme_id = args
current_lexeme = mw.wikibase.getEntity(lexeme_id)
current_language = current_lexeme:getLanguage()
current_category = current_lexeme:getLexicalCategory()
sections = {}
cat_text = '===' .. getCategory ( frame, current_lexeme ) .. frame:expandTemplate{
title=i18n,
args={lexeme_id}
} .. '==='
table.insert(sections, cat_text)
table.insert(sections, frame:expandTemplate{
title= i18n,
args = {lexeme_id}
})
add_any_notes(sections, args, i18n)
etymology = getEtymology ( current_lexeme )
combines = getCombines ( current_lexeme )
if etymology ~= '' or combines ~= '' then
table.insert(sections, heading_level(i18n, 4))
if etymology ~= '' then
table.insert(sections, tostring(etymology))
end
if combines ~= '' then
table.insert(sections, tostring(combines))
end
end
add_any_notes(sections, args, i18n)
pronunciation = getPronunciation ( frame, current_lexeme )
if pronunciation ~= '' then
table.insert(sections, heading_level(i18n, 4))
table.insert(sections, tostring(pronunciation))
end
add_any_notes(sections, args, i18n)
meanings, sense_sources = getMeanings ( frame, args, current_lexeme )
table.insert(sections, heading_level(i18n, 4))
table.insert(sections, tostring(meanings))
add_any_notes(sections, args, i18n)
-- (!) অন্য ভাষার বিভক্তির সারণি যদি থাকে সেগুলো এখানে নতুন if বিবৃতি যোগ করা যায়।
if current_language == 'Q9610' then -- বাংলা
local conjTable = require('মডিউল:আভিধানিক উপাত্ত/Q9610').getInflectionTable(frame, current_lexeme)
table.insert(sections, conjTable)
end
table.insert(sections, heading_level(i18n, 4))
table.insert(sections, frame:extensionTag('references'))
add_any_notes(sections, args, i18n)
external_links = getExternalLinks ( current_lexeme )
if external_links ~= '' then
table.insert(sections, heading_level(i18n, 4))
table.insert(sections, external_links)
end
add_any_notes(sections, args, i18n)
return table.concat(sections,"\n\n")
end
return p