Cette page est protégée.

Module:Autorité

Une page de Wikipédia, l'encyclopédie libre.
Aller à : navigation, rechercher
Documentation Documentation[modifier] [purger]
Ce module à risque est inclus dans plus de 30 000 pages et ne peut pas être modifié.

Cette protection ne constitue pas obligatoirement une approbation de la version actuelle. Vous pouvez proposer une modification en page de discussion. Lorsqu'un compromis sera trouvé en page de discussion, vous pourrez demander la modification auprès des administrateurs. · Journal des protections.

Utilisation

Fonctions exportables :

  • authorityControl(frame) – Point d'entrée pour le modèle {{Autorité}}

Exemples

Voir {{Autorité}}


local function bneLink( id )
    if not string.match( id, '^XX%d%d%d%d%d%d?%d?$' ) then
        return false
    end
    return 'http://catalogo.bne.es/uhtbin/authoritybrowse.cgi?action=display&authority_id=' .. id
end

local function 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
end

local function ndlLink( id )
    if not string.match( id, '^0?%d%d%d%d%d%d%d%d$' ) then
        return false
    end
    return 'http://id.ndl.go.jp/auth/ndlna/' .. id
end

local function 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
end


--Returns the ISNI check digit isni must be a string where the 15 first elements are digits
local 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

--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
local 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

local function isniLink( id )
    id = validateIsni( id )
    if not id then
        return false
    end
    return 'http://isni.org/isni/' .. id
end

local 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 'http://orcid.org/' .. id
end

local function ciniiLink( id )
    return 'http://ci.nii.ac.jp/author/' .. id .. '?l=en' 
end

local function ulanLink( id )
    if not string.match( id, '^%d%d?%d?%d?%d?%d?%d?%d?%d?$' ) then
        return false
    end
    return '//www.getty.edu/vow/ULANFullDisplay?find=&role=&nation=&subjectid=' .. id
end

local 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
end

local 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
end

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

local 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

local function append(str, c, length)
    while str:len() < length do
        str = c .. str
    end
    return str
end

local 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/' .. id
end

local function gndLink( id )
    return 'http://d-nb.info/gnd/' .. id
end

local function frenchsculptureLink( id )
    return 'http://frenchsculpture.org/fr/artist/' .. id
end

local function createRow( id, label, rawValue, link )
    if link then
        local text = '<span class="nowrap uid">[' .. link .. ' ' .. label .. ']</span>'
        return text
    else
    	local cat = ''
    	if mw.title.getCurrentTitle().namespace == 0 then
    		cat = '[[Catégorie:Page utilisant le modèle Autorité avec un paramètre erroné]]\n'
    	end
        return '<span class="error">L\'identifiant ' .. id .. ' ' .. rawValue .. ' n\'est pas valide.</span>' .. cat
    end
end

local function getIdsFromWikidata( item, property )
    local ids = {}
    if not item.claims[property] then
        return ids
    end
    for _, statement in pairs( item.claims[property] ) do
    	if type( statement.mainsnak.datavalue ) == 'table' then
        	table.insert( ids, statement.mainsnak.datavalue.value )
        end
    end
    return ids
end

--In this order: name of the parameter, label, propertyId in Wikidata, formatting function
local conf = {
    { 'VIAF', 'Fichier d\'autorité international virtuel', 214, viafLink },
    { 'ISNI', 'International Standard Name Identifier', 213, isniLink },
    { 'ORCID', 'ORCID', 496, orcidLink }, 
    { 'CINII', 'CiNii', 271, ciniiLink },
    { 'ULAN', 'Union List of Artist Names', 245, ulanLink }, 
    { 'BNF', 'Bibliothèque nationale de France', 268, bnfLink },
    { 'SUDOC', 'Système universitaire de documentation', 269, sudocLink },
    { 'LCCN', 'Bibliothèque du Congrès', 244, lccnLink },
    { 'GND', 'Gemeinsame Normdatei', 227, gndLink },
    { 'SBN', 'Institut central pour le registre unique', 396, sbnLink }, 
    { 'NDL', 'Bibliothèque nationale de la Diète', 349, ndlLink }, 
    { 'BNE', 'Bibliothèque nationale d\'Espagne', 950, bneLink }, 
    { 'Léonore', 'Base Léonore', 640, leonoreLink }, -- Légion d'honneur de la France
    { 'SWD', 'Schlagwortnormdatei', 0, swdLink },
    { 'French Sculpture Census ID', 'Répertoire de sculpture française', 2380, frenchsculptureLink },
}
    
local p = {}

function p.authorityControl( frame )
    local parentArgs = frame:getParent().args
    --Create rows
    local elements = {}
    local isDepreciated = false --S'il y a un id déprécié
    local withLocalArgs = false
    for _,_ in pairs( parentArgs ) do
    	withLocalArgs = true
    end

    --Redirection des identifiants de la Bibliothèque Nationale d'Allemagne vers GND
    if parentArgs.GND == nil or parentArgs.GND == '' then
        if parentArgs.DNB ~= nil and parentArgs.DNB ~= '' then
            parentArgs.GND = parentArgs.DNB
            isDepreciated = true
        elseif parentArgs.PND ~= nil and parentArgs.PND ~= '' then
            parentArgs.GND = parentArgs.PND
            isDepreciated = true
        elseif parentArgs.GKD ~= nil and parentArgs.GKD ~= '' then
            parentArgs.GND = parentArgs.GKD
            isDepreciated = true
        elseif parentArgs['GKD-V1'] ~= nil and parentArgs['GKD-V1'] ~= '' then
            parentArgs.GND = parentArgs['GKD-V1']
            isDepreciated = true
        end
    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 wikidataIds = getIdsFromWikidata( item, 'P' .. params[3] )
                    if wikidataIds[1] then
                        parentArgs[params[1]] = wikidataIds[1]
                    end
                end
            end
        end
    end

    --Configured rows
    for _, 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 ) ) )
        end
    end

    --Worldcat
    if parentArgs['WORLDCATID'] and parentArgs['WORLDCATID'] ~= '' then
        table.insert( elements, createRow( 'WORLDCATID', 'WorldCat', parentArgs['WORLDCATID'], 'http://www.worldcat.org/identities/' .. parentArgs['WORLDCATID'] ) ) --Validation?
    elseif parentArgs['LCCN'] and parentArgs['LCCN'] ~= '' then
        local lccnParts = splitLccn( parentArgs['LCCN'] )
        if lccnParts and lccnParts[1] ~= 'sh' then
            table.insert( elements, createRow( 'LCCN', 'WorldCat', parentArgs['LCCN'], 'http://www.worldcat.org/identities/lccn-' .. lccnParts[1] .. lccnParts[2] .. '-' .. lccnParts[3] ) )
        end
    end

    local str = ''
    if isDepreciated then
        str = str .. '[[Catégorie:Page utilisant le modèle Autorité avec un paramètre obsolète]]\n'
    end
    if withLocalArgs then
        str = str .. '[[Catégorie:Page utilisant le modèle Autorité avec un paramètre local]]\n'
    end
    return "''[[Autorité (sciences de l'information)|Notices d\'autorité]]'' : " .. table.concat( elements, '&nbsp;• ' ) .. str
end

return p