Modul:Authority control
Penampilan
![]() | Modul Lua laman ini digunakan pada anggaran 9,700 laman dan perubahan besar-besaran mungkin akan ternampak. Sila uji perubahan di subhalaman modul berkaitan laman kotak pasir atau laman kes ujian, atau pada modul kotak pasir anda. Pertimbang untuk membincang perubahan pada laman perbincangan sebelum melaksanakannya. |
![]() | Modul ini tertakluk kepada perlindungan laman. Ia merupakan sebuah modul yang sangat terlihat dengan penggunaan pada bilangan laman yang sangat tinggi, atau kerap ditukar ganti. Disebabkan sebarang laku musnah atau kesilapan pada laman ini akan memberi kesan besar pada banyak laman, serta suntingan yang sedikit pun boleh menyebabkan bebanan besar pada pelayan, ia telah dilindungi daripada sebarang suntingan. |
Halaman yang berkaitan |
---|
![]() |
Modul ini menggunakan satu atau lebih banyak ciri Wikidata; lihat § Parameter untuk butirannya.: |
![]() | Modul ini bergantung pada modul-modul lain: |
Modul ini mengandungi kod templat {{Kawalan kewibawaan}}}. Lihat pendokumenannya.
Parameter, sifat-sifat Wikidata, dan kategori penjejakan
Ralat skrip: Fungsi "docConfTable" tidak wujud.
Kategori penjejak tambahan
Modul ini juga melaksanakan kategori penjejakan tersembunyi yang berikut:
- Kategori:Halaman dengan kategori kawalan kewibawaan berpautan merah (0) – kategori ralat untuk mengenal pasti kategori yang hilang
- Kategori:Rencana dengan pengenalan kawalan kewibawaan yang usang (10) – membetulkan/menghijrahkan/mengalih keluar ID yang tidak digunakan
- Kategori:Rencana dengan pengenalan kawalan kewibawaan yang ditindas (0) – Penjejakan sahaja (tiada ralat)
- Kategori:Halaman menggunakan kawalan kewibawaan dengan parameter (150) – menghijrahkan ID ke Wikidata jika boleh (tiada ralat)
- Kategori:VIAF tiada di Wikidata (0)
- Kategori:VIAF berbeza di Wikidata (0)
- Kategori:Rencana dengan pengenalan WorldCat (0)
- Kategori:Rencana dengan pengenalan WorldCat-LCCN (0)
- Kategori:Rencana dengan pengenalan WorldCat-VIAF (0)
Bilangan pengenalan
- Kategori:KK dengan 25 elemen (0)
- Kategori:KK dengan 26 elemen (0)
- Kategori:KK dengan 27 elemen (0)
- Kategori:KK dengan 28 elemen (0)
- Kategori:KK dengan 29 elemen (0)
- Kategori:KK dengan 30 elemen (0)
- Kategori:KK dengan 31 elemen (0)
- Kategori:KK dengan 32 elemen (0)
- Kategori:KK dengan 33 elemen (0)
- Kategori:KK dengan 34 elemen (0)
- Kategori:KK dengan 35 elemen (0)
- Kategori:KK dengan 36 elemen (0)
- Kategori:KK dengan 37 elemen (0)
- Kategori:KK dengan 38 elemen (0)
- Kategori:KK dengan 39 elemen (0)
- Kategori:KK dengan 40 elemen (0)
- Kategori:KK dengan 41 elemen (0)
function getCatForId( id )
local title = mw.title.getCurrentTitle()
local namespace = title.namespace
if namespace == 0 then
return '[[Category:Rencana wikipedia dengan pengenalan ' .. id .. ']]'
elseif namespace == 2 and not title.isSubpage then
return '[[Category:Laman pengguna dengan pengenalan ' .. id .. ']]'
else
return '[[Category:Laman pelbagai dengan pengenalan ' .. id .. ']]'
end
end
function viafLink( id )
if not string.match( id, '^%d+$' ) then
return false
end
return '[http://viaf.org/viaf/' .. id .. ' ' .. id .. ']' .. getCatForId( 'VIAF' )
end
function lccnLink( id )
local parts = splitLccn( id )
if not parts then
return false
end
id = parts[1] .. parts[2] .. append( parts[3], '0', 6 )
return '[http://id.loc.gov/authorities/names/' .. id .. ' ' .. id .. ']' .. getCatForId( 'LCCN' )
end
function mbLink( id )
-- TODO Implement some sanity checking regex
return '[//musicbrainz.org/artist/' .. id .. ' ' .. id .. ']' .. getCatForId( 'MusicBrainz' )
end
function splitLccn( id )
if id:match( '^%l%l?%l?%d%d%d%d%d%d%d%d%d?%d?$' ) then
id = id:gsub( '^(%l+)(%d+)(%d%d%d%d%d%d)$', '%1/%2/%3' )
end
if id:match( '^%l%l?%l?/%d%d%d?%d?/%d+$' ) then
return mw.text.split( id, '/' )
end
return false
end
function append(str, c, length)
while str:len() < length do
str = c .. str
end
return str
end
function isniLink( id )
id = validateIsni( id )
if not id then
return false
end
return '[http://isni-url.oclc.nl/isni/' .. id .. ' ' .. id:sub( 1, 4 ) .. ' ' .. id:sub( 5, 8 ) .. ' ' .. id:sub( 9, 12 ) .. ' ' .. id:sub( 13, 16 ) .. ']' .. getCatForId( 'ISNI' )
end
--Validate ISNI (and ORCID) and retuns it as a 16 characters string or returns false if it's invalid
--See http://support.orcid.org/knowledgebase/articles/116780-structure-of-the-orcid-identifier
function validateIsni( id )
id = id:gsub( '[ %-]', '' ):upper()
if not id:match( '^%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d[%dX]$' ) then
return false
end
if getIsniCheckDigit( id ) ~= string.char( id:byte( 16 ) ) then
return false
end
return id
end
--Returns the ISNI check digit isni must be a string where the 15 first elements are digits
function getIsniCheckDigit( isni )
local total = 0
for i = 1, 15 do
local digit = isni:byte( i ) - 48 --Get integer value
total = (total + digit) * 2
end
local remainder = total % 11
local result = (12 - remainder) % 11
if result == 10 then
return "X"
end
return tostring( result )
end
function orcidLink( id )
id = validateIsni( id )
if not id then
return false
end
id = id:sub( 1, 4 ) .. '-' .. id:sub( 5, 8 ) .. '-' .. id:sub( 9, 12 ) .. '-' .. id:sub( 13, 16 )
return '[http://orcid.org/' .. id .. ' ' .. id .. ']' .. getCatForId( 'ORCID' )
end
function gndLink( id )
return '[http://d-nb.info/gnd/' .. id .. ' ' .. id .. ']' .. getCatForId( 'GND' )
end
function selibrLink( id )
if not string.match( id, '^%d+$' ) then
return false
end
return '[http://libris.kb.se/auth/' .. id .. ' ' .. id .. ']' .. getCatForId( 'SELIBR' )
end
function bnfLink( id )
--Add cb prefix if it has been removed
if not string.match( id, '^cb.+$' ) then
id = 'cb' .. id
end
return '[http://catalogue.bnf.fr/ark:/12148/' .. id .. ' ' .. id .. ']' .. getCatForId( 'BNF' )
end
function bpnLink( id )
if not string.match( id, '^%d+$' ) then
return false
end
return '[http://www.biografischportaal.nl/persoon/' .. id .. ' ' .. id .. ']' .. getCatForId( 'BPN' )
end
function ridLink( id )
return '[http://www.researcherid.com/rid/' .. id .. ' ' .. id .. ']' .. getCatForId( 'RID' )
end
function bibsysLink( id )
return '[http://ask.bibsys.no/ask/action/result?cmd=&kilde=biblio&cql=bs.autid+%3D+' .. id .. '&feltselect=bs.autid ' .. id .. ']' .. getCatForId( 'BIBSYS' )
end
function ulanLink( id )
return '[http://www.getty.edu/vow/ULANFullDisplay?find=&role=&nation=&subjectid=' .. id .. ' ' .. id .. ']' .. getCatForId( 'ULAN' )
end
function nlaLink( id )
return '[http://nla.gov.au/anbd.aut-an' .. id .. ' ' .. id .. ']' .. getCatForId( 'NLA' )
end
function getIdsFromWikidata( item, property )
local ids = {}
if not item.claims[property] then
return ids
end
for _, statement in pairs( item.claims[property] ) do
table.insert( ids, statement.mainsnak.datavalue.value )
end
return ids
end
function matchesWikidataRequirements( item, reqs )
for _, group in pairs( reqs ) do
local property = 'p' .. group[1]
local qid = group[2]
if item.claims[property] ~= nil then
for _, statement in pairs ( item.claims[property] ) do
if statement.mainsnak.datavalue ~= nil then
if statement.mainsnak.datavalue.value['numeric-id'] == qid then
return true
end
end
end
end
end
return false
end
function createRow( id, label, rawValue, link, withUid )
if link then
if withUid then
return '* ' .. label .. ' <span class="uid">' .. link .. '</span>\n'
else
return '* ' .. label .. ' ' .. link .. '\n'
end
else
return '* <span class="error">The ' .. id .. ' id ' .. rawValue .. ' is not valid.</span>[[Category:Rencanai wikipedia dengan kuasa kawalan pengenalan (' .. id .. ') rosak]]\n'
end
end
--In this order: name of the parameter, label, propertyId in Wikidata, formatting function
local conf = {
{ 'VIAF', '[[Lembaga Fail Maya Antarabangsa|VIAF]]', 214, viafLink },
{ 'LCCN', '[[Perpustakaan Kongres Nombor Kawalan|LCCN]]', 244, lccnLink },
{ 'ISNI', '[[Standard Pengecam Nama Antarabangsa|ISNI]]', 213, isniLink },
{ 'ORCID', '[[ORCID]]', 496, orcidLink },
{ 'GND', '[[Fail Kuasa Bersepadu|GND]]', 227, gndLink },
{ 'SELIBR', '[[LIBRIS]]', 906, selibrLink },
{ 'BNF', '[[Bibliothèque nationale de France|BNF]]', 268, bnfLink },
{ 'BPN', '[[Biografisch Portaal|BPN]]', 651, bpnLink },
{ 'RID', '[[ResearcherID]]', 0, ridLink },
{ 'BIBSYS', '[[BIBSYS]]', 0, bibsysLink },
{ 'ULAN', '[[Kesatuan Senarai Nama Artist|ULAN]]', 245, ulanLink },
{ 'MBA', '[[MusicBrainz]]', 434, mbLink },
{ 'NLA', '[[Perpustakaan Negara Australia|NLA]]', 409, nlaLink },
}
-- Check that the Wikidata item has this property-->value before adding it
local reqs = {}
reqs['MBA'] = {
{ 106, 177220 }, -- occupation -> singer
{ 31, 177220 }, -- instance of -> singer
{ 106, 13385019 }, -- occupation -> rapper
{ 31, 13385019 }, -- instance of -> rapper
{ 106, 639669 }, -- occupation -> musician
{ 31, 639669 }, -- instance of -> musician
{ 106, 36834 }, -- occupation -> composer
{ 31, 36834 }, -- instance of -> composer
{ 106, 488205 }, -- occupation -> singer-songwriter
{ 31, 488205 }, -- instance of -> singer-songwriter
{ 106, 183945 }, -- occupation -> record producer
{ 31, 183945 }, -- instance of -> record producer
{ 106, 10816969 }, -- occupation -> club DJ
{ 31, 10816969 }, -- instance of -> club DJ
{ 106, 130857 }, -- occupation -> DJ
{ 31, 130857 }, -- instance of -> DJ
{ 106, 158852 }, -- occupation -> conductor
{ 31, 158852 }, -- instance of -> conductor
{ 31, 215380 }, -- instance of -> band
}
local p = {}
function p.authorityControl( frame )
local parentArgs = frame:getParent().args
--Create rows
local elements = {}
--redirect PND to GND
if (parentArgs.GND == nil or parentArgs.GND == '') and parentArgs.PND ~= nil and parentArgs.PND ~= '' then
parentArgs.GND = parentArgs.PND
end
--Wikidata fallback if requested
local item = mw.wikibase.getEntity()
if item ~= nil and item.claims ~= nil then
for _, params in pairs( conf ) do
if params[3] ~= 0 then
local val = parentArgs[params[1]]
if not val or val == '' then
local canUseWikidata = nil
if reqs[params[1]] ~= nil then
canUseWikidata = matchesWikidataRequirements( item, reqs[params[1]] )
else
canUseWikidata = true
end
if canUseWikidata then
local wikidataIds = getIdsFromWikidata( item, 'p' .. params[3] )
if wikidataIds[1] then
parentArgs[params[1]] = wikidataIds[1]
end
end
end
end
end
end
--Worldcat
if parentArgs['WORLDCATID'] and parentArgs['WORLDCATID'] ~= '' then
table.insert( elements, createRow( 'WORLDCATID', '', parentArgs['WORLDCATID'], '[http://www.worldcat.org/identities/' .. parentArgs['WORLDCATID'] .. ' WorldCat]', false ) ) --Validation?
elseif parentArgs['LCCN'] and parentArgs['LCCN'] ~= '' then
local lccnParts = splitLccn( parentArgs['LCCN'] )
if lccnParts then
table.insert( elements, createRow( 'LCCN', '', parentArgs['LCCN'], '[http://www.worldcat.org/identities/lccn-' .. lccnParts[1] .. lccnParts[2] .. '-' .. lccnParts[3] .. ' WorldCat]', false ) )
end
end
--Configured rows
for k, params in pairs( conf ) do
local val = parentArgs[params[1]]
if val and val ~= '' then
table.insert( elements, createRow( params[1], params[2] .. ':', val, params[4]( val ), true ) )
end
end
local Navbox = require('Module:Navbox')
return Navbox._navbox( {
name = 'Authority control',
bodyclass = 'hlist',
group1 = '[[Authority control]]',
list1 = table.concat( elements )
} )
end
return p