Модуль:Wikidata/P512

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

Шаблон виводить значення властивості «академічного ступеня науковця» для поточного елементу. Відмінності від виклику шаблону {{Wikidata}}:

  1. У вікідані відзначаються факти отримання всіх ступенів, але в картці немає сенсу показувати кандидатську при наявності відповідної докторської. Наприклад може показати тільки д. ф. н. (доктор філософських чи філологічних наук), або показати к. і. н. та д. і. н. (кандидат й доктор історичних наук відповідно)
  2. Після самого наукового ступеня в дужках вказується рік його надання (з кваліфікатора d:P585). Іноді для вказування цієї ж інформації використовує d:P580, але перший варіант більш поширений (порівн. [1] й [2])
  3. У статтю додається відповідно ступеня категорія (напр. Категорія:Кандидати медичних наук)

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 )
	-- Поки нема нормальної можливсоті заванатжувати елементи з кешем
	-- ззовні 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