<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.wiki-shangri-la.org/mw19/index.php?action=history&amp;feed=atom&amp;title=Module%3AAuthority_control</id>
	<title>Module:Authority control - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://www.wiki-shangri-la.org/mw19/index.php?action=history&amp;feed=atom&amp;title=Module%3AAuthority_control"/>
	<link rel="alternate" type="text/html" href="https://www.wiki-shangri-la.org/mw19/index.php?title=Module:Authority_control&amp;action=history"/>
	<updated>2026-06-06T06:36:31Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://www.wiki-shangri-la.org/mw19/index.php?title=Module:Authority_control&amp;diff=388&amp;oldid=prev</id>
		<title>Lilian Williamson: 1 revision</title>
		<link rel="alternate" type="text/html" href="https://www.wiki-shangri-la.org/mw19/index.php?title=Module:Authority_control&amp;diff=388&amp;oldid=prev"/>
		<updated>2013-08-28T20:03:05Z</updated>

		<summary type="html">&lt;p&gt;1 revision&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;function getCatForId( id )&lt;br /&gt;
    local title = mw.title.getCurrentTitle()&lt;br /&gt;
    local namespace = title.namespace&lt;br /&gt;
    if namespace == 0 then&lt;br /&gt;
        return &amp;#039;[[Category:Wikipedia articles with &amp;#039; .. id .. &amp;#039; identifiers]]&amp;#039;&lt;br /&gt;
    elseif namespace == 2 and not title.isSubpage then&lt;br /&gt;
        return &amp;#039;[[Category:User pages with &amp;#039; .. id .. &amp;#039; identifiers]]&amp;#039;&lt;br /&gt;
    else&lt;br /&gt;
        return &amp;#039;[[Category:Miscellaneous pages with &amp;#039; .. id .. &amp;#039; identifiers]]&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function viafLink( id )&lt;br /&gt;
    if not string.match( id, &amp;#039;^%d+$&amp;#039; ) then&lt;br /&gt;
        return false&lt;br /&gt;
    end&lt;br /&gt;
    return &amp;#039;[http://viaf.org/viaf/&amp;#039; .. id .. &amp;#039; &amp;#039; .. id .. &amp;#039;]&amp;#039; .. getCatForId( &amp;#039;VIAF&amp;#039; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function lccnLink( id )&lt;br /&gt;
    local parts = splitLccn( id )&lt;br /&gt;
    if not parts then&lt;br /&gt;
        return false&lt;br /&gt;
    end&lt;br /&gt;
    id = parts[1] .. parts[2] .. append( parts[3], &amp;#039;0&amp;#039;, 6 )&lt;br /&gt;
    return &amp;#039;[http://id.loc.gov/authorities/names/&amp;#039; .. id .. &amp;#039; &amp;#039; .. id .. &amp;#039;]&amp;#039; .. getCatForId( &amp;#039;LCCN&amp;#039; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function splitLccn( id )&lt;br /&gt;
    if id:match( &amp;#039;^%l%l?%l?%d%d%d%d%d%d%d%d%d?%d?$&amp;#039; ) then&lt;br /&gt;
        id = id:gsub( &amp;#039;^(%l+)(%d+)(%d%d%d%d%d%d)$&amp;#039;, &amp;#039;%1/%2/%3&amp;#039; )&lt;br /&gt;
    end&lt;br /&gt;
    if id:match( &amp;#039;^%l%l?%l?/%d%d%d?%d?/%d+$&amp;#039; ) then&lt;br /&gt;
         return mw.text.split( id, &amp;#039;/&amp;#039; )&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function append(str, c, length)&lt;br /&gt;
    while str:len() &amp;lt; length do&lt;br /&gt;
        str = c .. str&lt;br /&gt;
    end&lt;br /&gt;
    return str&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function isniLink( id )&lt;br /&gt;
    id = validateIsni( id )&lt;br /&gt;
    if not id then&lt;br /&gt;
        return false&lt;br /&gt;
    end&lt;br /&gt;
    return &amp;#039;[http://isni-url.oclc.nl/isni/&amp;#039; .. id .. &amp;#039; &amp;#039; .. id:sub( 1, 4 ) .. &amp;#039; &amp;#039; .. id:sub( 5, 8 ) .. &amp;#039; &amp;#039;  .. id:sub( 9, 12 ) .. &amp;#039; &amp;#039;  .. id:sub( 13, 16 ) .. &amp;#039;]&amp;#039; .. getCatForId( &amp;#039;ISNI&amp;#039; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--Validate ISNI (and ORCID) and retuns it as a 16 characters string or returns false if it&amp;#039;s invalid&lt;br /&gt;
--See http://support.orcid.org/knowledgebase/articles/116780-structure-of-the-orcid-identifier&lt;br /&gt;
function validateIsni( id )&lt;br /&gt;
    id = id:gsub( &amp;#039;[ %-]&amp;#039;, &amp;#039;&amp;#039; ):upper()&lt;br /&gt;
    if not id:match( &amp;#039;^%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d[%dX]$&amp;#039; ) then&lt;br /&gt;
        return false&lt;br /&gt;
    end&lt;br /&gt;
    if getIsniCheckDigit( id ) ~= string.char( id:byte( 16 ) ) then&lt;br /&gt;
        return false&lt;br /&gt;
    end&lt;br /&gt;
    return id&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--Returns the ISNI check digit isni must be a string where the 15 first elements are digits&lt;br /&gt;
function getIsniCheckDigit( isni )&lt;br /&gt;
    local total = 0&lt;br /&gt;
    for i = 1, 15 do&lt;br /&gt;
        local digit = isni:byte( i ) - 48 --Get integer value&lt;br /&gt;
        total = (total + digit) * 2&lt;br /&gt;
    end&lt;br /&gt;
    local remainder = total % 11&lt;br /&gt;
    local result = (12 - remainder) % 11&lt;br /&gt;
    if result == 10 then&lt;br /&gt;
        return &amp;quot;X&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    return tostring( result )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function orcidLink( id )&lt;br /&gt;
    id = validateIsni( id )&lt;br /&gt;
    if not id then&lt;br /&gt;
        return false&lt;br /&gt;
    end&lt;br /&gt;
    id = id:sub( 1, 4 ) .. &amp;#039;-&amp;#039; .. id:sub( 5, 8 ) .. &amp;#039;-&amp;#039;  .. id:sub( 9, 12 ) .. &amp;#039;-&amp;#039;  .. id:sub( 13, 16 )&lt;br /&gt;
    return &amp;#039;[http://orcid.org/&amp;#039; .. id .. &amp;#039; &amp;#039; .. id .. &amp;#039;]&amp;#039; .. getCatForId( &amp;#039;ORCID&amp;#039; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function gndLink( id )&lt;br /&gt;
    return &amp;#039;[http://d-nb.info/gnd/&amp;#039; .. id .. &amp;#039; &amp;#039; .. id .. &amp;#039;]&amp;#039; .. getCatForId( &amp;#039;GND&amp;#039; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function selibrLink( id )&lt;br /&gt;
    return &amp;#039;[http://libris.kb.se/auth/&amp;#039; .. id .. &amp;#039; &amp;#039; .. id .. &amp;#039;]&amp;#039; .. getCatForId( &amp;#039;SELIBR&amp;#039; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function bnfLink( id )&lt;br /&gt;
    --Add cb prefix if it has been removed&lt;br /&gt;
    if not string.match( id, &amp;#039;^cb.+$&amp;#039; ) then&lt;br /&gt;
        id = &amp;#039;cb&amp;#039; .. id&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return &amp;#039;[http://catalogue.bnf.fr/ark:/12148/&amp;#039; .. id .. &amp;#039; &amp;#039; .. id .. &amp;#039;]&amp;#039; .. getCatForId( &amp;#039;BNF&amp;#039; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function bpnLink( id )&lt;br /&gt;
    if not string.match( id, &amp;#039;^%d+$&amp;#039; ) then&lt;br /&gt;
        return false&lt;br /&gt;
    end&lt;br /&gt;
    return &amp;#039;[http://www.biografischportaal.nl/persoon/&amp;#039; .. id .. &amp;#039; &amp;#039; .. id .. &amp;#039;]&amp;#039; .. getCatForId( &amp;#039;BPN&amp;#039; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function ridLink( id )&lt;br /&gt;
    return &amp;#039;[http://www.researcherid.com/rid/&amp;#039; .. id .. &amp;#039; &amp;#039; .. id .. &amp;#039;]&amp;#039; .. getCatForId( &amp;#039;RID&amp;#039; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function bibsysLink( id )&lt;br /&gt;
    return &amp;#039;[http://ask.bibsys.no/ask/action/result?cmd=&amp;amp;kilde=biblio&amp;amp;cql=bs.autid+%3D+&amp;#039; .. id .. &amp;#039;&amp;amp;feltselect=bs.autid &amp;#039; .. id .. &amp;#039;]&amp;#039; .. getCatForId( &amp;#039;BIBSYS&amp;#039; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function ulanLink( id )&lt;br /&gt;
    return &amp;#039;[http://www.getty.edu/vow/ULANFullDisplay?find=&amp;amp;role=&amp;amp;nation=&amp;amp;subjectid=&amp;#039; .. id .. &amp;#039; &amp;#039; .. id .. &amp;#039;]&amp;#039; .. getCatForId( &amp;#039;ULAN&amp;#039; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function getIdsFromWikidata( item, property )&lt;br /&gt;
    local ids = {}&lt;br /&gt;
    if not item.claims[property] then&lt;br /&gt;
        return ids&lt;br /&gt;
    end&lt;br /&gt;
    for _, statement in pairs( item.claims[property] ) do&lt;br /&gt;
        table.insert( ids, statement.mainsnak.datavalue.value )&lt;br /&gt;
    end&lt;br /&gt;
    return ids&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function createRow( id, label, rawValue, link, withUid )&lt;br /&gt;
    if link then&lt;br /&gt;
        if withUid then&lt;br /&gt;
            return &amp;#039;* &amp;#039; .. label .. &amp;#039; &amp;lt;span class=&amp;quot;uid&amp;quot;&amp;gt;&amp;#039; .. link .. &amp;#039;&amp;lt;/span&amp;gt;\n&amp;#039;&lt;br /&gt;
        else&lt;br /&gt;
            return &amp;#039;* &amp;#039; .. label .. &amp;#039; &amp;#039; .. link .. &amp;#039;\n&amp;#039;&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        return &amp;#039;* &amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;The &amp;#039; .. id .. &amp;#039; id &amp;#039; .. rawValue .. &amp;#039; is not valid.&amp;lt;/span&amp;gt;[[Category:Wikipedia articles with faulty authority control identifiers (&amp;#039; .. id .. &amp;#039;)]]\n&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--In this order: name of the parameter, label, propertyId in Wikidata, formatting function&lt;br /&gt;
local conf = {&lt;br /&gt;
    { &amp;#039;VIAF&amp;#039;, &amp;#039;[[Virtual International Authority File|VIAF]]&amp;#039;, 214, viafLink },&lt;br /&gt;
    { &amp;#039;LCCN&amp;#039;, &amp;#039;[[Library of Congress Control Number|LCCN]]&amp;#039;, 244, lccnLink },&lt;br /&gt;
    { &amp;#039;ISNI&amp;#039;, &amp;#039;[[International Standard Name Identifier|ISNI]]&amp;#039;, 213, isniLink },&lt;br /&gt;
    { &amp;#039;ORCID&amp;#039;, &amp;#039;[[ORCID]]&amp;#039;, 496, orcidLink },&lt;br /&gt;
    { &amp;#039;GND&amp;#039;, &amp;#039;[[Integrated Authority File|GND]]&amp;#039;, 227, gndLink },&lt;br /&gt;
    { &amp;#039;SELIBR&amp;#039;, &amp;#039;[[LIBRIS]]&amp;#039;, 0, selibrLink },&lt;br /&gt;
    { &amp;#039;BNF&amp;#039;, &amp;#039;[[Bibliothèque nationale de France|BNF]]&amp;#039;, 268, bnfLink },&lt;br /&gt;
    { &amp;#039;BPN&amp;#039;, &amp;#039;[[Biografisch Portaal|BPN]]&amp;#039;, 651, bpnLink },&lt;br /&gt;
    { &amp;#039;RID&amp;#039;, &amp;#039;[[ResearcherID]]&amp;#039;, 0, ridLink },&lt;br /&gt;
    { &amp;#039;BIBSYS&amp;#039;, &amp;#039;[[BIBSYS]]&amp;#039;, 0, bibsysLink },&lt;br /&gt;
    { &amp;#039;ULAN&amp;#039;, &amp;#039;[[Union List of Artist Names|ULAN]]&amp;#039;, 245, ulanLink }&lt;br /&gt;
}&lt;br /&gt;
    &lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.authorityControl( frame )&lt;br /&gt;
    local parentArgs = frame:getParent().args&lt;br /&gt;
    --Create rows&lt;br /&gt;
    local elements = {}&lt;br /&gt;
&lt;br /&gt;
    --redirect PND to GND&lt;br /&gt;
    if (parentArgs.GND == nil or parentArgs.GND == &amp;#039;&amp;#039;) and parentArgs.PND ~= nil and parentArgs.PND ~= &amp;#039;&amp;#039; then&lt;br /&gt;
        parentArgs.GND = parentArgs.PND&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    --Wikidata fallback if requested&lt;br /&gt;
    local item = mw.wikibase.getEntity()&lt;br /&gt;
    if item ~= nil and item.claims ~= nil then&lt;br /&gt;
        for _, params in pairs( conf ) do&lt;br /&gt;
            if params[3] ~= 0 then&lt;br /&gt;
                local val = parentArgs[params[1]]&lt;br /&gt;
                if not val or val == &amp;#039;&amp;#039; then&lt;br /&gt;
                    local wikidataIds = getIdsFromWikidata( item, &amp;#039;p&amp;#039; .. params[3] )&lt;br /&gt;
                    if wikidataIds[1] then&lt;br /&gt;
                        parentArgs[params[1]] = wikidataIds[1]&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    --Worldcat&lt;br /&gt;
    if parentArgs[&amp;#039;WORLDCATID&amp;#039;] and parentArgs[&amp;#039;WORLDCATID&amp;#039;] ~= &amp;#039;&amp;#039; then&lt;br /&gt;
        table.insert( elements, createRow( &amp;#039;WORLDCATID&amp;#039;, &amp;#039;&amp;#039;, parentArgs[&amp;#039;WORLDCATID&amp;#039;], &amp;#039;[http://www.worldcat.org/identities/&amp;#039; .. parentArgs[&amp;#039;WORLDCATID&amp;#039;] .. &amp;#039; WorldCat]&amp;#039;, false ) ) --Validation?&lt;br /&gt;
    elseif parentArgs[&amp;#039;LCCN&amp;#039;] and parentArgs[&amp;#039;LCCN&amp;#039;] ~= &amp;#039;&amp;#039; then&lt;br /&gt;
        local lccnParts = splitLccn( parentArgs[&amp;#039;LCCN&amp;#039;] )&lt;br /&gt;
        if lccnParts then&lt;br /&gt;
            table.insert( elements, createRow( &amp;#039;LCCN&amp;#039;, &amp;#039;&amp;#039;, parentArgs[&amp;#039;LCCN&amp;#039;], &amp;#039;[http://www.worldcat.org/identities/lccn-&amp;#039; .. lccnParts[1] .. lccnParts[2] .. &amp;#039;-&amp;#039; .. lccnParts[3] .. &amp;#039; WorldCat]&amp;#039;, false ) )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    --Configured rows&lt;br /&gt;
    for k, params in pairs( conf ) do&lt;br /&gt;
        local val = parentArgs[params[1]]&lt;br /&gt;
        if val and val ~= &amp;#039;&amp;#039; then&lt;br /&gt;
            table.insert( elements, createRow( params[1], params[2] .. &amp;#039;:&amp;#039;, val, params[4]( val ), true ) )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    local Navbox = require(&amp;#039;Module:Navbox&amp;#039;)&lt;br /&gt;
    return Navbox._navbox( {&lt;br /&gt;
        name  = &amp;#039;Authority control&amp;#039;,&lt;br /&gt;
        bodyclass = &amp;#039;hlist&amp;#039;,&lt;br /&gt;
        group1 = &amp;#039;[[Authority control]]&amp;#039;,&lt;br /&gt;
        list1 = table.concat( elements )&lt;br /&gt;
    } )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Lilian Williamson</name></author>
	</entry>
</feed>