<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://ml.sayahna.org/index.php?action=history&amp;feed=atom&amp;title=Module%3AAuthority_control%2Fsandbox</id>
	<title>Module:Authority control/sandbox - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://ml.sayahna.org/index.php?action=history&amp;feed=atom&amp;title=Module%3AAuthority_control%2Fsandbox"/>
	<link rel="alternate" type="text/html" href="http://ml.sayahna.org/index.php?title=Module:Authority_control/sandbox&amp;action=history"/>
	<updated>2026-04-23T20:44:19Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.31.5</generator>
	<entry>
		<id>http://ml.sayahna.org/index.php?title=Module:Authority_control/sandbox&amp;diff=4032&amp;oldid=prev</id>
		<title>Admin: 1 revision</title>
		<link rel="alternate" type="text/html" href="http://ml.sayahna.org/index.php?title=Module:Authority_control/sandbox&amp;diff=4032&amp;oldid=prev"/>
		<updated>2014-03-22T04:12:38Z</updated>

		<summary type="html">&lt;p&gt;1 revision&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Revision as of 04:12, 22 March 2014&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://ml.sayahna.org/index.php?title=Module:Authority_control/sandbox&amp;diff=4031&amp;oldid=prev</id>
		<title>Docu at 23:31, 1 January 2014</title>
		<link rel="alternate" type="text/html" href="http://ml.sayahna.org/index.php?title=Module:Authority_control/sandbox&amp;diff=4031&amp;oldid=prev"/>
		<updated>2014-01-01T23:31:39Z</updated>

		<summary type="html">&lt;p&gt;&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 '[[Category:Wikipedia articles with ' .. id .. ' identifiers]]'&lt;br /&gt;
    elseif namespace == 2 and not title.isSubpage then&lt;br /&gt;
        return '[[Category:User pages with ' .. id .. ' identifiers]]'&lt;br /&gt;
    else&lt;br /&gt;
        return '[[Category:Miscellaneous pages with ' .. id .. ' identifiers]]'&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, '^%d+$' ) then&lt;br /&gt;
        return false&lt;br /&gt;
    end&lt;br /&gt;
    return '[http://viaf.org/viaf/' .. id .. ' ' .. id .. ']' .. getCatForId( 'VIAF' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function sudocLink( id )&lt;br /&gt;
    if not string.match( id, '^%d%d%d%d%d%d%d%d[%dxX]$' ) then&lt;br /&gt;
        return false&lt;br /&gt;
    end&lt;br /&gt;
    return '[http://www.idref.fr/' .. id .. ' ' .. id .. ']' .. getCatForId( 'SUDOC' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function hlsLink( id )&lt;br /&gt;
    if not string.match( id, '^%d+$' ) then&lt;br /&gt;
        return false&lt;br /&gt;
    end&lt;br /&gt;
    return '[http://www.hls-dhs-dss.ch/textes/f/F' .. id .. '.php ' .. id .. ']'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function lirLink( id )&lt;br /&gt;
    if not string.match( id, '^%d+$' ) then&lt;br /&gt;
        return false&lt;br /&gt;
    end&lt;br /&gt;
    return '[http://www.e-lir.ch/e-LIR___Lexicon.' .. id .. '.450.0.html ' .. id .. ']'&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], '0', 6 )&lt;br /&gt;
    return '[http://id.loc.gov/authorities/names/' .. id .. ' ' .. id .. ']' .. getCatForId( 'LCCN' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function mbLink( id )&lt;br /&gt;
    -- TODO Implement some sanity checking regex&lt;br /&gt;
    return '[//musicbrainz.org/artist/' .. id .. ' ' .. id .. ']' .. getCatForId( 'MusicBrainz' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function splitLccn( id )&lt;br /&gt;
    if id:match( '^%l%l?%l?%d%d%d%d%d%d%d%d%d?%d?$' ) then&lt;br /&gt;
        id = id:gsub( '^(%l+)(%d+)(%d%d%d%d%d%d)$', '%1/%2/%3' )&lt;br /&gt;
    end&lt;br /&gt;
    if id:match( '^%l%l?%l?/%d%d%d?%d?/%d+$' ) then&lt;br /&gt;
         return mw.text.split( id, '/' )&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 '[http://isni-url.oclc.nl/isni/' .. id .. ' ' .. id:sub( 1, 4 ) .. ' ' .. id:sub( 5, 8 ) .. ' '  .. id:sub( 9, 12 ) .. ' '  .. id:sub( 13, 16 ) .. ']' .. getCatForId( 'ISNI' )&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'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( '[ %-]', '' ):upper()&lt;br /&gt;
    if not id:match( '^%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d[%dX]$' ) 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 ) .. '-' .. id:sub( 5, 8 ) .. '-'  .. id:sub( 9, 12 ) .. '-'  .. id:sub( 13, 16 )&lt;br /&gt;
    return '[http://orcid.org/' .. id .. ' ' .. id .. ']' .. getCatForId( 'ORCID' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function gndLink( id )&lt;br /&gt;
    return '[http://d-nb.info/gnd/' .. id .. ' ' .. id .. ']' .. getCatForId( 'GND' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function selibrLink( id )&lt;br /&gt;
	if not string.match( id, '^%d+$' ) then&lt;br /&gt;
        return false&lt;br /&gt;
    end&lt;br /&gt;
    return '[http://libris.kb.se/auth/' .. id .. ' ' .. id .. ']' .. getCatForId( 'SELIBR' )&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, '^cb.+$' ) then&lt;br /&gt;
        id = 'cb' .. id&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return '[http://catalogue.bnf.fr/ark:/12148/' .. id .. ' ' .. id .. ']' .. getCatForId( 'BNF' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function bpnLink( id )&lt;br /&gt;
    if not string.match( id, '^%d+$' ) then&lt;br /&gt;
        return false&lt;br /&gt;
    end&lt;br /&gt;
    return '[http://www.biografischportaal.nl/persoon/' .. id .. ' ' .. id .. ']' .. getCatForId( 'BPN' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function ridLink( id )&lt;br /&gt;
    return '[http://www.researcherid.com/rid/' .. id .. ' ' .. id .. ']' .. getCatForId( 'RID' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function bibsysLink( id )&lt;br /&gt;
    return '[http://ask.bibsys.no/ask/action/result?cmd=&amp;amp;kilde=biblio&amp;amp;cql=bs.autid+%3D+' .. id .. '&amp;amp;feltselect=bs.autid ' .. id .. ']' .. getCatForId( 'BIBSYS' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function ulanLink( id )&lt;br /&gt;
    return '[http://www.getty.edu/vow/ULANFullDisplay?find=&amp;amp;role=&amp;amp;nation=&amp;amp;subjectid=' .. id .. ' ' .. id .. ']' .. getCatForId( 'ULAN' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function nlaLink( id )&lt;br /&gt;
	return '[http://nla.gov.au/anbd.aut-an' .. id .. ' ' .. id .. ']' .. getCatForId( 'NLA' )&lt;br /&gt;
end&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 matchesWikidataRequirements( item, reqs )&lt;br /&gt;
    for _, group in pairs( reqs ) do&lt;br /&gt;
        local property = 'p' .. group[1]&lt;br /&gt;
        local qid = group[2]&lt;br /&gt;
        if item.claims[property] ~= nil then&lt;br /&gt;
            for _, statement in pairs ( item.claims[property] ) do&lt;br /&gt;
            	if statement.mainsnak.datavalue ~= nil then&lt;br /&gt;
	                if statement.mainsnak.datavalue.value['numeric-id'] == qid then&lt;br /&gt;
    	                return true&lt;br /&gt;
        	        end&lt;br /&gt;
        	    end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return false&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 '* ' .. label .. ' &amp;lt;span class=&amp;quot;uid&amp;quot;&amp;gt;' .. link .. '&amp;lt;/span&amp;gt;\n'&lt;br /&gt;
        else&lt;br /&gt;
            return '* ' .. label .. ' ' .. link .. '\n'&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        return '* &amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;The ' .. id .. ' id ' .. rawValue .. ' is not valid.&amp;lt;/span&amp;gt;[[Category:Wikipedia articles with faulty authority control identifiers (' .. id .. ')]]\n'&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;
    { 'VIAF', '[[Virtual International Authority File|VIAF]]', 214, viafLink },&lt;br /&gt;
    { 'LCCN', '[[Library of Congress Control Number|LCCN]]', 244, lccnLink },&lt;br /&gt;
    { 'ISNI', '[[International Standard Name Identifier|ISNI]]', 213, isniLink },&lt;br /&gt;
    { 'ORCID', '[[ORCID]]', 496, orcidLink },&lt;br /&gt;
    { 'GND', '[[Integrated Authority File|GND]]', 227, gndLink },&lt;br /&gt;
    { 'SELIBR', '[[LIBRIS]]', 906, selibrLink },&lt;br /&gt;
    { 'SUDOC', '[[Système universitaire de documentation|SUDOC]]', 269, sudocLink },    &lt;br /&gt;
    { 'BNF', '[[Bibliothèque nationale de France|BNF]]', 268, bnfLink },&lt;br /&gt;
    { 'BPN', '[[Biografisch Portaal|BPN]]', 651, bpnLink },&lt;br /&gt;
    { 'RID', '[[ResearcherID]]', 0, ridLink },&lt;br /&gt;
    { 'BIBSYS', '[[BIBSYS]]', 0, bibsysLink },&lt;br /&gt;
    { 'ULAN', '[[Union List of Artist Names|ULAN]]', 245, ulanLink },&lt;br /&gt;
    { 'HLS', '[[Historical Dictionary of Switzerland|HLS]]', 902, hlsLink },&lt;br /&gt;
    { 'LIR', '[[Historical Dictionary of Switzerland|LIR]]', 886, lirLink },&lt;br /&gt;
    { 'MBA', '[[MusicBrainz]]', 434, mbLink },&lt;br /&gt;
    { 'NLA', '[[National Library of Australia|NLA]]', 409, nlaLink },&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- Check that the Wikidata item has this property--&amp;gt;value before adding it&lt;br /&gt;
local reqs = {}&lt;br /&gt;
reqs['MBA'] = {&lt;br /&gt;
    { 106, 177220 }, -- occupation -&amp;gt; singer&lt;br /&gt;
    { 31, 177220 }, -- instance of -&amp;gt; singer&lt;br /&gt;
    { 106, 13385019 }, -- occupation -&amp;gt; rapper&lt;br /&gt;
    { 31, 13385019 }, -- instance of -&amp;gt; rapper&lt;br /&gt;
    { 106, 639669 }, -- occupation -&amp;gt; musician&lt;br /&gt;
    { 31, 639669 }, -- instance of -&amp;gt; musician&lt;br /&gt;
    { 106, 36834 }, -- occupation -&amp;gt; composer&lt;br /&gt;
    { 31, 36834 }, -- instance of -&amp;gt; composer&lt;br /&gt;
    { 106, 488205 }, -- occupation -&amp;gt; singer-songwriter&lt;br /&gt;
    { 31, 488205 }, -- instance of -&amp;gt; singer-songwriter&lt;br /&gt;
    { 106, 183945 }, -- occupation -&amp;gt; record producer&lt;br /&gt;
    { 31, 183945 }, -- instance of -&amp;gt; record producer&lt;br /&gt;
    { 106, 10816969 }, -- occupation -&amp;gt; club DJ&lt;br /&gt;
    { 31, 10816969 }, -- instance of -&amp;gt; club DJ&lt;br /&gt;
    { 106, 130857 }, -- occupation -&amp;gt; DJ&lt;br /&gt;
    { 31, 130857 }, -- instance of -&amp;gt; DJ&lt;br /&gt;
    { 106, 158852 }, -- occupation -&amp;gt; conductor&lt;br /&gt;
    { 31, 158852 }, -- instance of -&amp;gt; conductor&lt;br /&gt;
    { 31, 215380 }, -- instance of -&amp;gt; band &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 == '') and parentArgs.PND ~= nil and parentArgs.PND ~= '' 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 == '' then&lt;br /&gt;
                	local canUseWikidata = nil&lt;br /&gt;
                    if reqs[params[1]] ~= nil then&lt;br /&gt;
                        canUseWikidata = matchesWikidataRequirements( item, reqs[params[1]] )&lt;br /&gt;
                    else&lt;br /&gt;
                        canUseWikidata = true&lt;br /&gt;
                    end&lt;br /&gt;
                    if canUseWikidata then&lt;br /&gt;
                        local wikidataIds = getIdsFromWikidata( item, 'p' .. 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;
    end&lt;br /&gt;
&lt;br /&gt;
    --Worldcat&lt;br /&gt;
    if parentArgs['WORLDCATID'] and parentArgs['WORLDCATID'] ~= '' then&lt;br /&gt;
        table.insert( elements, createRow( 'WORLDCATID', '', parentArgs['WORLDCATID'], '[http://www.worldcat.org/identities/' .. parentArgs['WORLDCATID'] .. ' WorldCat]', false ) ) --Validation?&lt;br /&gt;
    elseif parentArgs['LCCN'] and parentArgs['LCCN'] ~= '' then&lt;br /&gt;
        local lccnParts = splitLccn( parentArgs['LCCN'] )&lt;br /&gt;
        if lccnParts then&lt;br /&gt;
            table.insert( elements, createRow( 'LCCN', '', parentArgs['LCCN'], '[http://www.worldcat.org/identities/lccn-' .. lccnParts[1] .. lccnParts[2] .. '-' .. lccnParts[3] .. ' WorldCat]', 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 ~= '' then&lt;br /&gt;
            table.insert( elements, createRow( params[1], params[2] .. ':', val, params[4]( val ), true ) )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    local Navbox = require('Module:Navbox')&lt;br /&gt;
    return Navbox._navbox( {&lt;br /&gt;
        name  = 'Authority control',&lt;br /&gt;
        bodyclass = 'hlist',&lt;br /&gt;
        group1 = '[[Authority control]]',&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>Docu</name></author>
		
	</entry>
</feed>