Modul:StandardWikidataIntro

De la Wikipedia, enciclopedia liberă

Modulul implementează {{Introducere așezare}}. El poate fi folosit pentru a genera, pe baza datelor prezente în Wikidata, o introducere standard în articolele despre sate, orașe sau regiuni.

Modulul este extensibil și poate fi folosit teoretic pentru orice tip de entitate, dar proprietățile de interes pentru respectivul tip și însemnătatea lor trebuie configurată. Formatul trebuie să apeleze modulul cu parametrul enttype egal cu un șir care constituie un tabel separat de date. De exemplu, tipul folosit de {{introducere așezare}} este settlement, ceea ce face ca modulul să-și caute configurația în Modul:StandardWikidataIntro/settlementData.


local p = {}
local Wikidata = require ('Modul:Wikidata')           --- used for wikidata access and wikidata claim formatting
local StringUtils = require ('Modul:StringUtils')     --- used for capitalization of phrases 
local TableTools = require ('Modul:TableTools')       --- used for array manipulation
local join = require ('Modul:Separated entries').main --- used for conjunction-join
local getArgs = require ('Modul:Arguments').getArgs   --- used for argument manipulation


local function createPhraseForChapter(chapter, q)
	if not chapter['props'] then return nil end
	
	local sentences = {}
	for _,eachProp in ipairs(chapter['props']) do
		local propValueClaims = Wikidata.findBestClaimsForProperty(q, eachProp)
		if propValueClaims then
			local propValues = {}
			local qualifiersValues = {}
			for _,eachPropValueClaim in ipairs(propValueClaims) do
				if eachPropValueClaim.type == 'statement' and eachPropValueClaim.mainsnak and eachPropValueClaim.mainsnak.snaktype == 'value' then
					local commaSeparatedStatementParts = {}

					if eachPropValueClaim.qualifiers and chapter['qualifiers'] and chapter['qualifiers'][eachProp] then for _,eachSupportedQual in ipairs(chapter['qualifiers'][eachProp]) do
						if eachPropValueClaim.qualifiers[eachSupportedQual] then
							mw.logObject(eachSupportedQual, '[StandardWikidataIntro] checking supported qual')

							local qualValues = {}
							for __,eachQualifierValueInstance in ipairs(eachPropValueClaim.qualifiers[eachSupportedQual]) do
								if eachQualifierValueInstance.snaktype == 'value' then
									table.insert(qualValues, Wikidata.printSnak(eachQualifierValueInstance))
								end
							end
							
							if #qualValues > 0 then
								local substedQualifierSentencePart = mw.ustring.gsub(chapter['qualifiers']['intro_props'] and chapter['qualifiers']['intro_props'][eachSupportedQual] or '$1', '$1', table.concat(qualValues, ', '))
								table.insert(commaSeparatedStatementParts, substedQualifierSentencePart)
							end
						end
					end end
					local qualifierSummary = nil
					if #commaSeparatedStatementParts > 0 then
						qualifierSummary = mw.ustring.gsub(chapter['qualifiers']['intro'] or '$1', '$1', table.concat(commaSeparatedStatementParts, ', '))
					end
					table.insert(propValues, Wikidata.printSnak(eachPropValueClaim.mainsnak))
					table.insert(qualifiersValues, qualifierSummary)
				end
			end
			if #propValues > 0 then
				local mainPropStatement
				if chapter['intro_props'] and chapter['unique_value_prop'][eachProp] then
					mainPropStatement = mw.ustring.gsub(chapter['intro_props'] and chapter['intro_props'][eachProp] or '$1', '$1', propValues[1])
					table.insert(sentences, table.concat(TableTools.compressSparseArray({mainPropStatement, qualifiersValues[1]}), ', '))
				else
					local propQualifierPairs = {}
					for idx = 1,#propValues do
						local thisPropQualifierPair = propValues[idx]
						if qualifiersValues[idx] then
							thisPropQualifierPair = thisPropQualifierPair .. ', ' .. qualifiersValues[idx]
						end
						table.insert(propQualifierPairs, thisPropQualifierPair)
					end
					propQualifierPairs.separator = ', '
					propQualifierPairs.conjunction = ' și '
					mainPropStatement = mw.ustring.gsub(chapter['intro_props'] and chapter['intro_props'][eachProp] or '$1', '$1', join(propQualifierPairs))
					table.insert(sentences, mainPropStatement)
				end
			end
		end
	end
	
	if #sentences > 0 then
		if #sentences > 2 then
			sentences.separator = '; '
			sentences.conjunction = '; și '
		else
			sentences.separator = ', '
		end
		return mw.ustring.gsub(chapter['intro'] or '$1', '$1', join(sentences))
	end
	return nil
end

local function display(frame)
	local args = getArgs(frame)
	local q = args['q'] or mw.wikibase.getEntityIdForCurrentPage()
	local entityType = args['enttype'] or 'settlement'
	local propDescriptions = mw.loadData('Modul:StandardWikidataIntro/' .. entityType .. 'Data').propDescriptions
	local outphrases = {}

	for _,eachChapter in pairs(propDescriptions) do
		local crtPhrase = createPhraseForChapter(eachChapter, q)
		if crtPhrase then
			table.insert(outphrases, crtPhrase)
		end
	end

	local capitalizedOutphrases = {}
	for _,eachoutphrase in ipairs(outphrases) do
		table.insert(capitalizedOutphrases, StringUtils._capitalize({eachoutphrase}))
	end
	return StringUtils._appendToString({StringUtils._emptyToNil({table.concat(capitalizedOutphrases, '. ')}), '.'})
end

p.display = display
return p