Модуль:Wikidata/P512

З Вікіпедыі, свабоднай энцыклапедыі

Дакументацыю да гэтага модуля можна стварыць у Модуль:Wikidata/P512/Дакументацыя

local p = {}

--[[
  Функцыя фарміруе радок з вікіразметкай для перададзенай уласцівасці
  
  Прымае: аб'ект кантэксту для выкліку фарматараў і табліцу настроек
  Вяртае: вікі-фарматаваны радок
 ]]
function p.formatAcademicDegree( context, options )
	if ( not context ) then error( 'context not specified' ); end;
	if ( not options ) then error( 'options not specified' ); end;
	if ( not options.entity ) then error( 'options.entity missing' ); end;
 
    local claims = context.selectClaims( options, options.property );
    if (claims == nil) then
        return ''
    end
    
    local blackList = p.getPreviousDegrees( claims )
    local formattedClaims = {}
 
    for i, claim in ipairs(claims) do
    	if (claim.mainsnak.datavalue and not blackList[claim.mainsnak.datavalue.value['numeric-id']]) then
	        local formattedStatement = context.formatStatement( options, claim )

	        if (formattedStatement) then
	            formattedStatement = '<span class="wikidata-claim"' .. 
		            ' data-wikidata-property-id="' .. 
		            string.upper( options.property ) .. 
		            '" data-wikidata-claim-id="' .. 
		            claim.id .. '">' ..
		            formattedStatement .. '</span>'

	            if (claim.qualifiers) then
	            	formattedStatement = formattedStatement .. 
	            		p.formatQualifier( context, options, claim.qualifiers.P585 )
	            end
	            formattedStatement = formattedStatement .. 
	            	p.formatCorrespondingCategory( claim )

	            table.insert( formattedClaims, formattedStatement )
	        end
	    end
    end
 
	-- стварэнне тэкставага радка са спісам аформленых заяў з табліцы  
    return mw.text.listToText( formattedClaims, options.separator, options.conjunction );	
end

--[[
  Функцыя змяшчае ў дужкі тэкст першага кваліфікатара з перададзенай табліцы
  
  Прымае: аб'ект кантэксту для выкліку фарматараў, табліцу настройкі 
  і табліцу кваліфікатараў
  Вяртае: адфарматаваны радок з кваліфікатарам
 ]]
function p.formatQualifier( context, options, qualifiers )
	if (qualifiers~=nil and qualifiers[1] ~= nil) then
		return ' (' .. context.formatSnak( options, qualifiers[1] ) .. ')'
	end
	
	return ''
end

--[[
  Функцыя фарміруе спіс адпаведных навуковых ступеняў ніжняй ступені (P155)
  Напрыклад, для "доктар мастацтвазнаўства" гэта будзе "кандыдат мастацтвазнаўства"
  
  Прымае: аб'ект табліцу сутнасцяў - акадэмічных ступеняў персоны (P512)
  Вяртае: аб'ект табліцу ідэнтыфікатараў ступеняў ніжняй ступені
 ]]
function p.getPreviousDegrees( claims )
	-- Пакуль няма звычайнай магчымасці загружаць элементы c кэшам
	-- звонку Module:Wikidata, мы гэтыя адпаведнасці захардкодзім (без Q)
	local correspondingCandidates = {
		[16698078] = 19610224, -- архітэктар
		[17281188] = 19610186, -- біёлаг
		[17281187] = 19610187, -- ветэрынар
		[17281186] = 19610193, -- ваенны
		[16698080] = 19610195, -- географ
		[16698082] = 19610197, -- геа-мін
		[17281180] = 18523814, -- мастацтвазнавец
		[12101789] = 18523811, -- гісторык
		[16698084] = 19610200, -- культуролаг
		[17281165] = 19610203, -- медык
		[17281161] = 19610206, -- педагог
		[12101787] = 4212319,  -- палітолаг
		[17281156] = 19610208, -- псіхолаг
		[17281153] = 19610210, -- сель-гас
		[17281152] = 19610212, -- сацыёлаг
		[17281125] = 18071588, -- тэхнік
		[17281115] = 19610228, -- фармацэўт
		[17281097] = 18002832, -- фіз-мат
		[17281087] = 19603970, -- філолаг
		[17281084] = 19603972, -- філосаф
		[17281079] = 19610312, -- хімік
		[17281072] = 17744738, -- эканаміст
		[18745564] = 19610320  -- юрыст
	}
	
	local previousElements = {}
	for i, claim in ipairs(claims) do
		if(claim.mainsnak.datavalue) then
			local entityId = claim.mainsnak.datavalue.value['numeric-id']
			if (entityId) then
				if correspondingCandidates[entityId] then
					previousElements[correspondingCandidates[entityId]] = true
				end
			end
		end
	end
	return previousElements
end

--[[ 
  Функцыя фарміруе вікі-разметку катэгорыі, якая адпавядае навуковай ступені

  Прымае: аб'ект табліцу сцвярджэння
  Вяртае: радок аформленага тэксту або пусты радок
 ]]
function p.formatCorrespondingCategory (claim)
	if ( not claim ) then return '' end;
	if ( not claim.references ) then return '' end;
	if ( not claim.mainsnak ) then return '' end;
	
	local label = mw.wikibase.label("Q" .. claim.mainsnak.datavalue.value['numeric-id'])
		
	if (label) then
		local result, changes = string.gsub(label, "доктар ", "Катэгорыя:Дактары ")
		if (changes == 1) then
			return '[[' .. result .. ']]'
		end
		
		result, changes = string.gsub(label, "кандыдат ", "Катэгорыя:Кандыдаты ")
		if (changes == 1) then
			return '[[' .. result .. ']]'
		end
	end
	
	return ''
end

return p