Module:Authority control

From Wikisource
Jump to: navigation, search
Documentation icon Module documentation[view] [edit] [history] [purge]

Usage[edit]

This module is used by the template {{authority control}} to access authority control data from Wikidata.

Adding additional items[edit]

Step one — formatting function[edit]

Add a new function to the module with the following format:

function fooLink( id )
        return '[http://bar.com/baz' .. id .. ' ' .. id .. ']' .. getCatForId( 'FOO' )
end

Where:

  • fooLink is the name of the function, which will be used in step two. It won't affect the performance of this module but the naming scheme for these functions is a camel case concatenation of the name of the authority control and the work "Link".
  • http://bar.com/baz is the URL of the authority control website (if it has one) up to the point of the ID number. This format assumes that the URL ends with the ID number. If not the case, the remaining URL should be added after the first "id"; i.e. at the foo in
    ' .. id .. 'foo ' .. id .. ']'
  • FOO is the name of the parameter used if automatic categories are to be added (currently this is only used in the User namespace). The naming scheme uses the name of the authority control in uppercase.

Step two — list[edit]

In the list under the title "List of displayed authority control IDs", add a new line in the following format:

{ 'FOO', '[[w:BAR|BAZ]]', nnn, fooLink },

Where:

  • FOO is the name of the parameter used for manual input via the template. The naming scheme uses the name of the authority control in uppercase.
  • BAR is the page name of a page on Wikipedia corresponding to this authority control, to explain it to a curious user.
  • BAZ is the visible text displayed before the ID number in the authority control template. It will often be the same as FOO.
    • The whole [[w:BAR|BAZ]] element is just the wikilink text that precedes the ID number in the authority control template; it can be replaced with text that would normally work as wikitext. If there is no page to which to link on Wikipedia, the entire element can be replaced with just BAZ.
  • nnn is the number of the corresponding property on wikidata. For example, "VIAF identifier" on Wikidata is P214, in which case the number 214 should be entered here.
  • fooLink is the name of the function that formats the link. It should match the name used in step one.

Notes[edit]

  • The order of the lines under "List of displayed authority control IDs" is also the order in which they appear in the template.

WorldCat[edit]

The WorldCat link can be generated in different ways. The manual parameter WORLDCATID overrides everything else. If that has not been used, a single link will be automatically generated if any of the following are present, in order of precedence: LCCN (library of Congress authority file number), VIAF, or OCLC. The latter would be a reference number to a work rather than an author. If none of the above is available, either through manual entry or held on Wikidata, no WorldCat link will be generated.

Wikisource links[edit]

Wikidata links[edit]

function getCatForId( id )
    local title = mw.title.getCurrentTitle()
    local namespace = title.namespace
    if namespace == 0 then
        return '[[Category:Main pages with authority control data]]'
    elseif namespace == 2 and not title.isSubpage then
        return '[[Category:User pages with ' .. id .. ' identifiers]]'
    elseif namespace == 100 and not title.isSubpage then
        return '[[Category:Portal pages with authority control data]]'
    elseif namespace == 102 and not title.isSubpage then
        return '[[Category:Author pages with authority control data]]'
    else
        return '[[Category:Miscellaneous pages with authority control data]]'
    end
end

-- ** Author related authority controls follow **

function viafLink( id )
    if not string.match( id, '^%d+$' ) then
        return false
    end
    return '[http://viaf.org/viaf/' .. id .. ' ' .. id .. ']' .. getCatForId( 'VIAF' )
end

function nkcLink( id )
	return '[http://aleph.nkp.cz/F/?func=find-c&local_base=aut&ccl_term=ica=' .. id .. '&CON_LNG=ENG ' .. id .. ']' 
end

function 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 ndlLink( id )
	return '[http://id.ndl.go.jp/auth/ndlna/' .. id .. ' ' .. id .. ']' 
end

