Module:Autorité : Différence entre versions

De Lagny-sur-Marne Wiki
Aller à : navigation, rechercher
(ces paramètres obsolètes ne sont plus utilisés depuis un certain temps, code superflu donc)
(technique sympathique mais maintenant superfétatoire)
 
(2 révisions intermédiaires par le même utilisateur non affichées)
Ligne 200 : Ligne 200 :
 
function p.authorityControl( frame )
 
function p.authorityControl( frame )
 
     local args = frame:getParent().args
 
     local args = frame:getParent().args
 +
 +
    --Build a map of valid local arguments
 +
    local goodArgs = {}
 +
    for _, params in ipairs( conf ) do
 +
        goodArgs[params[1]] = true
 +
    end
 +
    goodArgs.WORLDCATID = true
 +
    goodArgs.entity = true
  
 
     local hasLocalArgs = false
 
     local hasLocalArgs = false
 +
    local hasInvalidArgs = false
 
     for name, value in pairs( args ) do
 
     for name, value in pairs( args ) do
 
         if name ~= 'entity' then --"entity" parameter doesn't add to category
 
         if name ~= 'entity' then --"entity" parameter doesn't add to category
 
             hasLocalArgs = true
 
             hasLocalArgs = true
             break
+
        end
 +
        if not goodArgs[name] then
 +
             hasInvalidArgs = true
 
         end
 
         end
 
     end
 
     end
Ligne 233 : Ligne 244 :
 
     --Create rows
 
     --Create rows
 
     local elements = {}
 
     local elements = {}
    setmetatable(elements, {__index = table})
 
  
 
     --Configured rows
 
     --Configured rows
Ligne 240 : Ligne 250 :
  
 
         if val and val ~= '' then
 
         if val and val ~= '' then
             elements:insert( createRow( params[1], params[2], val, params[4]( val ) ) )
