Модуль:Wikidata/P512
Перейти до навігації
Перейти до пошуку
Документація модуля[перегляд] [редагувати] [історія] [очистити кеш]
Шаблон виводить значення властивості «академічного ступеня науковця» для поточного елементу. Відмінності від виклику шаблону {{Wikidata}}:
- У вікідані відзначаються факти отримання всіх ступенів, але в картці немає сенсу показувати кандидатську при наявності відповідної докторської. Наприклад може показати тільки д. ф. н. (доктор філософських чи філологічних наук), або показати к. і. н. та д. і. н. (кандидат й доктор історичних наук відповідно)
- Після самого наукового ступеня в дужках вказується рік його надання (з кваліфікатора d:P585). Іноді для вказування цієї ж інформації використовує d:P580, але перший варіант більш поширений (порівн. [1] й [2])
- У статтю додається відповідно ступеня категорія (напр. Категорія:Кандидати медичних наук)
Документація вище включена з Модуль:Wikidata/P512/документація. (ред. | історія) Дописувачі можуть експериментувати на підсторінках пісочниця (створити | дзеркало) та тести (створити) цього модуля. Будь ласка, додавайте категорії до підсторінки /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 )
-- Поки нема нормальної можливсоті заванатжувати елементи з кешем
-- ззовні 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.mainsnak ) then return '' end;
local label = mw.wikibase.label("Q" .. claim.mainsnak.datavalue.value['numeric-id'])
if not label then label = '' end
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
return ''
end
return p