function sudocLink( id )
    if not string.match( id, '^%d%d%d%d%d%d%d%d[%dxX]$' ) then
        return false
    end
    return '[http://www.idref.fr/' .. id .. ' ' .. id .. ']' 
end

function 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 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 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 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.org/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 https://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 '[https://orcid.org/' .. id .. ' ' .. id .. ']' .. getCatForId( 'ORCID' )
end

function gndLink( id )
    return '[http://d-nb.info/gnd/' .. id .. ' ' .. id .. ']' .. getCatForId( 'GND' )
end

function BanglapediaEnglishLink( id )
    return '[http://en.banglapedia.org/index.php?title=' .. id .. ' ' .. id .. ']' .. getCatForId( 'Banglapedia' )
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 mbLink( id )
    -- TODO Implement some sanity checking regex
    return '[//musicbrainz.org/artist/' .. id .. ' ' .. id .. ']' .. getCatForId( 'MusicBrainz' )
end

function calisLink( id )
	return '[http://opac.calis.edu.cn/aopac/ajsp/detail.jsp?actionfrom=1&actl=CAL++' .. id .. ' ' .. id .. ']' .. getCatForId( 'CALIS' )
end

function ciniiLink( id )
	return '[http://ci.nii.ac.jp/author/' .. id .. ' ' .. id .. ']' .. getCatForId( 'CiNii' )
end

function sbnLink( id )
	return '[http://id.sbn.it/af/' .. id .. ' ' .. id .. ']' .. getCatForId( 'SBN' )
end

function cbdbLink( id )
	return '[http://db1.ihp.sinica.edu.tw/cbdbc/cbdbkmeng?~~AAA' .. id .. ' ' .. id .. ']' .. getCatForId( 'CBDB' )
end

function leonoreLink( id )
	return '[http://www.culture.gouv.fr/public/mistral/leonore_fr?ACTION=CHERCHER&FIELD_1=COTE&VALUE_1=' .. id .. ' ' .. id .. ']' .. getCatForId( 'Léonore' )
end

function dbnlLink( id )
	return '[http://www.dbnl.org/auteurs/auteur.php?id=' .. id .. ' ' .. id .. ']' .. getCatForId( 'DBNL' )
end

function rslLink( id )
	return '[http://aleph.rsl.ru/F?func=find-b&find_code=SYS&adjacent=Y&local_base=RSL11&request=' .. id .. ' ' .. id .. ']' .. getCatForId( 'RSL' )
end

function ptbnpLink( id )
	return '[http://purl.pt/index/geral/aut/PT/' .. id .. '.html ' .. id .. ']' .. getCatForId( 'PTBNP' )
end

function ntaLink( id )
	-- Nationale Thesaurus Auteursnamen, Koninklijke Bibliotheek
	return '[http://data.bibliotheken.nl/doc/thes/p' .. id .. ' ' .. id .. ']' .. getCatForId( 'NTA' )
end

function bavLink( id )
	return id .. getCatForId( 'BAV' )
	-- there may not be an online catalogue for the Vatican Library (Wikidata is not currently linking to anything)
end

function nliLink( id )
	return '[http://a20.libnet.ac.il/F?func=find-b&REQUEST=' .. id .. '&find_code=SYS&local_base=NNL10 ' .. id .. ']' .. getCatForId( 'NLI' )
end

function nlcLink( id )
	return '[http://opac.nlc.gov.cn/F/?func=accref&acc_sequence=' .. id .. ' ' .. id .. ']' .. getCatForId( 'NLC' )
end

function nukatLink( id )
	return id .. getCatForId( 'NUKAT' )
	-- linking format not currently available on Wikidata and cannot find anything suitable as http://www.nukat.edu.pl/
end

function botanistLink( id )
	id2 = mw.ustring.gsub(id, '%s', function(s) return mw.uri.encode(s, 'PATH') end)
    return '[http://www.ipni.org/ipni/advAuthorSearch.do?find_abbreviation=' .. id2 .. ' ' .. id .. ']' .. getCatForId( 'IPNI' )
