Difference between revisions of "Module:Authority control"
Jump to navigation
Jump to search
en>Elegie (Use HTTPS for the CiNii and NKC (National Library of the Czech Republic) links in order to provide increased privacy and security for users. (From what it appears, accessing an HTTP version of a link generates a 301 redirect to an HTTPS version of the link.)) |
en>Reedy (Update from sandbox) |
||
| Line 1: | Line 1: | ||
require('Module:No globals') | require('Module:No globals') | ||
| − | local function getCatForId( id ) | + | local p = {} |
| + | |||
| + | function p.getCatForId( id ) | ||
local title = mw.title.getCurrentTitle() | local title = mw.title.getCurrentTitle() | ||
local namespace = title.namespace | local namespace = title.namespace | ||
| Line 13: | Line 15: | ||
end | end | ||
| − | + | function p.viafLink( id ) | |
if not string.match( id, '^%d+$' ) then | if not string.match( id, '^%d+$' ) then | ||
return false | return false | ||
end | end | ||
| − | return '[https://viaf.org/viaf/' .. id .. ' ' .. id .. ']' .. getCatForId( 'VIAF' ) | + | return '[https://viaf.org/viaf/' .. id .. ' ' .. id .. ']' .. p.getCatForId( 'VIAF' ) |
end | end | ||
| − | + | function p.kulturnavLink( id ) | |
return '[http://kulturnav.org/' .. id .. ' ' .. id .. ']' | return '[http://kulturnav.org/' .. id .. ' ' .. id .. ']' | ||
end | end | ||
| − | + | function p.sikartLink( id ) | |
return '[http://www.sikart.ch/KuenstlerInnen.aspx?id=' .. id .. '&lng=en ' .. id .. ']' | return '[http://www.sikart.ch/KuenstlerInnen.aspx?id=' .. id .. '&lng=en ' .. id .. ']' | ||
end | end | ||
| − | + | function p.tlsLink( id ) | |
local id2 = id:gsub(' +', '_') | local id2 = id:gsub(' +', '_') | ||
return '[http://tls.theaterwissenschaft.ch/wiki/' .. id2 .. ' ' .. id .. ']' | return '[http://tls.theaterwissenschaft.ch/wiki/' .. id2 .. ' ' .. id .. ']' | ||
end | end | ||
| − | + | function p.ciniiLink( id ) | |
return '[https://ci.nii.ac.jp/author/' .. id .. '?l=en ' .. id .. ']' | return '[https://ci.nii.ac.jp/author/' .. id .. '?l=en ' .. id .. ']' | ||
end | end | ||
| − | + | function p.bneLink( id ) | |
return '[http://catalogo.bne.es/uhtbin/authoritybrowse.cgi?action=display&authority_id=' .. id .. ' ' .. id .. ']' | return '[http://catalogo.bne.es/uhtbin/authoritybrowse.cgi?action=display&authority_id=' .. id .. ' ' .. id .. ']' | ||
end | end | ||
| − | + | function p.uscongressLink( id ) | |
return '[http://bioguide.congress.gov/scripts/biodisplay.pl?index=' .. id .. ' ' .. id .. ']' | return '[http://bioguide.congress.gov/scripts/biodisplay.pl?index=' .. id .. ' ' .. id .. ']' | ||
end | end | ||
| − | + | function p.narapersonLink( id ) | |
return '[https://research.archives.gov/person/' .. id .. ' ' .. id .. ']' | return '[https://research.archives.gov/person/' .. id .. ' ' .. id .. ']' | ||
end | end | ||
| − | + | function p.naraorganizationLink( id ) | |
return '[https://research.archives.gov/organization/' .. id .. ' ' .. id .. ']' | return '[https://research.archives.gov/organization/' .. id .. ' ' .. id .. ']' | ||
end | end | ||
| − | + | function p.botanistLink( id ) | |
local id2 = id:gsub(' +', '%%20') | local id2 = id:gsub(' +', '%%20') | ||
return '[http://www.ipni.org/ipni/advAuthorSearch.do?find_abbreviation=' .. id2 .. ' ' .. id .. ']' | return '[http://www.ipni.org/ipni/advAuthorSearch.do?find_abbreviation=' .. id2 .. ' ' .. id .. ']' | ||
end | end | ||
| − | + | function p.mgpLink( id ) | |
-- TODO Implement some sanity checking regex | -- TODO Implement some sanity checking regex | ||
return '[http://www.genealogy.ams.org/id.php?id=' .. id .. ' ' .. id .. ']' | return '[http://www.genealogy.ams.org/id.php?id=' .. id .. ' ' .. id .. ']' | ||
end | end | ||
| − | + | function p.rslLink( id ) | |
-- TODO Implement some sanity checking regex | -- TODO Implement some sanity checking regex | ||
return '[http://aleph.rsl.ru/F?func=find-b&find_code=SYS&adjacent=Y&local_base=RSL11&request=' .. id .. '&CON_LNG=ENG ' .. id .. ']' | return '[http://aleph.rsl.ru/F?func=find-b&find_code=SYS&adjacent=Y&local_base=RSL11&request=' .. id .. '&CON_LNG=ENG ' .. id .. ']' | ||
end | end | ||
| − | + | function p.leonoreLink( id ) | |
-- Identifiants allant de LH/1/1 à LH/2794/54 (légionnaires) | -- Identifiants allant de LH/1/1 à LH/2794/54 (légionnaires) | ||
-- Identifiants allant de C/0/1 à C/0/84 (84 légionnaires célèbres) | -- Identifiants allant de C/0/1 à C/0/84 (84 légionnaires célèbres) | ||
| Line 80: | Line 82: | ||
end | end | ||
| − | + | function p.sbnLink( id ) | |
if not string.match( id, '^IT\\ICCU\\%d%d%d%d%d%d%d%d%d%d$' ) and not string.match( id, '^IT\\ICCU\\%u%u[%d%u]%u\\%d%d%d%d%d%d$' ) then | if not string.match( id, '^IT\\ICCU\\%d%d%d%d%d%d%d%d%d%d$' ) and not string.match( id, '^IT\\ICCU\\%u%u[%d%u]%u\\%d%d%d%d%d%d$' ) then | ||
return false | return false | ||
end | end | ||
| − | return '[http://opac.sbn.it/opacsbn/opac/iccu/scheda_authority.jsp?bid=' .. id .. ' ' .. id .. ']' .. getCatForId( 'SBN' ) | + | return '[http://opac.sbn.it/opacsbn/opac/iccu/scheda_authority.jsp?bid=' .. id .. ' ' .. id .. ']' .. p.getCatForId( 'SBN' ) |
end | end | ||
| − | + | function p.nkcLink( id ) | |
return '[https://aleph.nkp.cz/F/?func=find-c&local_base=aut&ccl_term=ica=' .. id .. '&CON_LNG=ENG ' .. id .. ']' | return '[https://aleph.nkp.cz/F/?func=find-c&local_base=aut&ccl_term=ica=' .. id .. '&CON_LNG=ENG ' .. id .. ']' | ||
end | end | ||
| − | + | function p.nclLink( id ) | |
if not string.match( id, '^%d+$' ) then | if not string.match( id, '^%d+$' ) then | ||
return false | return false | ||
| Line 98: | Line 100: | ||
end | end | ||
| − | + | function p.ndlLink( id ) | |
return '[https://id.ndl.go.jp/auth/ndlna/' .. id .. ' ' .. id .. ']' | return '[https://id.ndl.go.jp/auth/ndlna/' .. id .. ' ' .. id .. ']' | ||
end | end | ||
| − | + | function p.sudocLink( id ) | |
if not string.match( id, '^%d%d%d%d%d%d%d%d[%dxX]$' ) then | if not string.match( id, '^%d%d%d%d%d%d%d%d[%dxX]$' ) then | ||
return false | return false | ||
| Line 109: | Line 111: | ||
end | end | ||
| − | + | function p.hlsLink( id ) | |
if not string.match( id, '^%d+$' ) then | if not string.match( id, '^%d+$' ) then | ||
return false | return false | ||
| Line 116: | Line 118: | ||
end | end | ||
| − | + | function p.lirLink( id ) | |
if not string.match( id, '^%d+$' ) then | if not string.match( id, '^%d+$' ) then | ||
return false | return false | ||
| Line 123: | Line 125: | ||
end | end | ||
| − | + | function p.splitLccn( id ) | |
if id:match( '^%l%l?%l?%d%d%d%d%d%d%d%d%d?%d?$' ) then | 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' ) | id = id:gsub( '^(%l+)(%d+)(%d%d%d%d%d%d)$', '%1/%2/%3' ) | ||
| Line 133: | Line 135: | ||
end | end | ||
| − | + | function p.append(str, c, length) | |
while str:len() < length do | while str:len() < length do | ||
str = c .. str | str = c .. str | ||
| Line 140: | Line 142: | ||
end | end | ||
| − | + | function p.lccnLink( id ) | |
local parts = splitLccn( id ) | local parts = splitLccn( id ) | ||
if not parts then | if not parts then | ||
| Line 146: | Line 148: | ||
end | end | ||
local lccnType = parts[1] ~= 'sh' and 'names' or 'subjects' | local lccnType = parts[1] ~= 'sh' and 'names' or 'subjects' | ||
| − | id = parts[1] .. parts[2] .. append( parts[3], '0', 6 ) | + | id = parts[1] .. parts[2] .. p.append( parts[3], '0', 6 ) |
| − | return '[http://id.loc.gov/authorities/' .. lccnType .. '/' .. id .. ' ' .. id .. ']' .. getCatForId( 'LCCN' ) | + | return '[http://id.loc.gov/authorities/' .. lccnType .. '/' .. id .. ' ' .. id .. ']' .. p.getCatForId( 'LCCN' ) |
end | end | ||
| − | + | function p.mbLink( id ) | |
-- TODO Implement some sanity checking regex | -- TODO Implement some sanity checking regex | ||
| − | return '[https://musicbrainz.org/artist/' .. id .. ' ' .. id .. ']' .. getCatForId( 'MusicBrainz' ) | + | return '[https://musicbrainz.org/artist/' .. id .. ' ' .. id .. ']' .. p.getCatForId( 'MusicBrainz' ) |
end | end | ||
--Returns the ISNI check digit isni must be a string where the 15 first elements are digits | --Returns the ISNI check digit isni must be a string where the 15 first elements are digits | ||
| − | + | function p.getIsniCheckDigit( isni ) | |
local total = 0 | local total = 0 | ||
for i = 1, 15 do | for i = 1, 15 do | ||
| Line 172: | Line 174: | ||
--Validate ISNI (and ORCID) and retuns it as a 16 characters string or returns false if it's invalid | --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 | --See http://support.orcid.org/knowledgebase/articles/116780-structure-of-the-orcid-identifier | ||
| − | + | function p.validateIsni( id ) | |
id = id:gsub( '[ %-]', '' ):upper() | 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 | if not id:match( '^%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d[%dX]$' ) then | ||
return false | return false | ||
end | end | ||
| − | if getIsniCheckDigit( id ) ~= string.char( id:byte( 16 ) ) then | + | if p.getIsniCheckDigit( id ) ~= string.char( id:byte( 16 ) ) then |
return false | return false | ||
end | end | ||
| Line 183: | Line 185: | ||
end | end | ||
| − | + | function p.isniLink( id ) | |
| − | id = validateIsni( id ) | + | id = p.validateIsni( id ) |
if not id then | if not id then | ||
return false | return false | ||
end | end | ||
| − | return '[http://isni.org/isni/' .. id .. ' ' .. id:sub( 1, 4 ) .. ' ' .. id:sub( 5, 8 ) .. ' ' .. id:sub( 9, 12 ) .. ' ' .. id:sub( 13, 16 ) .. ']' .. getCatForId( 'ISNI' ) | + | return '[http://isni.org/isni/' .. id .. ' ' .. id:sub( 1, 4 ) .. ' ' .. id:sub( 5, 8 ) .. ' ' .. id:sub( 9, 12 ) .. ' ' .. id:sub( 13, 16 ) .. ']' .. p.getCatForId( 'ISNI' ) |
end | end | ||
| − | + | function p.orcidLink( id ) | |
| − | id = validateIsni( id ) | + | id = p.validateIsni( id ) |
if not id then | if not id then | ||
return false | return false | ||
end | end | ||
id = id:sub( 1, 4 ) .. '-' .. id:sub( 5, 8 ) .. '-' .. id:sub( 9, 12 ) .. '-' .. id:sub( 13, 16 ) | id = id:sub( 1, 4 ) .. '-' .. id:sub( 5, 8 ) .. '-' .. id:sub( 9, 12 ) .. '-' .. id:sub( 13, 16 ) | ||
| − | return '[https://orcid.org/' .. id .. ' ' .. id .. ']' .. getCatForId( 'ORCID' ) | + | return '[https://orcid.org/' .. id .. ' ' .. id .. ']' .. p.getCatForId( 'ORCID' ) |
end | end | ||
| − | + | function p.gndLink( id ) | |
| − | return '[https://d-nb.info/gnd/' .. id .. ' ' .. id .. ']' .. getCatForId( 'GND' ) | + | return '[https://d-nb.info/gnd/' .. id .. ' ' .. id .. ']' .. p.getCatForId( 'GND' ) |
end | end | ||
| − | + | function p.selibrLink( id ) | |
if not string.match( id, '^%d+$' ) then | if not string.match( id, '^%d+$' ) then | ||
return false | return false | ||
end | end | ||
| − | return '[https://libris.kb.se/auth/' .. id .. ' ' .. id .. ']' .. getCatForId( 'SELIBR' ) | + | return '[https://libris.kb.se/auth/' .. id .. ' ' .. id .. ']' .. p.getCatForId( 'SELIBR' ) |
end | end | ||
| − | + | function p.bnfLink( id ) | |
--Add cb prefix if it has been removed | --Add cb prefix if it has been removed | ||
if not string.match( id, '^cb.+$' ) then | if not string.match( id, '^cb.+$' ) then | ||
| Line 217: | Line 219: | ||
end | end | ||
| − | return '[http://catalogue.bnf.fr/ark:/12148/' .. id .. ' ' .. id .. '] [http://data.bnf.fr/ark:/12148/' .. id .. ' (data)]' .. getCatForId( 'BNF' ) | + | return '[http://catalogue.bnf.fr/ark:/12148/' .. id .. ' ' .. id .. '] [http://data.bnf.fr/ark:/12148/' .. id .. ' (data)]' .. p.getCatForId( 'BNF' ) |
end | end | ||
| − | + | function p.bpnLink( id ) | |
if not string.match( id, '^%d+$' ) then | if not string.match( id, '^%d+$' ) then | ||
return false | return false | ||
end | end | ||
| − | return '[http://www.biografischportaal.nl/en/persoon/' .. id .. ' ' .. id .. ']' .. getCatForId( 'BPN' ) | + | return '[http://www.biografischportaal.nl/en/persoon/' .. id .. ' ' .. id .. ']' .. p.getCatForId( 'BPN' ) |
end | end | ||
| − | + | function p.ridLink( id ) | |
| − | return '[https://www.researcherid.com/rid/' .. id .. ' ' .. id .. ']' .. getCatForId( 'RID' ) | + | return '[https://www.researcherid.com/rid/' .. id .. ' ' .. id .. ']' .. p.getCatForId( 'RID' ) |
end | end | ||
| − | + | function p.bibsysLink( id ) | |
| − | return '[https://authority.bibsys.no/authority/rest/authorities/html/' .. id .. ' ' .. id .. ']' .. getCatForId( 'BIBSYS' ) | + | return '[https://authority.bibsys.no/authority/rest/authorities/html/' .. id .. ' ' .. id .. ']' .. p.getCatForId( 'BIBSYS' ) |
end | end | ||
| − | + | function p.ulanLink( id ) | |
| − | return '[https://www.getty.edu/vow/ULANFullDisplay?find=&role=&nation=&subjectid=' .. id .. ' ' .. id .. ']' .. getCatForId( 'ULAN' ) | + | return '[https://www.getty.edu/vow/ULANFullDisplay?find=&role=&nation=&subjectid=' .. id .. ' ' .. id .. ']' .. p.getCatForId( 'ULAN' ) |
end | end | ||
| − | + | function p.nlaLink( id ) | |
| − | return '[https://nla.gov.au/anbd.aut-an' .. id .. ' ' .. id .. ']' .. getCatForId( 'NLA' ) | + | return '[https://nla.gov.au/anbd.aut-an' .. id .. ' ' .. id .. ']' .. p.getCatForId( 'NLA' ) |
end | end | ||
| − | + | function p.rkdartistsLink( id ) | |
| − | return '[https://rkd.nl/en/explore/artists/' .. id .. ' ' .. id .. ']' .. getCatForId( 'RKDartists' ) | + | return '[https://rkd.nl/en/explore/artists/' .. id .. ' ' .. id .. ']' .. p.getCatForId( 'RKDartists' ) |
end | end | ||
| − | + | function p.snacLink( id ) | |
| − | return '[http://socialarchive.iath.virginia.edu/ark:/99166/' .. id .. ' ' .. id .. ']' .. getCatForId( 'SNAC-ID' ) | + | return '[http://socialarchive.iath.virginia.edu/ark:/99166/' .. id .. ' ' .. id .. ']' .. p.getCatForId( 'SNAC-ID' ) |
end | end | ||
| − | + | function p.dblpLink( id ) | |
| − | return '[https://dblp.org/pid/' .. id .. ' ' .. id .. ']' .. getCatForId( 'DBLP' ) | + | return '[https://dblp.org/pid/' .. id .. ' ' .. id .. ']' .. p.getCatForId( 'DBLP' ) |
end | end | ||
| − | + | function p.acmLink( id ) | |
| − | return '[https://dl.acm.org/author_page.cfm?id=' .. id .. ' ' .. id .. ']' .. getCatForId( 'ACM-DL' ) | + | return '[https://dl.acm.org/author_page.cfm?id=' .. id .. ' ' .. id .. ']' .. p.getCatForId( 'ACM-DL' ) |
end | end | ||
| − | + | function p.autoresuyLink( id ) | |
| − | return '[http://autores.uy/autor/' .. id .. ' ' .. id .. ']' .. getCatForId( 'autores.uy' ) | + | return '[http://autores.uy/autor/' .. id .. ' ' .. id .. ']' .. p.getCatForId( 'autores.uy' ) |
end | end | ||
| − | + | function p.picLink( id ) | |
| − | return '[https://pic.nypl.org/constituents/' .. id .. ' ' .. id .. ']' .. getCatForId( 'PIC' ) | + | return '[https://pic.nypl.org/constituents/' .. id .. ' ' .. id .. ']' .. p.getCatForId( 'PIC' ) |
end | end | ||
| − | + | function p.getIdsFromWikidata( itemId, property ) | |
local ids = {} | local ids = {} | ||
local statements = mw.wikibase.getBestStatements( itemId, property ) | local statements = mw.wikibase.getBestStatements( itemId, property ) | ||
| Line 280: | Line 282: | ||
end | end | ||
| − | + | function p.matchesWikidataRequirements( itemId, reqs ) | |
for _, group in ipairs( reqs ) do | for _, group in ipairs( reqs ) do | ||
local property = 'P' .. group[1] | local property = 'P' .. group[1] | ||
| Line 298: | Line 300: | ||
end | end | ||
| − | + | function p.createRow( id, label, rawValue, link, withUid ) | |
if link then | if link then | ||
if withUid then | if withUid then | ||
return '*<span class="nowrap">' .. label .. ' <span class="uid">' .. link .. '</span></span>\n' | return '*<span class="nowrap">' .. label .. ' <span class="uid">' .. link .. '</span></span>\n' | ||
| − | |||
| − | |||
end | end | ||
| − | + | ||
| − | return '* <span class=" | + | return '*<span class="nowrap">' .. label .. ' ' .. link .. '</span>\n' |
end | end | ||
| + | |||
| + | return '* <span class="error">The ' .. id .. ' id ' .. rawValue .. ' is not valid.</span>[[Category:Wikipedia articles with faulty authority control identifiers (' .. id .. ')]]\n' | ||
end | end | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
-- Check that the Wikidata item has this property-->value before adding it | -- Check that the Wikidata item has this property-->value before adding it | ||
local reqs = {} | local reqs = {} | ||
| − | + | --In this order: name of the parameter, label, propertyId in Wikidata, formatting function | |
| + | p.conf = { | ||
| + | { 'VIAF', '[[Virtual International Authority File|VIAF]]', 214, p.viafLink }, | ||
| + | { 'LCCN', '[[Library of Congress Control Number|LCCN]]', 244, p.lccnLink }, | ||
| + | { 'ISNI', '[[International Standard Name Identifier|ISNI]]', 213, p.isniLink }, | ||
| + | { 'ORCID', '[[ORCID]]', 496, p.orcidLink }, | ||
| + | { 'GND', '[[Integrated Authority File|GND]]', 227, p.gndLink }, | ||
| + | { 'SELIBR', '[[LIBRIS|SELIBR]]', 906, p.selibrLink }, | ||
| + | { 'SUDOC', '[[Système universitaire de documentation|SUDOC]]', 269, p.sudocLink }, | ||
| + | { 'BNF', '[[Bibliothèque nationale de France|BNF]]', 268, p.bnfLink }, | ||
| + | { 'BPN', '[[Biografisch Portaal|BPN]]', 651, p.bpnLink }, | ||
| + | { 'RID', '[[ResearcherID]]', 1053, p.ridLink }, | ||
| + | { 'BIBSYS', '[[BIBSYS]]', 1015, p.bibsysLink }, | ||
| + | { 'ULAN', '[[Union List of Artist Names|ULAN]]', 245, p.ulanLink }, | ||
| + | { 'HDS', '[[Historical Dictionary of Switzerland|HDS]]', 902, p.hlsLink }, | ||
| + | { 'LIR', '[[Historical Dictionary of Switzerland#Lexicon_Istoric_Retic|LIR]]', 886, p.lirLink }, | ||
| + | { 'MBA', '[[MusicBrainz]]', 434, p.mbLink }, | ||
| + | { 'MGP', '[[Mathematics Genealogy Project|MGP]]', 549, p.mgpLink }, | ||
| + | { 'NLA', '[[National Library of Australia|NLA]]', 409, p.nlaLink }, | ||
| + | { 'NDL', '[[National Diet Library|NDL]]', 349, p.ndlLink }, | ||
| + | { 'NCL', '[[National Central Library|NCL]]', 1048, p.nclLink }, | ||
| + | { 'NKC', '[[National Library of the Czech Republic|NKC]]', 691, p.nkcLink }, | ||
| + | { 'Léonore', '[[Base Léonore|Léonore]]', 640, p.leonoreLink }, | ||
| + | { 'SBN', '[[Istituto Centrale per il Catalogo Unico|ICCU]]', 396, p.sbnLink }, | ||
| + | { 'RLS', '[[Russian State Library|RLS]]', 947, p.rslLink }, | ||
| + | { 'Botanist', '[[Author citation (botany)|Botanist]]', 428, p.botanistLink }, | ||
| + | { 'NARA-person', '[[National Archives and Records Administration|NARA]]', 1222, p.narapersonLink }, | ||
| + | { 'NARA-organization', '[[National Archives and Records Administration|NARA]]', 1223, p.naraorganizationLink }, | ||
| + | { 'USCongress', '[[Biographical Directory of the United States Congress|US Congress]]', 1157, p.uscongressLink }, | ||
| + | { 'BNE', '[[Biblioteca Nacional de España|BNE]]', 950, p.bneLink }, | ||
| + | { 'CINII', '[[CiNii]]', 271, p.ciniiLink }, | ||
| + | { 'TLS', '[[Theaterlexikon der Schweiz|TLS]]', 1362, p.tlsLink }, | ||
| + | { 'SIKART', '[[SIKART]]', 781, p.sikartLink }, | ||
| + | { 'KULTURNAV', '[[KulturNav]]', 1248, p.kulturnavLink }, | ||
| + | { 'RKDartists', '[[Netherlands Institute for Art History#Online artist pages|RKD]]', 650, p.rkdartistsLink }, | ||
| + | { 'SNAC-ID', '[[SNAC]]', 3430, p.snacLink }, | ||
| + | { 'DBLP', '[[DBLP]]', 2456, p.dblpLink }, | ||
| + | { 'ACM-DL', '[[ACM Digital Library|ACM DL]]', 864, p.acmLink }, | ||
| + | { 'autores.uy', '[[autores.uy]]', 2558, p.autoresuyLink }, | ||
| + | { 'PIC', '[[:d:Q23892012|PIC]]', 2750, p.picLink }, | ||
| + | } | ||
function p.authorityControl( frame ) | function p.authorityControl( frame ) | ||
| Line 370: | Line 370: | ||
local itemId = mw.wikibase.getEntityIdForCurrentPage() | local itemId = mw.wikibase.getEntityIdForCurrentPage() | ||
if itemId ~= nil then | if itemId ~= nil then | ||
| − | for _, params in ipairs( conf ) do | + | for _, params in ipairs( p.conf ) do |
if params[3] ~= 0 then | if params[3] ~= 0 then | ||
local val = parentArgs[params[1]] | local val = parentArgs[params[1]] | ||
| Line 376: | Line 376: | ||
local canUseWikidata = nil | local canUseWikidata = nil | ||
if reqs[params[1]] ~= nil then | if reqs[params[1]] ~= nil then | ||
| − | canUseWikidata = matchesWikidataRequirements( itemId, reqs[params[1]] ) | + | canUseWikidata = p.matchesWikidataRequirements( itemId, reqs[params[1]] ) |
else | else | ||
canUseWikidata = true | canUseWikidata = true | ||
end | end | ||
if canUseWikidata then | if canUseWikidata then | ||
| − | local wikidataIds = getIdsFromWikidata( itemId, 'P' .. params[3] ) | + | local wikidataIds = p.getIdsFromWikidata( itemId, 'P' .. params[3] ) |
if wikidataIds[1] then | if wikidataIds[1] then | ||
parentArgs[params[1]] = wikidataIds[1] | parentArgs[params[1]] = wikidataIds[1] | ||
| Line 405: | Line 405: | ||
--Configured rows | --Configured rows | ||
local rct = 0 | local rct = 0 | ||
| − | for _, params in ipairs( conf ) do | + | for _, params in ipairs( p.conf ) do |
local val = parentArgs[params[1]] | local val = parentArgs[params[1]] | ||
if val and val ~= '' then | if val and val ~= '' then | ||
| − | table.insert( elements, createRow( params[1], params[2] .. ':', val, params[4]( val ), true ) ) | + | table.insert( elements, p.createRow( params[1], params[2] .. ':', val, params[4]( val ), true ) ) |
rct = rct + 1 | rct = rct + 1 | ||
end | end | ||
| Line 425: | Line 425: | ||
list1 = table.concat( elements ) | list1 = table.concat( elements ) | ||
} ) | } ) | ||
| − | |||
| − | |||
end | end | ||
| + | |||
| + | return "" | ||
end | end | ||
return p | return p | ||
Revision as of 18:06, 11 May 2018
Documentation for this module may be created at Module:Authority control/doc
require('Module:No globals')
local p = {}
function p.getCatForId( id )
local title = mw.title.getCurrentTitle()
local namespace = title.namespace
if namespace == 0 then
return '[[Category:Wikipedia articles with ' .. id .. ' identifiers]]'
elseif namespace == 2 and not title.isSubpage then
return '[[Category:User pages with ' .. id .. ' identifiers]]'
else
return '[[Category:Miscellaneous pages with ' .. id .. ' identifiers]]'
end
end
function p.viafLink( id )
if not string.match( id, '^%d+$' ) then
return false
end
return '[https://viaf.org/viaf/' .. id .. ' ' .. id .. ']' .. p.getCatForId( 'VIAF' )
end
function p.kulturnavLink( id )
return '[http://kulturnav.org/' .. id .. ' ' .. id .. ']'
end
function p.sikartLink( id )
return '[http://www.sikart.ch/KuenstlerInnen.aspx?id=' .. id .. '&lng=en ' .. id .. ']'
end
function p.tlsLink( id )
local id2 = id:gsub(' +', '_')
return '[http://tls.theaterwissenschaft.ch/wiki/' .. id2 .. ' ' .. id .. ']'
end
function p.ciniiLink( id )
return '[https://ci.nii.ac.jp/author/' .. id .. '?l=en ' .. id .. ']'
end
function p.bneLink( id )
return '[http://catalogo.bne.es/uhtbin/authoritybrowse.cgi?action=display&authority_id=' .. id .. ' ' .. id .. ']'
end
function p.uscongressLink( id )
return '[http://bioguide.congress.gov/scripts/biodisplay.pl?index=' .. id .. ' ' .. id .. ']'
end
function p.narapersonLink( id )
return '[https://research.archives.gov/person/' .. id .. ' ' .. id .. ']'
end
function p.naraorganizationLink( id )
return '[https://research.archives.gov/organization/' .. id .. ' ' .. id .. ']'
end
function p.botanistLink( id )
local id2 = id:gsub(' +', '%%20')
return '[http://www.ipni.org/ipni/advAuthorSearch.do?find_abbreviation=' .. id2 .. ' ' .. id .. ']'
end
function p.mgpLink( id )
-- TODO Implement some sanity checking regex
return '[http://www.genealogy.ams.org/id.php?id=' .. id .. ' ' .. id .. ']'
end
function p.rslLink( id )
-- TODO Implement some sanity checking regex
return '[http://aleph.rsl.ru/F?func=find-b&find_code=SYS&adjacent=Y&local_base=RSL11&request=' .. id .. '&CON_LNG=ENG ' .. id .. ']'
end
function p.leonoreLink( id )
-- Identifiants allant de LH/1/1 à LH/2794/54 (légionnaires)
-- Identifiants allant de C/0/1 à C/0/84 (84 légionnaires célèbres)
-- Identifiants allant de 19800035/1/1 à 19800035/385/51670 (légionnaires décédés entre 1954 et 1977, et quelques dossiers de légionnaires décédés avant 1954)
if not string.match( id, '^LH/%d%d?%d?%d?/%d%d?%d?$' ) and
not string.match( id, '^C/0/%d%d?$' ) and
not string.match( id, '^19800035/%d%d?%d?%d?/%d%d?%d?%d?%d?$' ) then
return false
end
return '[http://www.culture.gouv.fr/public/mistral/leonore_fr?ACTION=CHERCHER&FIELD_1=COTE&VALUE_1=' .. id .. ' ' .. id .. ']'
end
function p.sbnLink( id )
if not string.match( id, '^IT\\ICCU\\%d%d%d%d%d%d%d%d%d%d$' ) and not string.match( id, '^IT\\ICCU\\%u%u[%d%u]%u\\%d%d%d%d%d%d$' ) then
return false
end
return '[http://opac.sbn.it/opacsbn/opac/iccu/scheda_authority.jsp?bid=' .. id .. ' ' .. id .. ']' .. p.getCatForId( 'SBN' )
end
function p.nkcLink( id )
return '[https://aleph.nkp.cz/F/?func=find-c&local_base=aut&ccl_term=ica=' .. id .. '&CON_LNG=ENG ' .. id .. ']'
end
function p.nclLink( id )
if not string.match( id, '^%d+$' ) then
return false
end
return '[http://aleweb.ncl.edu.tw/F/?func=accref&acc_sequence=' .. id .. '&CON_LNG=ENG ' .. id .. ']'
end
function p.ndlLink( id )
return '[https://id.ndl.go.jp/auth/ndlna/' .. id .. ' ' .. id .. ']'
end
function p.sudocLink( id )
if not string.match( id, '^%d%d%d%d%d%d%d%d[%dxX]$' ) then
return false
end
return '[https://www.idref.fr/' .. id .. ' ' .. id .. ']'
end
function p.hlsLink( id )
if not string.match( id, '^%d+$' ) then
return false
end
return '[http://www.hls-dhs-dss.ch/textes/f/F' .. id .. '.php ' .. id .. ']'
end
function p.lirLink( id )
if not string.match( id, '^%d+$' ) then
return false
end
return '[http://www.e-lir.ch/e-LIR___Lexicon.' .. id .. '.450.0.html ' .. id .. ']'
end
function p.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 p.append(str, c, length)
while str:len() < length do
str = c .. str
end
return str
end
function p.lccnLink( id )
local parts = splitLccn( id )
if not parts then
return false
end
local lccnType = parts[1] ~= 'sh' and 'names' or 'subjects'
id = parts[1] .. parts[2] .. p.append( parts[3], '0', 6 )
return '[http://id.loc.gov/authorities/' .. lccnType .. '/' .. id .. ' ' .. id .. ']' .. p.getCatForId( 'LCCN' )
end
function p.mbLink( id )
-- TODO Implement some sanity checking regex
return '[https://musicbrainz.org/artist/' .. id .. ' ' .. id .. ']' .. p.getCatForId( 'MusicBrainz' )
end
--Returns the ISNI check digit isni must be a string where the 15 first elements are digits
function p.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
--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 p.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 p.getIsniCheckDigit( id ) ~= string.char( id:byte( 16 ) ) then
return false
end
return id
end
function p.isniLink( id )
id = p.validateIsni( id )
if not id then
return false
end
return '[http://isni.org/isni/' .. id .. ' ' .. id:sub( 1, 4 ) .. ' ' .. id:sub( 5, 8 ) .. ' ' .. id:sub( 9, 12 ) .. ' ' .. id:sub( 13, 16 ) .. ']' .. p.getCatForId( 'ISNI' )
end
function p.orcidLink( id )
id = p.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 '[https://orcid.org/' .. id .. ' ' .. id .. ']' .. p.getCatForId( 'ORCID' )
end
function p.gndLink( id )
return '[https://d-nb.info/gnd/' .. id .. ' ' .. id .. ']' .. p.getCatForId( 'GND' )
end
function p.selibrLink( id )
if not string.match( id, '^%d+$' ) then
return false
end
return '[https://libris.kb.se/auth/' .. id .. ' ' .. id .. ']' .. p.getCatForId( 'SELIBR' )
end
function p.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 .. '] [http://data.bnf.fr/ark:/12148/' .. id .. ' (data)]' .. p.getCatForId( 'BNF' )
end
function p.bpnLink( id )
if not string.match( id, '^%d+$' ) then
return false
end
return '[http://www.biografischportaal.nl/en/persoon/' .. id .. ' ' .. id .. ']' .. p.getCatForId( 'BPN' )
end
function p.ridLink( id )
return '[https://www.researcherid.com/rid/' .. id .. ' ' .. id .. ']' .. p.getCatForId( 'RID' )
end
function p.bibsysLink( id )
return '[https://authority.bibsys.no/authority/rest/authorities/html/' .. id .. ' ' .. id .. ']' .. p.getCatForId( 'BIBSYS' )
end
function p.ulanLink( id )
return '[https://www.getty.edu/vow/ULANFullDisplay?find=&role=&nation=&subjectid=' .. id .. ' ' .. id .. ']' .. p.getCatForId( 'ULAN' )
end
function p.nlaLink( id )
return '[https://nla.gov.au/anbd.aut-an' .. id .. ' ' .. id .. ']' .. p.getCatForId( 'NLA' )
end
function p.rkdartistsLink( id )
return '[https://rkd.nl/en/explore/artists/' .. id .. ' ' .. id .. ']' .. p.getCatForId( 'RKDartists' )
end
function p.snacLink( id )
return '[http://socialarchive.iath.virginia.edu/ark:/99166/' .. id .. ' ' .. id .. ']' .. p.getCatForId( 'SNAC-ID' )
end
function p.dblpLink( id )
return '[https://dblp.org/pid/' .. id .. ' ' .. id .. ']' .. p.getCatForId( 'DBLP' )
end
function p.acmLink( id )
return '[https://dl.acm.org/author_page.cfm?id=' .. id .. ' ' .. id .. ']' .. p.getCatForId( 'ACM-DL' )
end
function p.autoresuyLink( id )
return '[http://autores.uy/autor/' .. id .. ' ' .. id .. ']' .. p.getCatForId( 'autores.uy' )
end
function p.picLink( id )
return '[https://pic.nypl.org/constituents/' .. id .. ' ' .. id .. ']' .. p.getCatForId( 'PIC' )
end
function p.getIdsFromWikidata( itemId, property )
local ids = {}
local statements = mw.wikibase.getBestStatements( itemId, property )
if statements then
for _, statement in ipairs( statements ) do
if statement.mainsnak.datavalue then
table.insert( ids, statement.mainsnak.datavalue.value )
end
end
end
return ids
end
function p.matchesWikidataRequirements( itemId, reqs )
for _, group in ipairs( reqs ) do
local property = 'P' .. group[1]
local qid = group[2]
local statements = mw.wikibase.getBestStatements( itemId, property )
if statements ~= nil then
for _, statement in ipairs( statements ) 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 p.createRow( id, label, rawValue, link, withUid )
if link then
if withUid then
return '*<span class="nowrap">' .. label .. ' <span class="uid">' .. link .. '</span></span>\n'
end
return '*<span class="nowrap">' .. label .. ' ' .. link .. '</span>\n'
end
return '* <span class="error">The ' .. id .. ' id ' .. rawValue .. ' is not valid.</span>[[Category:Wikipedia articles with faulty authority control identifiers (' .. id .. ')]]\n'
end
-- Check that the Wikidata item has this property-->value before adding it
local reqs = {}
--In this order: name of the parameter, label, propertyId in Wikidata, formatting function
p.conf = {
{ 'VIAF', '[[Virtual International Authority File|VIAF]]', 214, p.viafLink },
{ 'LCCN', '[[Library of Congress Control Number|LCCN]]', 244, p.lccnLink },
{ 'ISNI', '[[International Standard Name Identifier|ISNI]]', 213, p.isniLink },
{ 'ORCID', '[[ORCID]]', 496, p.orcidLink },
{ 'GND', '[[Integrated Authority File|GND]]', 227, p.gndLink },
{ 'SELIBR', '[[LIBRIS|SELIBR]]', 906, p.selibrLink },
{ 'SUDOC', '[[Système universitaire de documentation|SUDOC]]', 269, p.sudocLink },
{ 'BNF', '[[Bibliothèque nationale de France|BNF]]', 268, p.bnfLink },
{ 'BPN', '[[Biografisch Portaal|BPN]]', 651, p.bpnLink },
{ 'RID', '[[ResearcherID]]', 1053, p.ridLink },
{ 'BIBSYS', '[[BIBSYS]]', 1015, p.bibsysLink },
{ 'ULAN', '[[Union List of Artist Names|ULAN]]', 245, p.ulanLink },
{ 'HDS', '[[Historical Dictionary of Switzerland|HDS]]', 902, p.hlsLink },
{ 'LIR', '[[Historical Dictionary of Switzerland#Lexicon_Istoric_Retic|LIR]]', 886, p.lirLink },
{ 'MBA', '[[MusicBrainz]]', 434, p.mbLink },
{ 'MGP', '[[Mathematics Genealogy Project|MGP]]', 549, p.mgpLink },
{ 'NLA', '[[National Library of Australia|NLA]]', 409, p.nlaLink },
{ 'NDL', '[[National Diet Library|NDL]]', 349, p.ndlLink },
{ 'NCL', '[[National Central Library|NCL]]', 1048, p.nclLink },
{ 'NKC', '[[National Library of the Czech Republic|NKC]]', 691, p.nkcLink },
{ 'Léonore', '[[Base Léonore|Léonore]]', 640, p.leonoreLink },
{ 'SBN', '[[Istituto Centrale per il Catalogo Unico|ICCU]]', 396, p.sbnLink },
{ 'RLS', '[[Russian State Library|RLS]]', 947, p.rslLink },
{ 'Botanist', '[[Author citation (botany)|Botanist]]', 428, p.botanistLink },
{ 'NARA-person', '[[National Archives and Records Administration|NARA]]', 1222, p.narapersonLink },
{ 'NARA-organization', '[[National Archives and Records Administration|NARA]]', 1223, p.naraorganizationLink },
{ 'USCongress', '[[Biographical Directory of the United States Congress|US Congress]]', 1157, p.uscongressLink },
{ 'BNE', '[[Biblioteca Nacional de España|BNE]]', 950, p.bneLink },
{ 'CINII', '[[CiNii]]', 271, p.ciniiLink },
{ 'TLS', '[[Theaterlexikon der Schweiz|TLS]]', 1362, p.tlsLink },
{ 'SIKART', '[[SIKART]]', 781, p.sikartLink },
{ 'KULTURNAV', '[[KulturNav]]', 1248, p.kulturnavLink },
{ 'RKDartists', '[[Netherlands Institute for Art History#Online artist pages|RKD]]', 650, p.rkdartistsLink },
{ 'SNAC-ID', '[[SNAC]]', 3430, p.snacLink },
{ 'DBLP', '[[DBLP]]', 2456, p.dblpLink },
{ 'ACM-DL', '[[ACM Digital Library|ACM DL]]', 864, p.acmLink },
{ 'autores.uy', '[[autores.uy]]', 2558, p.autoresuyLink },
{ 'PIC', '[[:d:Q23892012|PIC]]', 2750, p.picLink },
}
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 itemId = mw.wikibase.getEntityIdForCurrentPage()
if itemId ~= nil then
for _, params in ipairs( p.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 = p.matchesWikidataRequirements( itemId, reqs[params[1]] )
else
canUseWikidata = true
end
if canUseWikidata then
local wikidataIds = p.getIdsFromWikidata( itemId, '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'], '[https://www.worldcat.org/identities/' .. parentArgs['WORLDCATID'] .. ' WorldCat Identities]', false ) ) --Validation?
elseif parentArgs['VIAF'] and string.match( parentArgs['VIAF'], '^%d+$' ) then -- Hackishly copy the validation code; this should go away when we move to using P1793 and P1630
table.insert( elements, createRow( 'VIAF', '', parentArgs['VIAF'], '[https://www.worldcat.org/identities/containsVIAFID/' .. parentArgs['VIAF'] .. ' WorldCat Identities]', false ) )
elseif parentArgs['LCCN'] and parentArgs['LCCN'] ~= '' then
local lccnParts = splitLccn( parentArgs['LCCN'] )
if lccnParts and lccnParts[1] ~= 'sh' then
table.insert( elements, createRow( 'LCCN', '', parentArgs['LCCN'], '[https://www.worldcat.org/identities/lccn-' .. lccnParts[1] .. lccnParts[2] .. '-' .. lccnParts[3] .. ' WorldCat Identities]', false ) )
end
end
--Configured rows
local rct = 0
for _, params in ipairs( p.conf ) do
local val = parentArgs[params[1]]
if val and val ~= '' then
table.insert( elements, p.createRow( params[1], params[2] .. ':', val, params[4]( val ), true ) )
rct = rct + 1
end
end
local Navbox = require('Module:Navbox')
local elementscats = ''
if rct > 13 then
elementscats = '[[Category:AC with ' .. rct .. ' elements]]'
end
if #elements ~= 0 then
return Navbox._navbox( {
name = 'Authority control',
bodyclass = 'hlist',
group1 = '[[Help:Authority control|Authority control]]' .. elementscats,
list1 = table.concat( elements )
} )
end
return ""
end
return p