+
             elements[#elements+1] = createRow( params[1], params[2], val, params[4]( val ) )
 
         end
 
         end
 
     end
 
     end
Ligne 246 : Ligne 256 :
 
     --Worldcat
 
     --Worldcat
 
     if args['WORLDCATID'] and args['WORLDCATID'] ~= '' then
 
     if args['WORLDCATID'] and args['WORLDCATID'] ~= '' then
         elements:insert( createRow( 'WORLDCATID', 'WorldCat', args['WORLDCATID'], 'http://www.worldcat.org/identities/' .. args['WORLDCATID'] ) ) --Validation?
+
         elements[#elements+1] = createRow( 'WORLDCATID', 'WorldCat', args['WORLDCATID'], 'http://www.worldcat.org/identities/' .. args['WORLDCATID'] ) --Validation?
 
     elseif args['LCCN'] and args['LCCN'] ~= '' then
 
     elseif args['LCCN'] and args['LCCN'] ~= '' then
 
         local lccnParts = splitLccn( args['LCCN'] )
 
         local lccnParts = splitLccn( args['LCCN'] )
 
         if lccnParts and lccnParts[1] ~= 'sh' then
 
         if lccnParts and lccnParts[1] ~= 'sh' then
             elements:insert( createRow( 'LCCN', 'WorldCat', args['LCCN'], 'http://www.worldcat.org/identities/lccn-' .. lccnParts[1] .. lccnParts[2] .. '-' .. lccnParts[3] ) )
+
             elements[#elements+1] = createRow( 'LCCN', 'WorldCat', args['LCCN'], 'http://www.worldcat.org/identities/lccn-' .. lccnParts[1] .. lccnParts[2] .. '-' .. lccnParts[3] )
 
         end
 
         end
 
     end
 
     end
Ligne 266 : Ligne 276 :
 
         cats = cats .. '[[Catégorie:Page utilisant le modèle Autorité avec un paramètre local]]'
 
         cats = cats .. '[[Catégorie:Page utilisant le modèle Autorité avec un paramètre local]]'
 
     end
 
     end
     return wd.addLinkback( "''[[Autorité (sciences de l'information)|Notices d'autorité]]''" .. entityInfo, entity, "identifiers" ) .. " : " .. elements:concat( ' • ' ) .. cats
+
    if hasInvalidArgs then
 +
        cats = cats .. '[[Catégorie:Page utilisant le modèle Autorité avec un paramètre invalide]]'
 +
    end
 +
     return wd.addLinkback( "''[[Autorité (sciences de l'information)|Notices d'autorité]]''" .. entityInfo, entity, "identifiers" ) .. " : " .. table.concat( elements, ' • ' ) .. cats
 
end
 
end
  
 
return p
 
return p

Version actuelle datée du 15 janvier 2017 à 02:39

La documentation pour ce module peut être créée à Module:Autorité/doc

local wd = require('Module:Wikidata')

local function bneUrl( id )
    if not id:match( '^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 sbnUrl( id )
    if not id:match( '^IT\\ICCU\\%d%d%d%d%d%d%d%d%d%d$' ) and not id:match( '^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 ndlUrl( id )
    if not id:match( '^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 leonoreUrl( 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 id:match( '^LH/%d%d?%d?%d?/%d%d?%d?$' ) and
       not id:match( '^C/0/%d%d?$' ) and
       not id:match( '^19800035/%d%d?%d?%d?/%d%d?%d?%d?%d?$' ) and
       not id:match( '^19800035/%d%d?%d?%d?/%d%d?%d?%d?%d?Bis$' ) 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 isniUrl( id )
    id = validateIsni( id )
    if not id then
        return false
    end
    return 'http://isni.org/isni/' .. id
end

local function orcidUrl( 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 ciniiUrl( id )
    return 'http://ci.nii.ac.jp/author/' .. id .. '?l=en'
end

local function ulanUrl( id )
    if not id:match( '^%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 sudocUrl( id )
    if not id:match( '^%d%d%d%d%d%d%d%d[%dxX]$' ) then
        return false
    end
    return 'http://www.idref.fr/' .. id
end

local function bnfUrls( id )
    --Add cb prefix if it has been removed
    if not id:match( '^cb.+$' ) then
        id = 'cb' .. id
    end
    return {
        'http://catalogue.bnf.fr/ark:/12148/' .. id,
        'http://data.bnf.fr/ark:/12148/' .. id }
end

local function viafUrl( id )
    if not id:match( '^%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 padLeft( str, c, length )
    return c:rep( length - #str ) .. str
end

local function lccnUrl( id )
    local parts = splitLccn( id )
    if not parts then
        return false
    end
    id = parts[1] .. parts[2] .. padLeft( parts[3], '0', 6 )
    return 'http://id.loc.gov/authorities/' .. id
end

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

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

local function makeLink(url, label)
    return '<span class="nowrap uid noarchive">[' .. url .. ' ' .. label .. ']</span>'
end

local function createRow( id, label, rawValue, url )
    if type(url) == 'table' then
        return makeLink(url[1], label[1]) .. ' (' .. makeLink(url[2], label[2]) .. ')'
    elseif url then
        return makeLink(url, label)
    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 ipairs( 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, viafUrl },
    { 'ISNI', 'International Standard Name Identifier', 213, isniUrl },
    { 'ORCID', 'ORCID', 496, orcidUrl },
    { 'CINII', 'CiNii', 271, ciniiUrl },
    { 'ULAN', 'Union List of Artist Names', 245, ulanUrl },
    { 'BNF', { 'Bibliothèque nationale de France', 'données' }, 268, bnfUrls },
    { 'SUDOC', 'Système universitaire de documentation', 269, sudocUrl },
    { 'LCCN', 'Bibliothèque du Congrès', 244, lccnUrl },
    { 'GND', 'Gemeinsame Normdatei', 227, gndUrl },
    { 'SBN', 'Service bibliothécaire national', 396, sbnUrl },
    { 'NDL', 'Bibliothèque nationale de la Diète', 349, ndlUrl },
    { 'BNE', 'Bibliothèque nationale d\'Espagne', 950, bneUrl },
    { 'Léonore', 'Base Léonore', 640, leonoreUrl }, -- Légion d'honneur de la France
    { 'French Sculpture Census ID', 'Répertoire de sculpture française', 2380, frenchsculptureUrl },
}

local p = {}

function p.authorityControl( frame )
    local args = frame:getParent().args

    --Build a map of valid local arguments
    local goodArgs = {}
    for _, params in ipairs( conf ) do
        goodArgs[params[1]] = true
    end
    goodArgs.WORLDCATID = true
    goodArgs.entity = true

    local hasLocalArgs = false
    local hasInvalidArgs = false
    for name, value in pairs( args ) do
        if name ~= 'entity' then --"entity" parameter doesn't add to category
            hasLocalArgs = true
        end
        if not goodArgs[name] then
            hasInvalidArgs = true
        end
    end

    --Get the Wikidata item
    local entity = nil --Current page
    if args.entity and args.entity ~= '' then
        entity = args.entity
    end
    local item = mw.wikibase.getEntity(entity)

    --Wikidata fallback if requested
    if item and item.claims then
        for _, params in ipairs( conf ) do
            if params[3] ~= 0 then
                local val = args[params[1]]
                if not val or val == '' then
                    local wikidataIds = getIdsFromWikidata( item, 'P' .. params[3] )
                    if wikidataIds[1] then
                        args[params[1]] = wikidataIds[1]
                    end
                end
            end
        end
    end

    --Create rows
    local elements = {}

    --Configured rows
    for _, params in ipairs( conf ) do
        local val = args[params[1]]

        if val and val ~= '' then
            elements[#elements+1] = createRow( params[1], params[2], val, params[4]( val ) )
        end
    end

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

    local entityInfo = ''
    if entity and item then --Has "entity" parameter, Wikidata item was found
        local label = item:getLabel()
        if label then
            entityInfo = ' (pour [[' .. label .. ']])'
        end
    end

    local cats = "[[Catégorie:Article de Wikipédia avec notice d'autorité]]"
    if hasLocalArgs then
        cats = cats .. '[[Catégorie:Page utilisant le modèle Autorité avec un paramètre local]]'
    end
    if hasInvalidArgs then
        cats = cats .. '[[Catégorie:Page utilisant le modèle Autorité avec un paramètre invalide]]'
    end
    return wd.addLinkback( "''[[Autorité (sciences de l'information)|Notices d'autorité]]''" .. entityInfo, entity, "identifiers" ) .. " : " .. table.concat( elements, '&nbsp;• ' ) .. cats
end

return p