end

function naraIdLink( id )
	return '[http://research.archives.gov/person/' .. id .. ' ' .. id .. ']' .. getCatForId( 'NARA' )
end

function ibdbLink( id )
	return '[http://www.ibdb.com/person.php?id=' .. id .. ' ' .. id .. ']' .. getCatForId( 'IBDB' )
end

function isfdbIdLink( id )
	return '[http://www.isfdb.org/cgi-bin/ea.cgi?' .. id .. ' ' .. id .. ']' .. getCatForId( 'ISFDB' )
end

function findGraveLink( id )
	return '[http://www.findagrave.com/cgi-bin/fg.cgi?page=gr&GRid=' .. id .. ' ' .. id .. ']' .. getCatForId( 'Find a Grave' )
end

function mgpLink( id )
	return '[http://genealogy.math.ndsu.nodak.edu/id.php?id=' .. id .. ' ' .. id .. ']' .. getCatForId( 'MGP' )
end

function rkdLink( id )
	return '[http://explore.rkd.nl/nl/artists/' .. id .. ' ' .. id .. ']' .. getCatForId( 'RKD' )
end

function bneLink( id )
	return '[http://catalogo.bne.es/uhtbin/authoritybrowse.cgi?action=display&authority_id=' .. id .. ' ' .. id .. ']' .. getCatForId( 'BNE' )
end

function nlrLink( id )
	return '[http://alephnew.bibnat.ro:8991/F?func=find-b&request=' .. id .. '&find_code=SYS&adjacent=Y&local_base=NLR10 ' .. id .. ']' .. getCatForId( 'NLR' )
end

function chLink( id )
	-- Catholic Hierarchy (database of bishops)
	return '[http://www.catholic-hierarchy.org/bishop/b' .. id .. '.html ' .. id .. ']' .. getCatForId( 'Catholic Hierarchy' )
end

function sycomoreLink( id )
	return '[http://www.assemblee-nationale.fr/sycomore/fiche.asp?num_dept=' .. id .. ' ' .. id .. ']' .. getCatForId( 'Sycomore' )
end

function uscongressLink( id )
    return '[http://bioguide.congress.gov/scripts/biodisplay.pl?index=' .. id .. ' ' .. id .. ']' 
end

function kulturnavLink( id )
    return '[http://kulturnav.org/language/en/' .. id .. ' id]' 
end
 
function sikartLink( id )
    return '[http://www.sikart.ch/KuenstlerInnen.aspx?id=' .. id .. '&lng=en ' .. id .. ']' 
end
 
function tlsLink( id )
	id2 = mw.ustring.gsub(id, '%s', function(s) return mw.uri.encode(s, 'WIKI') end)
    return '[http://tls.theaterwissenschaft.ch/wiki/' .. id2 .. ' ' .. id .. ']' 
end

function PrdlLink( id )
	return '[http://prdl.org/author_view.php?a_id=' .. id .. ' ' .. id .. ']' 
end

function NupillALink( id )
	return '[http://www.literaturabrasileira.ufsc.br/autores/?id=' .. id .. ' ' .. id .. ']' 
end

function MacTutorBLink( id )
	return '[http://www-history.mcs.st-andrews.ac.uk/Biographies/' .. id .. '.html ' .. id .. ']' 
end

function AtclLink( id )
	return '[http://www.victorianresearch.org/atcl/show_author.php?aid=' .. id .. ' ' .. id .. ']' 
end

function ElemLink( id )
	return '[http://www.elem.mx/autor/datos/' .. id .. ' ' .. id .. ']' 
end

function ImslpLink( id )
	id2 = mw.ustring.gsub(id, '%s', function(s) return mw.uri.encode(s, 'WIKI') end)
    return '[http://imslp.org/wiki/' .. id2 .. ' ' .. id .. ']' 
end

function OdnbLink( id )
	return '[http://www.oxforddnb.com/index/' .. id .. '/ ' .. id .. ']' 
