Difference between revisions of "Module:Authority control"

From Betting Wiki
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
  
local function viafLink( id )
+
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
  
local function kulturnavLink( id )
+
function p.kulturnavLink( id )
 
return '[http://kulturnav.org/' .. id .. ' ' .. id .. ']'
 
return '[http://kulturnav.org/' .. id .. ' ' .. id .. ']'
 
end
 
end
  
local function sikartLink( id )
+
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
  
local function tlsLink( id )
+
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
  
local function ciniiLink( id )
+
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
  
local function bneLink( id )
+
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
  
local function uscongressLink( id )
+
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
  
local function narapersonLink( id )
+
function p.narapersonLink( id )
 
return '[https://research.archives.gov/person/' .. id .. ' ' .. id .. ']'
 
return '[https://research.archives.gov/person/' .. id .. ' ' .. id .. ']'
 
end
 
end
  
local function naraorganizationLink( id )
+
function p.naraorganizationLink( id )
 
return '[https://research.archives.gov/organization/' .. id .. ' ' .. id .. ']'
 
return '[https://research.archives.gov/organization/' .. id .. ' ' .. id .. ']'
 
end
 
end
  
local function botanistLink( id )
+
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
  
local function mgpLink( id )
+
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
  
local function rslLink( id )
+
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
  
local function leonoreLink( id )
+
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
  
local function sbnLink( id )
+
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
  
local function nkcLink( id )
+
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
  
local function nclLink( id )
+
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
  
local function ndlLink( id )
+
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
  
local function sudocLink( id )
+
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
  
local function hlsLink( id )
+
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
  
local function lirLink( id )
+
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
  
local function splitLccn( id )
+
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
  
local function append(str, c, length)
+
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
  
local function lccnLink( id )
+
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
  
local function mbLink( id )
+
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
local function getIsniCheckDigit( isni )
+
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
local function validateIsni( id )
+
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
  
local function isniLink( id )
+
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
  
local function orcidLink( id )
+
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
  
local function gndLink( id )
+
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
  
local function selibrLink( id )
+
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
  
local function bnfLink( id )
+
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
  
local function bpnLink( id )
+
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
  
local function ridLink( id )
+
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
  
local function bibsysLink( id )
+
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
  
local function ulanLink( id )
+
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
  
local function nlaLink( id )
+
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
  
local function rkdartistsLink( id )
+
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
  
local function snacLink( id )
+
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
  
local function dblpLink( id )
+
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
  
local function acmLink( id )
+
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
  
local function autoresuyLink( id )
+
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
  
local function picLink( id )
+
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
  
local function getIdsFromWikidata( itemId, property )
+
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
  
local function matchesWikidataRequirements( itemId, reqs )
+
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
  
local function createRow( id, label, rawValue, link, withUid )
+
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'
else
 
return '*<span class="nowrap">' .. label .. ' ' .. link .. '</span>\n'
 
 
end
 
end
else
+
 
return '* <span class="error">The ' .. id .. ' id ' .. rawValue .. ' is not valid.</span>[[Category:Wikipedia articles with faulty authority control identifiers (' .. id .. ')]]\n'
+
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
 
--In this order: name of the parameter, label, propertyId in Wikidata, formatting function
 
local conf = {
 
{ 'VIAF', '[[Virtual International Authority File|VIAF]]', 214, viafLink },
 
{ 'LCCN', '[[Library of Congress Control Number|LCCN]]', 244, lccnLink },
 
{ 'ISNI', '[[International Standard Name Identifier|ISNI]]', 213, isniLink },
 
{ 'ORCID', '[[ORCID]]', 496, orcidLink },
 
{ 'GND', '[[Integrated Authority File|GND]]', 227, gndLink },
 
{ 'SELIBR', '[[LIBRIS|SELIBR]]', 906, selibrLink },
 
{ 'SUDOC', '[[Système universitaire de documentation|SUDOC]]', 269, sudocLink },
 
{ 'BNF', '[[Bibliothèque nationale de France|BNF]]', 268, bnfLink },
 
{ 'BPN', '[[Biografisch Portaal|BPN]]', 651, bpnLink },
 
{ 'RID', '[[ResearcherID]]', 1053, ridLink },
 
{ 'BIBSYS', '[[BIBSYS]]', 1015, bibsysLink },
 
{ 'ULAN', '[[Union List of Artist Names|ULAN]]', 245, ulanLink },
 
{ 'HDS', '[[Historical Dictionary of Switzerland|HDS]]', 902, hlsLink },
 
{ 'LIR', '[[Historical Dictionary of Switzerland#Lexicon_Istoric_Retic|LIR]]', 886, lirLink },
 
{ 'MBA', '[[MusicBrainz]]', 434, mbLink },
 
{ 'MGP', '[[Mathematics Genealogy Project|MGP]]', 549, mgpLink },
 
{ 'NLA', '[[National Library of Australia|NLA]]', 409, nlaLink },
 
{ 'NDL', '[[National Diet Library|NDL]]', 349, ndlLink },
 
{ 'NCL', '[[National Central Library|NCL]]', 1048, nclLink },
 
{ 'NKC', '[[National Library of the Czech Republic|NKC]]', 691, nkcLink },
 
{ 'Léonore', '[[Base Léonore|Léonore]]', 640, leonoreLink },
 
{ 'SBN', '[[Istituto Centrale per il Catalogo Unico|ICCU]]', 396, sbnLink },
 
{ 'RLS', '[[Russian State Library|RLS]]', 947, rslLink },
 
{ 'Botanist', '[[Author citation (botany)|Botanist]]', 428, botanistLink },
 
{ 'NARA-person', '[[National Archives and Records Administration|NARA]]', 1222, narapersonLink },
 
{ 'NARA-organization', '[[National Archives and Records Administration|NARA]]', 1223, naraorganizationLink },
 
{ 'USCongress', '[[Biographical Directory of the United States Congress|US Congress]]', 1157, uscongressLink },
 
{ 'BNE', '[[Biblioteca Nacional de España|BNE]]', 950, bneLink },
 
{ 'CINII', '[[CiNii]]', 271, ciniiLink },
 
{ 'TLS', '[[Theaterlexikon der Schweiz|TLS]]', 1362, tlsLink },
 
{ 'SIKART', '[[SIKART]]', 781, sikartLink },
 
{ 'KULTURNAV', '[[KulturNav]]', 1248, kulturnavLink },
 
{ 'RKDartists', '[[Netherlands Institute for Art History#Online artist pages|RKD]]', 650, rkdartistsLink },
 
{ 'SNAC-ID', '[[SNAC]]', 3430, snacLink },
 
{ 'DBLP', '[[DBLP]]', 2456, dblpLink },
 
{ 'ACM-DL', '[[ACM Digital Library|ACM DL]]', 864, acmLink },
 
{ 'autores.uy', '[[autores.uy]]', 2558, autoresuyLink },
 
{ 'PIC', '[[:d:Q23892012|PIC]]', 2750, picLink },
 
}
 
  
 
-- 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 = {}
  
local p = {}
+
--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 )
 
} )
 
} )
else
 
return ""
 
 
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