Модул:Sources
Овај Луа модул се користи на веома великом броју страница, тако да ће промене на њему бити широко примећене. Молимо да било какве измене тестирате на подстраницама модула /песак или /тестови. Размислите и о покретању расправе о изменама које намеравате да унесете на страници за разговор пре њиховог примењивања. |
Овај модул је предмет заштите страница. То је веома коришћен модул у употреби огромног броја страница или се супституише веома често. Због вандализма или грешака које би утицале на много страница или тривијалног уређивања које би могло да изазове проблеме на серверима, модул је заштићен од уређивања. |
Пре било каквог мењања овог шаблона, молимо да прво истестирате своје промене на подстраници /игралиште и упоредите их на подстраници /тестови. Тестиране промене онда треба да се унесу у једној измени у овај шаблон. |
Начин рада[уреди извор]
Овај модул генерише текст коришћен у фуснотама изведеним са ставки Википодатака.
Функције[уреди извор]
Спољашње[уреди извор]
Спољашње функције прихватају објекте типа фрејма и предвиђени су за позивање из других модула или преко функције рашчлањивања {{#invoke:}}
.
Директно позивање на функције модула у чланцима је крајње непожељно! У ту сврху користите одговарајуће шаблоне.
p.renderSource(frame)[уреди извор]
Враћа текст вики-везе до одређеног извора ради уметања у референцу или библиографију. Погледајте шаблоне {{source}} и {{извор}} који користе ову функцију. Подржава следеће аргументе:
frame.args[1]
— анонимни аргумент који одређује идентификатор објекта на Википодацима помоћу којег би веза требало да се генерише. На пример, Q20750516.frame.args['ref']
— поставља ознаку ref, која се касније може користити у шаблонима попут {{sfn}}.frame.args['ref-year']
— поставља ознаку ref-year, која се користи слично као на ознаци ref.frame.args['part']
— додатни аргумент за разјашњење дела извора на који се позива (на пример, поглавље у књизи).frame.args['parturl']
— веза за део који је описан претходним аргументом.frame.args['pages']
— одређене странице у извору на који се референца успоставља.frame.args['url']
— омогућава изричито одређење која веза ће требати да се постави на извор.frame.args['volume']
— омогућава изричито назначавање тома извора на који се референца односи.frame.args['issue']
— омогућава изричито назначавање издања извора на који се референца односи.
Већина аргумената происходи из utils.copyArgsToSnaks. Сам преносни оквир се налази у p.currentFrame за даљу употребу и на основу аргумената прослеђених функцији artificialSnaks формира вештачки делови, која повезује на извор поменут у frame.args[1]
, кроз својства наведено у (P248) и тема (P805). Подаци се затим преносе у renderReferenceImpl за даљу обраду.
p.renderReference(frame, currentEntity, reference)[уреди извор]
Враћа форматиран вики текст референце датом извору. Подржава исте аргументе као и p.renderSource, а поред тога ref и ref-year. Погледајте шаблоне {{source-ref}} и {{ВП-фуснота}}, користећи ову функцију. Такође се користи у Модул:Wikidata да бисте приказали везе наведене поред упита са Википодатака. Ако недостају currentEntity и reference, ствара сопствени снек помоћу функције artificialSnaks, након чега се прослеђује у renderReferenceImpl. Ако је вики-текст за референцу успешно генерисан, обвијен је ознаком <ref>
уз помоћ frame:extensionTag, при чему назив референце настаје хеширањем прослеђеног вики-текста у mw.hash.hashValue. Чланци са таквим фуснотама стављају се у Категорија:Википедија:Чланци са изворима из Викидата.
Унутрашње[уреди извор]
tokenizeName(fullName)[уреди извор]
Претвара пуно име у пар {презимена одвојена размацима, имена одвојена размацима} . Реализовано у облицима који се могу пронаћи на Википодацима:
- Презиме, Име
- Презиме, Име Име
- Презиме Презиме, Име
- Име Име огли Презиме
- Име Име де Презиме
- Име … Име Презиме (најмање једно и не више од четири појединачна имена)
Овде име, за разлику од презимена, може бити почетно. Ако није испуњен ниједан од горњих формата, враћа се пуно име непромењено.
personNameToAuthorName(fullName)[уреди извор]
Претвара пуно име у облик Презиме И. СИ. користећи tokenizeName.
personNameToResponsibleName(fullName)[уреди извор]
Претвара пуно име у облик И. СИ. Презиме користећи tokenizeName.
getPeopleAsWikitext(context, value, options)[уреди извор]
Претвара списак имена value у викитекст према списку опција options. Опције морају садржати следећа поља:
- separator — разделитељ на списку;
- conjunction — разделитељ пре последњег елемента списка;
- format — функција која трансформише имена у неком нормализованом облику (на пример, personNameToAuthorName);
- nolinks — логичка вредност, мора бити тачно ако је повезивање непожељно;
- preferids — логичка вредност, мора да буде тачно ако желите да вратите ид са Википодатака, а не имена.
Ако на спису има више аутора од броја maxAuthors (тренутно 10), остали се замењују са и др. или његових аналога (ако је језик одређен у контексту, тада i18nEtAl[context.lang], иначе се користи i18nEtAlDefault).
appendProperty(result, context, src, conjunctor, property, url)[уреди извор]
Надодаје src[property] на result, раздвајајући их линијом уписаном conjunctor. Ако је могуће, формира везу до src[url].
generateAuthorLinks(context, src)[уреди извор]
Враћа списак аутора src.author, оформљен путем getPeopleAsWikitext и уоквирен у <i class="wef_low_priority_links"></i>
.
appendTitle(result, context, src)[уреди извор]
Надодаје на result текстуални низ src.part // src.title
или само src.title
ако src.part није прецизирано. Ако је могуће уоквиривање src.part (или src.title ако src.part није прецизирано) у src.url.
appendLanguage(result, context, src)[уреди извор]
Ако се context.lang разликује од i18nDefaultLanguage (српски у нашем случају), тада се назнака тога приписује result кроз Модул:Languages у формату {{ref-lang}}.
appendSubtitle(result, context, src)[уреди извор]
Надодаје на result текстуални низ : src.subtitle
ако је src.subtitle дефинисано.
appendOriginalTitle(result, context, src)[уреди извор]
Надодаје на result текстуални низ = src.originaltitle
ако је src.originaltitle дефинисано.
appendPublication(result, context, src)[уреди извор]
Надодаје на result текстуални низ // src.publication: src.publication.subtitle
ако је дефинисано src.publication.subtitle, или // src.publication
ако је дефинисано src.publication.
appendEditor(result, context, src)[уреди извор]
Надодаје на result текстуални низ / prefix src.editor
ако је дефинисано src.editor, где је prefix дефинисано према context.lang (уобичајено, под ред.
).
appendEdition(result, context, src)[уреди извор]
Надодаје на result текстуални низ — src.edition
ако је src.edition дефинисано.
appendPublicationData(result, context, src)[уреди извор]
Надодаје на result текстуални низ у облику — src.place: src.publisher, src.year.
ако је дефинисан бар један од наведених параметара. Неодређени део је изостављен, заједно са одговарајућом интерпункцијом. Дебело црево се користи само ако је наведено src.place и бар неки од src.publisher и src.year, зарез се ставља само ако је наведен и src.publisher, и src.year. Цртица и тачка користе се ако је наведен барем један од параметара.
appendVolumeAndIssue(result, context, src)[уреди извор]
Надодаје на result текстуални низ у облику — letter_vol src.volume, letter_iss src.issue.
ако је дефинисан бар један од наведених параметара. Зарез се користи ако су наведена оба параметра. letter_vol и letter_iss одређени на основу context.lang (на пример, Т.
и вып.
за руски текст, Vol.
и Iss.
за енглески).
appendPages(result, context, src)[уреди извор]
Надодаје на result текстуални низ у облику — letter src.pages.
ако је src.pages дефинисано, док је као сепаратор у src.pages, ако је распон страница, користи се симбол «—», а letter одређена на основу context.lang (на пример, P.
за енглески и С.
за руски).
appendNumberOfPages(result, context, src)[уреди извор]
Надодаје на result текстуални низ у облику — src.numberOfPages letter
ако је src.numberOfPages дефинисано. При чему је letter утврђено из context.lang (p.
за енглески и с.
за руски).
appendBookSeries(result, context, src)[уреди извор]
Надодаје на result текстуални низ у облику — (src.bookSeries; letter_vol src.bookSeriesVolume, letter_iss src.bookSeriesIssue)
ако је src.bookSeries дефинисано. Тачка са зарезом само ако је дефинисано src.bookSeriesVolume или src.bookSeriesIssue, зарез се користи ако су наведена оба параметра. letter_vol и letter_iss утврђено из context.lang, слично ономе како ради appendVolumeAndIssue.
appendBookSeries(result, context, src)[уреди извор]
Надодаје на result информацију из src.tirage ако је дефинисано. Формат се одређује из context.lang, за енглески језик је то — ed. size: src.tirage
, а за руски — src.tirage экз.
.
appendIdentifiers(result, context, src)[уреди извор]
Надодаје на result идентификаторе ISBN, ISSN, DOI, PMID и arXiv ако су наведени. Идентификаторима се додељује цртица, тачнији формат је дефинисан у табелама options_commas, options_issn, options_doi, options_pmid и options_arxiv.
appendSourceId(result, context, src)[уреди извор]
Надодаје на result у <span class="wikidata_cite citetype" data-entity-id="src.sourceId"></span>
, где citetyle је src.type ако је ово поље дефинисано и citetype_unknown у супоротном случају.
appendAccessDate(result, context, src)[уреди извор]
Надодаје на result текстуални низ у виду <small>Проверено dd month yyyy.</small>
, где dd, month и yyyy потичу од src.accessdate ако је ово поље дефинисано.
populateUrl(context, src)[уреди извор]
Ако је src.url недефинисан, али је src.sourceId познат, покушава доделити src.url везу.
populateYear(src)[уреди извор]
Ако је src.year недефинисан, покушава да испуни са src.dateOfPublication и src.dateOfCreation.
populateTitle(src)[уреди извор]
Ако је src.title недефинисан, покушава да придружи src.url, ако и ово није могуће, додељује ''(недефинисан наслов)''
.
renderSource(context, src)[уреди извор]
Унутрашња функција која генерише текст који ће се приказати у референци. Понаша се на следећи начин:
- Записује src.lang у context.lang (или i18nDefaultLanguage ако src.lang није записан).
- Позива populateUrl, populateTitle и populateYear.
- Формира променљиву result, с почетка дефинисану са generateAuthorLinks(context, src).
- Доследно примењује на result функцију appendTitle—appendAccessDate, док је блок appendEditor—appendAccessDate додатно уоквирен са
<span class="wef_low_priority_links"></span>
artificialSnaks(args)[уреди извор]
Прави вештачки снек, која повезује извор са идентификатором frame.args[1] путем својства наведено у (P248) и тема (P805), а такође прослеђује и аргументе (том, издање итд.).
Услужни подмодули[уреди извор]
- Модул:Sources/utils
- Модул:Sources-authors (не користи се)
- Модул:Sources-title (не користи се)
- Модул:Sources-year (не користи се)
Коришћена својства Википодатака[уреди извор]
Својство | Напомене |
---|---|
аутор (P50) | |
скраћено име аутора (P2093) | |
језик дела или имена (P407) | |
изворни језик дела (P364) | |
одељак (P958) | користи се за означавање наслова чланка у енциклопедији |
наслов (P1476) | ако је потребно преправити назив ознаке ставке |
поднаслов (P1680) | |
пуно дело доступно на (P953) | |
URL архиве (P1065) | |
URL референце (P854) | |
објављено у (P1433) | |
број издања (P393) | |
издавач (P123) | |
место издавања (P291) | |
уредник (P98) | |
страница/е (P304) | |
број страна (P1104) | |
том (P478) | |
публикација (P433) | |
настанак (P571) | |
датум издавања (P577) | |
ISBN-13 (P212) | |
ISBN-10 (P957) | |
ISSN (P236) | |
редни број (P1545) | |
(P818) | |
(P888) |
Тестови [ уређивање ][уреди извор]
Неуспелих тестова: 4
test_Sources:
local p = {}
local langs = require('Module:Languages')
local utils = require('Module:Sources/utils')
local i18nDefaultLanguage = 'sr'
local i18nEtAlDefault = ' et al.'
local i18nEtAl = {
bs = ' i dr.',
hr = ' i dr.',
de = ' et al.',
en = ' et al.',
ru = ' и др.',
sr = ' и др.',
}
local i18nEditors = {
bs = 'ured.',
hr = 'ured.',
de = 'Hrsg.: ',
en = 'ed.',
ru = 'под ред. ',
sr = 'уред.',
}
local i18nTranslators = {
bs = 'prev.',
hr = 'prev.',
de = 'Ü.: ',
en = 'tr. ',
ru = 'пер. ',
sr = 'прев. ',
}
local i18nVolume = {
bs = 'tom.',
hr = 'tom.',
de = 'Jg.: ',
en = 'vol. ',
ru = 'Т. ',
sr = 'том. ',
}
local i18nIssue = {
bs = 'ed.',
hr = 'ed.',
de = 'H.: ',
en = 'Iss. ',
ru = 'вып. ',
sr = 'изд. ',
}
local i18nPages = {
bs = 'str.',
hr = 'str.',
de = 'S.: ',
en = 'P. ',
ru = 'С. ',
sr = 'стр. ',
}
local i18nNumberOfPages = {
bs = 'br. str.',
hr = 'br. str.',
de = 'u.S.: ',
en = 'p. ',
ru = 'с. ',
sr = 'бр. стр. ',
}
local i18nTirage = {
bs = 'tiraž: %d',
hr = 'tiraž: %d',
de = 'K.: %d',
en = 'ed. size: %d',
ru = '%d экз.',
sr = 'тираж: %d',
}
local monthg = {'јануара', 'фебруара', 'марта', 'априла', 'маја', 'јуна', 'јула', 'августа', "септембра", "октобра", "новембра", "децембра"}
local PREFIX_CITEREF = "CITEREF_";
-- Враћа форматирани пар {презиме(на), име(на)}
local function tokenizeName( fullName )
local start = '^%s*' -- подудара почетак текстуалног низа + произвољан број размака
local finish = '%s*$' -- подудара крај текстуалног низа + произвољан број размака
local comma = '\,%s+' -- подудара тачку + један или више размака
local space = '%s+' -- подудара један или више размака
local name = '(%a[%a\-\']*)\.?' -- подудара појединачно име, које почиње словом, може садржати апострофе и наводнике, и може се завршавати тачком
local surname = '(%a[%a\-\']*)' -- Исто као за име, али се не може завршавати тачком
local f, i = mw.ustring.match(fullName, start .. surname .. comma .. name .. finish)
if f then
mw.log('tokenizeName: «' .. fullName .. '»: садржи «Fa, Im» подударање')
return {f, mw.ustring.sub( i, 1, 1 ) .. '.'}
end
local f, i, o = mw.ustring.match(fullName, start .. surname .. comma .. name .. space .. name .. finish)
if f then
mw.log( 'tokenizeName: «' .. fullName .. '»: садржи «Fa, Im Ot» подударање')
return {f, mw.ustring.sub( i, 1, 1 ) .. '. '
.. mw.ustring.sub( o, 1, 1 ) .. '.'}
end
local f1, f2, i = mw.ustring.match(fullName, start .. surname .. space .. surname .. comma .. name .. finish)
if f1 then
mw.log('tokenizeName: «' .. fullName .. '»: садржи «Fa Fa, Im» подударање')
return {f1 .. ' ' .. f2, mw.ustring.sub( i, 1, 1 ) .. '.'}
end
local i, o, f = mw.ustring.match(fullName, start .. name .. space .. name .. space .. 'оглы' .. space .. surname .. finish)
if f then
mw.log('tokenizeName: «' .. fullName .. '»: садржи «Im Ot оглы Fa» подударање')
return {f, mw.ustring.sub(i, 1, 1) .. '. ' .. mw.ustring.sub(o, 1, 1) .. '.'}
end
local i1, i2, f = mw.ustring.match(fullName, start .. name .. space .. name .. space .. 'de' .. space .. surname .. finish)
if f then
mw.log('tokenizeName: «' .. fullName .. '»: садржи «Im Im de Fa» подударање')
return {f, mw.ustring.sub( i1, 1, 1 ) .. '. ' .. mw.ustring.sub( i2, 1, 1 ) .. '.'}
end
-- Try matching k names + surname
for k = 1, 4 do
pattern = start .. string.rep(name .. space, k) .. surname .. finish
matched = {mw.ustring.match(fullName, pattern)}
if #matched ~= 0 then
mw.log('tokenizeName: «' .. fullName .. '»: садржи «Im (x' .. k .. ') Fa» подударање')
for i = 1, k do
matched[i] = mw.ustring.sub(matched[i], 1, 1)
end
return {matched[k + 1], table.concat(matched, '. ', 1, k) .. '.'}
end
end
mw.log('Не подудара се ни са једним шаблоном: «' .. fullName .. '»')
return {fullName}
end
local function personNameToAuthorName( fullName )
if not fullName then return fullName end
local tokenized = tokenizeName(fullName)
if #tokenized == 1 then
return tokenized[1]
else
return tokenized[1] .. ' ' .. tokenized[2]
end
end
local function personNameToResponsibleName( fullName )
if not fullName then return fullName end
local tokenized = tokenizeName(fullName)
if #tokenized == 1 then
return tokenized[1]
else
return tokenized[2] .. ' ' .. tokenized[1]
end
end
local options_commas = { separator = ', ', conjunction = ', ', format = function( src ) return src end, nolinks = false, preferids = false };
local options_commas_short = { separator = ', ', conjunction = ', ', format = function( src ) return src end, nolinks = false, preferids = false, short = true };
local options_commas_nolinks = { separator = ', ', conjunction = ', ', format = function( src ) return src end, nolinks = true, preferids = false };
local options_commas_it = { separator = ', ', conjunction = ', ', format = function( src ) return "''" .. src .. "''" end, nolinks = false, preferids = false };
local options_commas_it_short = { separator = ', ', conjunction = ', ', format = function( src ) return "''" .. src .. "''" end, nolinks = false, preferids = false, short = true };
local options_commas_it_nolinks = { separator = ', ', conjunction = ', ', format = function( src ) return "''" .. src .. "''" end, nolinks = true , preferids = false };
local options_citetypes = { separator = ' ', conjunction = ' ', format = function( src ) return 'citetype_' .. src end, nolinks = true , preferids = true };
local options_commas_authors = { separator = ', ', conjunction = ', ', format = personNameToAuthorName, nolinks = false, preferids = false };
local options_commas_responsible = { separator = ', ', conjunction = ', ', format = personNameToResponsibleName, nolinks = false, preferids = false };
local options_arxiv = { separator = '; ', conjunction = '; ', format = function( id ) return '[http://arxiv.org/abs/' .. id .. ' arXiv:' .. id .. ']' end, nolinks = true, preferids = false };
local options_doi = { separator = '; ', conjunction = '; ', format = function( doi ) return '[http://dx.doi.org/' .. doi .. ' doi:' .. doi .. ']' end, nolinks = true, preferids = false };
local options_issn = { separator = '; ', conjunction = '; ', format = function( issn ) return '[https://www.worldcat.org/issn/' .. issn .. ' ' .. issn .. ']' end, nolinks = true, preferids = false };
local options_pmid = { separator = '; ', conjunction = '; ', format = function( pmid ) return '[https://www.ncbi.nlm.nih.gov/pubmed/?term=' .. pmid .. ' PMID:' .. pmid .. ']' end, nolinks = true, preferids = false };
local function getPersonNameAsLabel( context, entityId, providedLabel, options )
-- would custom label provided we don't need to check entity at all
if ( not utils.isEmpty( providedLabel ) ) then
mw.log( 'Custom label provided for ' .. entityId );
return options.format( providedLabel );
end
local entity = utils.getEntity( context, entityId );
if ( not entity ) then return '\'\'(ентитет ' .. entityId .. ' недостаје)\'\'' end;
local personName = nil;
-- support only labels so far
if ( entity.labels[ context.lang ] ) then
personName = entity.labels[ context.lang ].value;
mw.log('Добављено име особе од ' .. entityId .. ' од назива: «' .. personName .. '»' )
end
if ( not utils.isInstanceOf( entity, 'Q5' ) ) then
mw.log( 'Ентитет ' .. entityId .. ' није особа' );
return personName;
end
if ( utils.isEmpty( personName ) ) then
return '\'\'(није преведено на ' .. context.lang .. ')\'\'';
else
return options.format( personName );
end
end
local function getPersonNameAsWikitext( context, entityId, customLabel, options )
local personName = getPersonNameAsLabel( context, entityId, customLabel, options);
if ( personName == nil ) then
return nil;
end
local link = utils.getElementLink( context, entityId, nil );
return utils.wrapInUrl( link, personName );
end
local function getPeopleAsWikitext( context, value, options )
if type( value ) == 'string' then
return options.format( value )
elseif type( value ) == 'table' then
if value.id then
-- ово је веза
if options.preferids then
return value.id
else
if options.nolinks then
return getPersonNameAsLabel( context, value.id, value.label, options )
else
return getPersonNameAsWikitext( context, value.id, value.label, options )
end
end
end
local maxAuthors = 10 -- потребна су ограничења, пошто поједине публикације садрже прекомеран број аутора (нпр. 115 аутора за Q68951544)
local resultList = {}
for i, tableValue in pairs( value ) do
local nextWikitext = getPeopleAsWikitext( context, tableValue, options )
if not utils.isEmpty( nextWikitext ) then
table.insert( resultList, nextWikitext )
if #resultList == maxAuthors + 1 then
-- задржи још једно за означавање да их је превише
break
end
end
end
local resultWikitext = ''
for i, wikitext in pairs( resultList ) do
if i == maxAuthors + 1 then
resultWikitext = resultWikitext .. ( i18nEtAl[ context.lang ] or i18nEtAlDefault )
break;
end
if i ~= 1 then
resultWikitext = resultWikitext .. ', '
end
resultWikitext = resultWikitext .. wikitext
end
return resultWikitext
end
return options.format( '(непознат тип)' )
end
local function generateAuthorLinks(context, src)
local result = ''
if src.author then
result = getPeopleAsWikitext( context, src.author, options_commas_authors )
result = '<i class="wef_low_priority_links">' .. result .. '</i> '
end
return result
end
local function appendProperty(result, context, src, conjunctor, property, url)
if src[property] then
if url and src[url] then
result = result .. conjunctor .. utils.wrapInUrl( src[url], utils.toString( context, src[property], options_commas_nolinks ) )
else
result = result .. conjunctor .. utils.toString( context, src[property], options_commas )
end
end
return result
end
local function appendTitle(result, context, src)
conjunctor = ''
if src.part then
result = appendProperty(result, context, src, '', 'part', 'parturl')
conjunctor = ' // '
end
result = appendProperty(result, context, src, conjunctor, 'title', 'url')
return result
end
local function appendLanguage(result, context, src)
if context.lang ~= i18nDefaultLanguage then
result = result .. langs.list_ref(p.currentFrame:newChild{ args = {context.lang} })
end
return result
end
local function appendSubtitle(result, context, src)
return appendProperty(result, context, src, ': ', 'subtitle')
end
local function appendOriginalTitle(result, context, src)
return appendProperty(result, context, src, ' = ', 'originaltitle')
end
local function appendPublication(result, context, src)
if src.publication then
if type( src.publication.title or '') ~= 'string' then
error('тип src.publication.title није текстуални низ већ ' .. type( src.publication.title ) )
end
result = result .. ' // ' .. utils.toString( context, src.publication, options_commas_it_short )
if src.publication.subtitle then
result = result .. ': ' .. utils.toString( context, src.publication.subtitle, options_commas_it_short )
end
end
return result
end
local function appendEditor(result, context, src)
if src.editor or src.translator then
result = result .. ' / '
if src.editor then
local prefix = i18nEditors[ context.lang ] or i18nEditors[ i18nDefaultLanguage ]
result = result .. prefix .. getPeopleAsWikitext( context, src.editor, options_commas_responsible )
if src.translator then
result = result .. ', '
end
end
if src.translator then
local prefix = i18nTranslators[ context.lang ] or i18nTranslators[ i18nDefaultLanguage ]
result = result .. prefix .. getPeopleAsWikitext( context, src.translator, options_commas_responsible )
end
end
return result
end
local function appendEdition(result, context, src)
return appendProperty(result, context, src, ' — ', 'edition')
end
local function appendPublicationData(result, context, src)
if src.place or src.publisher or src.year then
result = result .. ' — '
if src.place then
result = result .. utils.toString( context, src.place, options_commas_short )
if src.publisher or src.year then
result = result .. ': '
end
end
if src.publisher then
result = result .. utils.toString( context, src.publisher, options_commas_short )
if src.year then
result = result .. ', '
end
end
if src.year then
result = result .. utils.toString( context, src.year, options_commas )
end
result = result .. '.';
end
return result
end
local function appendVolumeAndIssue(result, context, src)
if src.volume or src.issue then
result = result .. ' — '
local letter_vol = i18nVolume[ context.lang ] or i18nVolume[ i18nDefaultLanguage ]
local letter_iss = i18nIssue[ context.lang ] or i18nIssue[ i18nDefaultLanguage ]
if src.volume then
result = appendProperty(result, context, src, letter_vol .. ' ', 'volume')
result = appendProperty(result, context, src, ', ' .. letter_iss .. ' ', 'issue')
else
result = appendProperty(result, context, src, letter_iss .. ' ', 'issue')
end
result = result .. '.'
end
return result
end
local function appendPages(result, context, src)
if src.pages then
local letter = i18nPages[ context.lang ] or i18nPages[ i18nDefaultLanguage ]
local strPages = utils.toString( context, src.pages, options_commas )
strPages = mw.ustring.gsub( strPages, '[-—]', '—' );
result = result .. ' — ' .. letter .. ' ' .. strPages .. '.'
end
return result
end
local function appendNumberOfPages(result, context, src)
if src.numberOfPages then
local letter = i18nNumberOfPages[ context.lang ] or i18nNumberOfPages[ i18nDefaultLanguage ]
result = appendProperty(result, context, src, ' — ', 'numberOfPages') .. ' ' .. letter
end
return result
end
local function appendBookSeries(result, context, src)
if src.bookSeries then
result = appendProperty(result, context, src, ' — (', 'bookSeries')
if src.bookSeriesVolume or src.bookSeriesIssue then
result = result .. '; '
local letter_vol = i18nVolume[ context.lang ] or i18nVolume[ i18nDefaultLanguage ]
local letter_iss = i18nIssue[ context.lang ] or i18nIssue[ i18nDefaultLanguage ]
if ( src.bookSeriesVolume ) then
result = appendProperty(result, context, src, letter_vol .. ' ', 'bookSeriesVolume')
result = appendProperty(result, context, src, ', ' .. letter_iss .. ' ', 'bookSeriesIssue')
else
result = appendProperty(result, context, src, letter_iss .. ' ', 'bookSeriesIssue')
end
end
result = result .. ')'
end
return result
end
local function appendTirage(result, context, src)
if src.tirage then
local tirageTemplate = i18nTirage[ context.lang ] or i18nTirage[ i18nDefaultLanguage ]
result = result .. ' — ' .. utils.toString( context, src.tirage, { separator = '; ', conjunction = '; ', format = function( data ) return mw.ustring.format(tirageTemplate, data) end } )
end
return result
end
local function appendIdentifiers(result, context, src)
if src.isbn then result = result .. ' — ISBN ' .. utils.toString( context, src.isbn, options_commas ) end
if src.issn then result = result .. ' — ISSN ' .. utils.toString( context, src.issn, options_issn ) end
if src.doi then result = result .. ' — ' .. utils.toString( context, src.doi, options_doi ) end
if src.pmid then result = result .. ' — ' .. utils.toString( context, src.pmid, options_pmid ) end
if src.arxiv then result = result .. ' — ' .. utils.toString( context, src.arxiv, options_arxiv ) end
return result
end
local function appendSourceId(result, context, src)
if src.sourceId then
local citetype = src.type and utils.toString(context, src.type, options_citetypes) or 'citetype_unknown'
result = '<span class="wikidata_cite ' .. citetype .. '" data-entity-id="' .. utils.getSingle(src.sourceId) .. '">' .. result .. '</span>'
end
return result
end
local function appendAccessDate(result, context, src)
if src.accessdate then
local date = utils.getSingle(src.accessdate)
local pattern = "(%-?%d+)%-(%d+)%-(%d+)T";
local y, m, d = mw.ustring.match(date, pattern)
y, m, d = tonumber(y), tonumber(m), tonumber(d)
result = result .. " <small>Проверено " .. tostring(d) .. " " .. monthg[m] .. " " .. tostring(y) .. ".</small>"
end
return result
end
local function populateUrl(context, src)
if src.sourceId and not src.url then
local entity = utils.getEntity(context, src.sourceId)
if entity.sitelinks and entity.sitelinks[context.lang .. 'wikisource'] then
src.url = ':' .. context.lang .. ':s:' .. entity.sitelinks[context.lang .. 'wikisource'].title
end
end
end
local function populateYear(src)
if not src.year and src.dateOfPublication then
local date = utils.getSingle(src.dateOfPublication)
src.year = mw.ustring.sub(date, 2, 5)
end
if not src.year and src.dateOfCreation then
local date = utils.getSingle(src.dateOfCreation)
src.year = mw.ustring.sub(date, 2, 5)
end
end
local function populateTitle(src)
src.title = src.title or utils.getSingle(src.url) or '\'\'(неназначен наслов)\'\''
end
local function renderSource(context, src)
options_commas_authors.format = personNameToAuthorName
options_commas_responsible.format = personNameToResponsibleName
context.lang = utils.getLangCode(utils.getSingle(src.lang)) or i18nDefaultLanguage
utils.preprocessPlaces(src, context.lang)
populateUrl(context, src)
populateTitle(src)
populateYear(src)
local result = generateAuthorLinks(context, src)
result = appendTitle(result, context, src)
result = appendLanguage(result, context, src)
result = appendSubtitle(result, context, src)
result = appendOriginalTitle(result, context, src)
result = appendPublication(result, context, src)
result = result .. '<span class="wef_low_priority_links">'
result = appendEditor(result, context, src) -- Можда користи тренутог уредника уместо жељеног. Користити пажљиво
result = appendEdition(result, context, src)
result = appendPublicationData(result, context, src)
result = appendVolumeAndIssue(result, context, src)
result = appendPages(result, context, src)
result = appendNumberOfPages(result, context, src)
result = appendBookSeries(result, context, src)
result = appendTirage(result, context, src)
result = appendIdentifiers(result, context, src)
result = appendSourceId(result, context, src)
result = appendAccessDate(result, context, src)
result = result .. '</span>'
return result
end
local function renderReferenceImpl(currentEntity, reference, refAnchor, refAnchorYear)
if not reference.snaks then
return nil
end
-- контекст, содержит также кеш элементов
local context = {
cache = {}
}
-- подаци у основном формату у складу са библиографским описним модулима
local data = {}
-- прибављање података из референце
utils.populateDataFromClaims(context, nil, reference.snaks, data)
utils.expandSpecials(context, currentEntity, reference, data)
local sourceEntity = nil
if data.sourceId then
sourceEntity = utils.getEntity(context, data.sourceId)
if sourceEntity then
utils.populateSourceDataImpl(context, sourceEntity, data)
end
end
if data.publication then
utils.expandPublication(context, sourceEntity, data)
end
utils.expandBookSeries(context, data)
if next(data) == nil then
return nil
end
local rendered = renderSource(context, data)
if mw.ustring.len(rendered) == 0 then
return nil
end
if refAnchor then
local anchorValue = 'CITEREF' .. refAnchor .. (utils.coalesce(refAnchorYear, data.year) or '')
rendered = '<span class="citation" id="' .. mw.uri.anchorEncode(anchorValue) .. '">' .. rendered .. '</span>'
end
return rendered
end
local function artificialSnaks(args)
local snaks = {}
if args[1] then
entityId = mw.text.trim(args[1])
snaks.P248 = {utils.toWikibaseEntityIdSnak("P248", entityId)}
snaks.P805 = {utils.toWikibaseEntityIdSnak("P805", entityId)}
end
utils.copyArgsToSnaks(args, snaks)
return mw.wikibase.getEntity(), {snaks = snaks}
end
function p.renderReference(frame, currentEntity, reference)
p.currentFrame = frame
-- позив шаблона
if frame and not currentEntity and not reference then
currentEntity, reference = artificialSnaks(frame.args)
end
local rendered = renderReferenceImpl(currentEntity, reference)
if not rendered then
return ''
end
-- За избор алгоритма распршивања вид. [[Модуль:Hash]]. Подвлака на почетку омогућава
-- да искључите грешку када је назив фусноте чисто бројевна вредност, која понекад садржи хешеве.
return frame:extensionTag('ref', rendered, {name = '_' .. mw.hash.hashValue('fnv164', rendered)}) .. '[[Category:Википедија:Чланци са изворима са Викидата]]'
end
function p.renderSource(frame)
p.currentFrame = frame
currentEntity, reference = artificialSnaks(frame.args)
return renderReferenceImpl(currentEntity, reference, frame.args['ref'], frame.args['ref-year'])
end
return p;