end

function GecLink( id )
	return '[http://www.enciclopedia.cat/enciclop%C3%A8dies/gran-enciclop%C3%A8dia-catalana/EC-GEC-' .. id .. '.xml ' .. id .. ']' 
end

-- ** Subject related or general authority controls follow **

function imdbLink( id )
	return '[http://www.imdb.com/Name?' .. id .. ' ' .. id .. ']' .. getCatForId( 'IMDB' )
end

function freebaseLink( id )
	return '[http://www.freebase.com' .. id .. ' ' .. id .. ']' .. getCatForId( 'Freebase' )
end

function naraOrgLink( id )
	return '[http://research.archives.gov/organization/' .. id .. ' ' .. id .. ']' .. getCatForId( 'NARA' )
end

function naraGeoLink( id )
	return '[http://research.archives.gov/geographic-reference/' .. id .. ' ' .. id .. ']' .. getCatForId( 'NARA' )
end

function naraSubLink( id )
	return '[http://research.archives.gov/topical-subject/' .. id .. ' ' .. id .. ']' .. getCatForId( 'NARA' )
end

function naraTypeLink( id )
	return '[http://research.archives.gov/specific-records-type/' .. id .. ' ' .. id .. ']' .. getCatForId( 'NARA' )
end

function isfdbPubLink( id )
	return '[http://www.isfdb.org/cgi-bin/publisher.cgi?' .. id .. ' ' .. id .. ']' .. getCatForId( 'ISFDB' )
end

function isfdbConLink( id )
	return '[http://www.isfdb.org/cgi-bin/pl.cgi?' .. id .. ' ' .. id .. ']' .. getCatForId( 'ISFDB' )
end

function lembpLink( id )
	--Lista de Encabezamientos de materia para las Bibliotecas Públicas = List of Subject Headings for Public Libraries (Spanish)
	return '[http://id.sgcb.mcu.es/lem/ver/Autoridades/' .. id .. '/concept ' .. id .. ']' .. getCatForId( 'LEMBP' )
end

function ddcLink( id )
	return '[http://dewey.info/class/' .. id .. '/about ' .. id .. ']' .. getCatForId( 'DDC' )
end

function libriVoxAuthorLink( id )
        return '[https://librivox.org/author/' .. id .. ' ' .. id .. ']' .. getCatForId( 'LVA' )
end

function GutenbergLink( id )
	return '[https://www.gutenberg.org/ebooks/author/' .. id .. ' ' .. id .. ']' .. getCatForId( 'Gutenberg' )
end



-- ** Book and work related authority controls follow **

function isbnLink( id )
	return '[[Special:BookSources/' .. id .. '|' .. id .. ']]' .. getCatForId( 'ISBN' )
	-- ISBN currently only reads ISBN-13 numbers from Wikidata and ignores ISBN-10 numbers
end

function oclcLink( id )
	return '[http://www.worldcat.org/oclc/' .. id .. '?lang=en ' .. id .. ']' .. getCatForId( 'OCLC' )
end

function openLibLink( id )
	return '[http://openlibrary.org/books/' .. id .. ' ' .. id .. ']' .. getCatForId( 'Open Library' )
end

function libraryThingLink( id )
	return '[http://www.librarything.com/work/' .. id .. ' ' .. id .. ']' .. getCatForId( 'LibraryThing' )
end

function archiveLink( id )
	return '[http://www.archive.org/details/' .. id .. ' ' .. id .. ']' .. getCatForId( 'Internet Archive' )
end

function gutenbergebookLink( id )
	return '[http://www.gutenberg.org/ebooks/' .. id .. ' ' .. id .. ']' .. getCatForId( 'Project Gutenberg' )
end

function europeanaLink( id )
	return '[http://www.europeana.eu/portal/record/' .. id .. '.html ' .. id .. ']' .. getCatForId( 'Europeana' )
end

