Modul:Cite
Utseende
Dokumentation [visa] [redigera] [historik] [rensa sidcachen]
-- Creates a timeline for an item based on various properties
local p = {}
local wikidata = require('Modul:Wikidata')
local function formatpage(page, lang)
-- same text for singular and plural, most of the time, they can be distinguished by the presence of a "-" but that does not always work, see Q11927173
if not page then
return nil
end
return fb._langSwitch({ -- singular
de = 'S. ' .. page,
en = 'p. ' .. page,
fr = 'p. ' .. page,
nb = 's. ' .. page,
nn = 's. ' .. page,
}, lang)
end
local function getauthor(item)
return wikidata.formatStatements{entityId=item, property = 'P50'}
end
local function getISBN(item, lang)
local ISBN = wikidata.formatStatements{entityId = item, property = 'P212', enbarten = 'yes'} --ISBN 13
if not ISBN or ISBN == '' then
ISBN = wikidata.formatStatements{entityId = item, property = 'P957', enbarten = 'yes'} -- ISBN 10
end
if ISBN then
return 'ISBN ' ..ISBN
end
end
local function getLink(item, lang)
local links = wikidata.formatStatements{entityId = item, property = 'P854', enbarten = 'yes', label = 'läs online'}
return links
end
local function getVolume(item, lang)
local volume = wikidata.formatStatements{entityId = item, property = 'P478', enbarten = 'yes'}
if volume and volume ~= '' then
return 'vol. ' .. volume
end
end
local function getDoi(item, lang)
local doi = wikidata.formatStatements({entity=item, property = 'P356', numval = 1, lang=lang}) -- what to do if several value
if not doi then
return nil
end
return '<small>' .. 'doi: [http://dx.doi.org/' .. doi .. ' ' .. doi .. ']' .. '</small>' -- needs i18n ?
end
local function getPmid(item, lang)
local pmid = wikidata.formatStatements({entity=item, property = 'P698', numval = 1, lang=lang}) -- what to do if several value
if not pmid then
return nil
end
return '<small> Pub Med ID: [https://www.ncbi.nlm.nih.gov/pubmed/?term=' .. pmid .. ' ' .. pmid .. '] </small>' -- needs i18n ?
end
local function getEditor(item, lang)
local editortable = wikidata.getClaims({entity=item, property='P98'})
if not editortable then
return nil
end
local editor = wikidata.formatStatements({entity=item, property='P98', lang=lang}) -- should have a "formatClaims" function to avoid double work
if #editortable > 1 then return
fb._langSwitch({ --plural
de = editor .. ' (Hrsg.)',
en = editor .. ' (eds.)',
nb = editor .. ' (red.)',
nn = editor .. ' (red.)',
}, lang)
else
return fb._langSwitch({ -- singular
de = editor .. ' (Hrsg.)',
en = editor .. ' (ed.)',
nb = editor .. ' (red.)',
nn = editor .. ' (red.)',
}, lang)
end
end
local function getedition(item, lang)
local ednumber = wikidata.formatStatements({entity=item, property = 'P393', lang=lang, numval = 1})
if not ednumber then
return nil
end
local ord = require('Module:Ordinal')._ordinal
return fb._langSwitch({
de = ednumber .. '. Auflage',
en = ord{ednumber, lang = 'en'} .. ' edition',
fr = ord{ednumber, lang = 'fr'} .. ' édition',
nb = ord{ednumber, lang = 'nb'} .. ' utgave',
nn = ord{ednumber, lang = 'nn'} .. ' utgave',
}, lang)
end
local function getarticletitle(item, lang)
local title = wikidata.formatStatements({entity=item, property = 'P1476', lang=lang}) or wikidata.formatStatements({entity=item, property = 'P357', lang=lang})
if not title then
return '[[' .. item.id .. ']] (no title property provided!)'
end
return fb._langSwitch({
de = '„' .. '[[' .. item.id .. '|' .. title .. ']]' .. '“',
en = '"' .. '[[' .. item.id .. '|' .. title .. ']]' .. '"',
fr = '«' ..'[[' .. item.id .. '|' .. title .. ']]' .. '»',
nb = '«' ..'[[' .. item.id .. '|' .. title .. ']]' .. '»',
nn = '«' ..'[[' .. item.id .. '|' .. title .. ']]' .. '»',
} , lang)
end
local function getbooktitle(item, lang)-- needs i18n some languages do not use this format
local title = wikidata.formatStatements({entity=item, property = 'P1476', lang=lang}) or wikidata.formatStatements({entity=item, property = 'P357', lang=lang})
if not title then
return '[[' .. item.id .. ']] (no title property provided!)'
end
return '<i>' .. '[[' .. item.id .. '|' .. title .. ']]' .. '</i>'
end
local function getissue(item, lang)
return wikidata.formatStatements({entity=item, property = 'P433', lang=lang})
end
local function getpublisher(item, lang)
return wikidata.formatStatements({entity=item, property = 'P123', lang=lang})
end
local function getpublishdate(item, lang)
return wikidata.formatStatements({entity=item, property = 'P577', lang=lang})
end
local function geturl(item, lang)
return wikidata.formatStatements({entity=item, property = 'P854', lang=lang})
end
local function getlicense(item, lang)
return wikidata.formatStatements{entity=item, property = 'P275', lang=lang}
end
local function getjournal(item, lang) -- get the title property rather than the label
local journal = wikidata.getClaims({entity = item, property = 'P1433', exlcudespecial = true})
if not journal then
return nil
end
if #journal > 1 then
return "error, source has too much publishing info"
end
local journalid = 'Q' .. journal[1].mainsnak.datavalue.value["numeric-id"]
local journaltitle = wikidata.formatStatements({item = journalid , property = 'P1433', lang=lang})
if not journaltitle then
journaltitle = wikidata._getLabel(journalid)
end
return '<i>[[' .. journalid .. '|' .. journaltitle .. ']]</i>'
end
local function citebook(item, lang, page)
local publishdate = getpublishdate(item, lang)
local author = getauthor(item, lang)
local editor = getEditor(item, lang)
local title = getbooktitle(item, lang)
local publisher = getpublisher(item, lang)
local edition = getedition(item, lang)
local isbn = getISBN(item, lang)
local doi = getDoi(item, lang)
local pmid = getPmid(item, lang)
local link = getLink(item, lang)
local volume = getVolume(item, lang)
local pagenumber = formatpage(page, lang)
local license = getlicense(item, lang)
local fields = {}
table.insert(fields, author)
table.insert(fields, editor)
table.insert(fields, title)
table.insert(fields, edition)
table.insert(fields, volume)
table.insert(fields, publisher)
table.insert(fields, publishdate)
table.insert(fields, pagenumber)
table.insert(fields, isbn)
table.insert(fields, doi)
table.insert(fields, pmid)
table.insert(fields, link)
table.insert(fields, license)
return linguistic.conj(fields, lang, "comma")
end
local function citearticle(item, lang, page)
local author = getauthor(item, lang)
local title = getarticletitle(item, lang)
local publisher = getpublisher(item, lang)
local publishdate = getpublishdate(item, lang)
local pagenumber = formatpage(page, lang)
local journal = getjournal(item, lang)
local issue = getissue(item, lang)
local publishdate = getpublishdate(item, lang)
local doi = getDoi(item, lang)
local pmid = getPmid(item, lang)
local link = getLink(item, lang)
local volume = getVolume(item, lang)
local pagenumber = formatpage(page, lang)
local license = getlicense(item, lang)
local fields = {}
table.insert(fields, author)
table.insert(fields, title)
table.insert(fields, publisher)
table.insert(fields, journal)
table.insert(fields, volume)
table.insert(fields, issue)
table.insert(fields, publishdate)
table.insert(fields, pagenumber)
table.insert(fields, doi)
table.insert(fields, pmid)
table.insert(fields, link)
table.insert(fields, license)
return linguistic.conj(fields, lang, "comma")
end
function p.citeitem(item, lang, page)
if not item then return nil end
if type(item) == 'string' then
item = mw.wikibase.getEntityObject(item)
end
if not item then
return "invalid item id"
end
if wikidata.getClaims({entity = item, property = 'P1433'}) then -- if item has "edition of" is a book, else an article, needs a better solution
return citearticle(item, lang, page)
else
mw.log('Citing as book')
return citebook(item, lang, page)
end
end
function p.cite(frame)
local lang = frame.args.lang
if not lang or lang == '' then
lang = frame:preprocess('{{int:lang}}')
end
local page = frame.args.page
if page == '' then
page = nil
end
return p.citeitem(frame.args.item, lang, page)
end
function p.reflist(frame)
local list = mw.text.split( frame.args[1], ' ')
local lang = frame.args.lang
if not lang or lang == '' then
lang = frame:preprocess('{{int:lang}}')
end
local str = ''
for i, j in pairs(list) do
str = str .. '<li> ' .. p.citeitem(mw.text.trim(j),lang) .. '</li>'
end
return str
end
return p
Kategorier:
- Mallar och moduler som använder Property:P31
- Mallar och moduler som använder Property:P50
- Mallar och moduler som använder Property:P98
- Mallar och moduler som använder Property:P123
- Mallar och moduler som använder Property:P143
- Mallar och moduler som använder Property:P212
- Mallar och moduler som använder Property:P248
- Mallar och moduler som använder Property:P275
- Mallar och moduler som använder Property:P304
- Mallar och moduler som använder Property:P356
- Mallar och moduler som använder Property:P393
- Mallar och moduler som använder Property:P433
- Mallar och moduler som använder Property:P478
- Mallar och moduler som använder Property:P518
- Mallar och moduler som använder Property:P577
- Mallar och moduler som använder Property:P698
- Mallar och moduler som använder Property:P813
- Mallar och moduler som använder Property:P854
- Mallar och moduler som använder Property:P957
- Mallar och moduler som använder Property:P958
- Mallar och moduler som använder Property:P973
- Mallar och moduler som använder Property:P1433
- Mallar och moduler som använder Property:P1476
- Mallar och moduler som använder Property:P1629
- Mallar och moduler som använder Property:P1680
- Mallar och moduler som använder Property:P1683
- Mallar och moduler som använder Property:P1810
- Mallar och moduler som använder Property:P3452