function lccnBibliographicLink( id )
	return '[http://lccn.loc.gov/' .. id .. ' ' .. id .. ']' .. getCatForId( 'LCCN (bibliographic)' )
end

function googleBooksLink( id )
	return '[http://books.google.com/books?id=' .. id .. ' ' .. id .. ']' .. getCatForId( 'Google Books' )
end

function ndlBibliographicLink( id )
	return '[http://iss.ndl.go.jp/books?op_id=1&any=' .. id .. ' ' .. id .. ']' .. getCatForId( 'NDL (bibliographic)' )
end

function issnLink( id )
	return '[http://www.worldcat.org/search?fq=x0:jrnl&q=n2:' .. id .. ' ' .. id .. ']' .. getCatForId( 'ISSN' )
end

function doiLink( id )
	return '[http://dx.doi.org/' .. id .. ' ' .. id .. ']' .. getCatForId( 'DOI' )
end

function eraLink( id )
	return '[http://lamp.infosys.deakin.edu.au/era/?page=jnamedet12f&eraid=' .. id .. ' ' .. id .. ']' .. getCatForId( 'ERA' )
end

function ismnLink( id )
	return id .. getCatForId( 'ISMN' )
	-- no link currently available for ISMN on Wikidata and none found elsewhere
end

function isfdbBookLink( id )
	return '[http://www.isfdb.org/cgi-bin/title.cgi?' .. id .. ' ' .. id .. ']' .. getCatForId( 'ISFDB' )
end

function isfdbSerLink( id )
	return '[http://www.isfdb.org/cgi-bin/pe.cgi?' .. id .. ' ' .. id .. ']' .. getCatForId( 'ISFDB' )
end

function sudocBibliographicLink( id )
	return '[http://www.sudoc.fr/' .. id .. ' ' .. id .. ']' .. getCatForId( 'SUDOC' )
end

function swbLink( id )
	-- South-West German Library Network
	return '[http://swb.bsz-bw.de/DB=2.1/PPNSET?PPN=' .. id .. '&INDEXSET=1 ' .. id .. ']' .. getCatForId( 'SWB' )
end

function zdbLink( id )
	-- Zeitschriftendatenbank
	return '[http://dispatch.opac.d-nb.de/DB=1.1/CMD?ACT=SRCHA&IKT=8506&TRM=' .. id .. ' ' .. id .. ']' .. getCatForId( 'ZDB' )
end

function nlmLink( id )
	return '[http://locatorplus.gov/cgi-bin/Pwebrecon.cgi?DB=local&v1=1&ti=1,1&Search_Arg=' .. id .. '&Search_Code=0359&CNT=20&SID=1 ' ..id .. ']' .. getCatForId( 'NLM' )
end

function selibrBibliographicLink( id )
	return '[http://libris.kb.se/bib/' .. id .. ' ' .. id .. ']' .. getCatForId( 'SELIBR' )
end

function dliLink( id )
	return '[http://dli.gov.in/cgi-bin/DBscripts/allmetainfo.cgi?barcode=' .. id .. ' ' .. id .. ']' .. getCatForId( 'DLI' )
end

function hathitrustLink( id )
	return '[http://catalog.hathitrust.org/Record/' .. id .. ' ' .. id .. ']' .. getCatForId( 'HathiTrust' )
end

-- Entry for Wikisource using 'wgArticleID' as an authority. Should always be last

function wksLink( id )
    if id and wksid ~= '' then
	return false
    end
    return '[//en.wikisource.org/w/index.php?curid=' .. id .. ' ' .. id .. ']' .. getCatForId( 'WKS' )
end

-- End of authority control link formatting functions

function getIdsFromWikidata( item, property )
    local ids = {}
    if not item.claims[property] then
        return ids
    end
    for _, statement in pairs( item:getBestStatements( property ) ) do
		if statement.mainsnak.datavalue then
			table.insert( ids, statement.mainsnak.datavalue.value )
		end
    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 .. '&#160;<span class="uid plainlinks">' .. link .. '</span>\n'
        else
            return '* ' .. label .. '&#160;<span class="plainlinks">' .. link .. '</span>\n'
        end
    else
        return '* <span class="error">The ' .. id .. ' id ' .. rawValue .. ' is not valid.</span>[[Category:Wikisource articles with faulty authority control identifiers]]\n'
    end
end

-- *** List of displayed authority control IDs ***
-- Authority controls will appear in the same order as the list below
--In this order: { name of the parameter, label, propertyId in Wikidata, formatting function },
local conf = {
    { 'VIAF', '[[w:Virtual International Authority File|VIAF]]', 214, viafLink },
    { 'LCCN', '[[w:Library of Congress Control Number|LCCN]]', 244, lccnLink },
    { 'ISNI', '[[w:International Standard Name Identifier|ISNI]]', 213, isniLink },
    { 'ORCID', '[[w:ORCID|ORCID]]', 496, orcidLink },
    { 'GND', '[[w:Integrated Authority File|GND]]', 227, gndLink },
    { 'Banglapedia', '[[w:Banglapedia|Banglapedia]]', 4255, BanglapediaEnglishLink },
    { 'SELIBR', '[[w:LIBRIS|SELIBR]]', 906, selibrLink },
    { 'SUDOC', '[[w:Système universitaire de documentation|SUDOC]]', 269, sudocLink },
    { 'BNF', '[[w:Bibliothèque nationale de France|BNF]]', 268, bnfLink },
    { 'BPN', '[[w:Biografisch Portaal|BPN]]', 651, bpnLink },
    { 'RID', '[[w:ResearcherID|ResearcherID]]', 1053, ridLink },
    { 'BIBSYS', '[[w:BIBSYS|BIBSYS]]', 1015, bibsysLink },
    { 'ULAN', '[[w:Union List of Artist Names|ULAN]]', 245, ulanLink },
    { 'HDS', '[[w:Historical Dictionary of Switzerland|HDS]]', 902, hlsLink },
    { 'LIR', '[[w:Historical Dictionary of Switzerland#Lexicon_Istoric_Retic|LIR]]', 886, lirLink },
    { 'MBA', '[[w:MusicBrainz|MusicBrainz]]', 434, mbLink },
    { 'NLA', '[[w:National Library of Australia|NLA]]', 409, nlaLink },
    { 'NDL', '[[w:National Diet Library|NDL]]', 349, ndlLink },
    { 'NCL', '[[w:National Central Library|NCL]]', 1048, nclLink },
    { 'NKC', '[[w:National Library of the Czech Republic|NKC]]', 691, nkcLink },
    { 'CALIS', 'CALIS', 270, calisLink },
    { 'CiNii', '[[w:CiNii|CiNii]]', 271, ciniiLink },
    { 'SBN', '[[w:Istituto Centrale per il Catalogo Unico|SBN]]', 396, sbnLink },
    { 'CBDB', 'CBDB', 497, cbdbLink },
    { 'Leonore', '[[w:Legion of Honour|Léonore]]', 640, leonoreLink },
    { 'DBNL', '[[w:Digital Library for Dutch Literature|DBNL]]', 723, dbnlLink },
    { 'RSL', '[[w:Russian State Library|RSL]]', 947, rslLink },
    { 'PTBNP', '[[w:Biblioteca Nacional de Portugal|PTBNP]]', 1005, ptbnpLink },
    { 'NTA', 'NTA', 1006, ntaLink },
    { 'BAV', '[[w:Vatican Library|BAV]]', 1017, bavLink },
    { 'NLI', '[[w:National Library of Israel|NLI]]', 949, nliLink },
    { 'NLC', '[[w:National Library of China|NLC]]', 1213, nlcLink },
    { 'NUKAT', 'NUKAT', 1207, nukatLink },
    { 'Botanist', '[[w:International Plant Names Index|Botanist]]', 428, botanistLink },
    { 'NARAid', '[[w:National Archives and Records Administration|NARA]]', 1222, naraIdLink },
    { 'IBDB', '[[w:Internet Broadway Database|IBDB]]', 1220, ibdbLink },
    { 'ISFDB', '[[w:Internet Speculative Fiction Database|ISFDB]]', 1233, isfdbIdLink },
    { 'LibriVoxAuth', '[[w:LibriVox|LibriVox]]', 1899, libriVoxAuthorLink },
    { 'Gutenberg', '[[w:Project Gutenberg|Project Gutenberg]]', 1938, GutenbergLink },
    { 'Grave', '[[w:Find a Grave|Find a Grave]]', 535, findGraveLink },
    { 'MGP', '[[w:Mathematics Genealogy Project|MGP]]', 549, mgpLink },
    { 'RKD', '[[w:Netherlands Institute for Art History|RKD]]', 650, rkdLink },
    { 'BNE', '[[w:Biblioteca Nacional de España|BNE]]', 950, bneLink },
    { 'NLR', '[[w:National Library of Romania|NLR]]', 1003, nlrLink },
    { 'Sycomore', '[[w:National Assembly (France)|Sycomore]]', 1045, sycomoreLink },
    { 'CH', '[[w:Hierarchy of the Catholic Church|CH]]', 1047, chLink },
    { 'USCongress', '[[w:Biographical Directory of the United States Congress|US Congress]]', 1157, uscongressLink },
    { 'TLS', '[[w:Theaterlexikon der Schweiz|TLS]]', 1362, tlsLink },
    { 'SIKART', '[[w:SIKART|SIKART]]', 781, sikartLink },
    { 'KULTURNAV', 'KulturNav', 1248, kulturnavLink },
    { 'LCCNbook', '[[w:Library of Congress Control Number|LCCN]]', 1144, lccnBibliographicLink },
    { 'OCLC', '[[w:OCLC|OCLC]]', 243, oclcLink },
    { 'ISBN', '[[w:International Standard Book Number|ISBN]]', 212, isbnLink },
    { 'NDLbook', '[[w:National Diet Library|NDL]]', 1054, ndlBibliographicLink },
    { 'ISSN', '[[w:International Standard Serial Number|ISSN]]', 236, issnLink },
    { 'DOI', '[[w:Digital object identifier|DOI]]', 356, doiLink },
    { 'ERA', 'ERA', 1058, eraLink },
    { 'ISMN', '[[w:International Standard Music Number|ISMN]]', 1208, ismnLink },
    { 'SUDOCbook', '[[w:Système universitaire de documentation|SUDOC]]', 1025, sudocBibliographicLink },
    { 'ZDB', 'ZDB', 1042, zdbLink },
    { 'SWB', 'SWB', 1044, swbLink },
    { 'NLM', '[[w:United States National Library of Medicine|NLM]]', 1055, nlmLink },
    { 'SELIBRbook', '[[w:LIBRIS|SELIBR]]', 1182, selibrBibliographicLink },
    { 'ISFDBser', '[[w:Internet Speculative Fiction Database|ISFDB]]', 1235, isfdbSerLink },
    { 'ISFDBcon', '[[w:Internet Speculative Fiction Database|ISFDB]]', 1234, isfdbConLink },
    { 'OL', '[[w:Open Library|Open Library]]', 648, openLibLink },
    { 'ARCHIVE', '[[w:Internet Archive|Internet Archive]]', 724, archiveLink },
    { 'Gutenbergebook', '[[w:Project Gutenberg|Project Gutenberg]]', 2034, gutenbergebookLink },
    { 'DLI', '[[w:Digital Library of India|Digital Library of India]]', 2185, dliLink },
    { 'HathiTrust', '[[w:HathiTrust|HathiTrust]]', 1844, hathitrustLink },
    { 'Google', '[[w:Google Books|Google]]', 675, googleBooksLink },
    { 'Europeana', '[[w:Europeana|Europeana]]', 727, europeanaLink },
    { 'LT', '[[w:LibraryThing|LibraryThing]]', 1085, libraryThingLink },
    { 'Dewey', '[[w:Dewey Decimal Classification|Dewey]]', 1036, ddcLink },
    { 'NARAorg', '[[w:National Archives and Records Administration|NARA]]', 1223, naraOrgLink },
    { 'NARAgeo', '[[w:National Archives and Records Administration|NARA]]', 1224, naraGeoLink },
    { 'NARAsub', '[[w:National Archives and Records Administration|NARA]]', 1225, naraSubLink },
    { 'NARAtype', '[[w:National Archives and Records Administration|NARA]]', 1226, naraTypeLink },
    { 'ISFDBpub', '[[w:Internet Speculative Fiction Database|ISFDB]]', 1239, isfdbPubLink },
    { 'LEMBP', 'LEMBP', 920, lembpLink },
    { 'IMDB', '[[w:Internet Movie Database|IMDB]]', 345, imdbLink },
    { 'Freebase', '[[w:Freebase|Freebase]]', 646, freebaseLink },
    { 'PRDL', '[[w:Post-Reformation Digital Library|PRDL]]', 1463, PrdlLink },
    { 'NUPILL-A', 'NUPILL', 1473, NupillALink },
    { 'MacTutorB', '[[w:MacTutor History of Mathematics archive|MacTutor]]', 1563, MacTutorBLink },
    { 'ATCL', 'ATCL', 1564, AtclLink },
    { 'ELeM', 'ELeM', 1565, ElemLink },
    { 'Imslp', '[[w:International Music Score Library Project|IMSLP]]', 839, ImslpLink },
	{ 'Odnb', '[[w:Oxford Dictionary of National Biography|ODNB]]', 1415, OdnbLink },
    { 'Gec', '[[w:Gran Enciclopèdia Catalana|GEC]]', 1296, GecLink },	
    { 'WKS', '[[Wikisource:Authority control|English Wikisource]]', 0, wksLink },
}

-- 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
    local wksid = frame.args.wksid
    --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

	--en.wikisource backwards compatibility
	--redirect LCCNid to LCCN
    if (parentArgs.LCCN == nil or parentArgs.LCCN == '') and parentArgs.LCCNid ~= nil and parentArgs.LCCNid ~= '' then
        parentArgs.LCCN = parentArgs.LCCNid
    end

    --Wikidata fallback if requested
    local item = mw.wikibase.getEntityObject()
    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

    --Configured rows
    local rct = 0
    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 ) )
            rct = rct + 1
        end
    end

    --Wikisource self reference
    if wksid and wksid ~= '' then
        table.insert( elements, createRow( 'wksid', '', wksid, '[[Wikisource:Authority control|English Wikisource]]: [//en.wikisource.org/w/index.php?curid=' .. wksid .. ' ' .. wksid .. ']', true ) )
    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
    elseif parentArgs['VIAF'] and parentArgs['VIAF'] ~= '' then
    	table.insert( elements, createRow( 'VIAF', '', parentArgs['VIAF'], '[http://www.worldcat.org/identities/viaf-' .. parentArgs['VIAF'] .. ' WorldCat]', false ) )
    elseif parentArgs['OCLC'] and parentArgs['OCLC'] ~= '' then
    	table.insert( elements, createRow( 'OCLC', '', parentArgs['OCLC'], '[http://www.worldcat.org/oclc/' .. parentArgs['OCLC'] .. ' WorldCat]', false ) )
    end

    local Navbox = require('Module:Navbox')
    local elementscats = ''
    return Navbox._navbox( {
        name  = 'Authority control',
        bodyclass = 'hlist',
        wrapclass = 'acContainer',
        group1 = '[[Wikisource:Authority control|Authority control]]' .. elementscats,
        list1 = table.concat( elements )
    } )
end

return p