Module:Biblio/Lien web
< Module:Biblio
Révision datée du 11 mai 2017 à 23:00 par Zebulon84 (discussion) (lienBrise : titre non obligatoire, pour respecter la doc et la version précédente du modèle, sachant qu'il est difficile de trouver le titre pour un lien brisé)
La documentation pour ce module peut être créée à Module:Biblio/Lien web/doc
local Lien = { } local Commun = require( 'Module:Biblio/Commun' ) local References = require( 'Module:Biblio/Références' ) local Outils = require( 'Module:Outils' ) local TableBuilder = require( 'Module:TableBuilder' ) local Langue = require( 'Module:Langue' ) local function formatLien( args, dead ) -- La table wiki va recevoir tout les petits bouts de texte, et sera concaténée à la fin. -- Elle utilise la meta-table de TableBuilder, permettant d'utiliser les fonctions de la -- library table comme des méthodes. minsert permet d'insérer plusieurs éléments en une -- seule fois en, ignorant les valeurs nil. local wiki = TableBuilder.new() local modele = '[[Modèle:Lien web|{{Lien web}}]]' if dead then modele = '[[Modèle:Lien brisé|{{Lien brisé}}]]' end -- validArg renvoie le premier paramètre non vide, ou nil s'ils sont tous vides. -- Seuls les noms des paramètres doivent être transmis à la fonction. local validArg = function ( ... ) return Commun.validTextArg( args, ... ) end -- Variables servant à la catégorisation args.categ = {} -- Span initial, id local spanInitial, spanFinal = Commun.spanInitial ( args, validArg ) wiki.minsert( spanInitial, Commun.libelle( args ) ) -- indication de langue local indicLangue, codeLangue = Commun.indicationDeLangue ( args, validArg ) if Outils.notEmpty( indicLangue ) then wiki.minsert( indicLangue, ' ' ) end -- Liste des auteurs et de leurs responsabilités (principales et secondaires) local auteur = validArg( 'nom1', 'nom', 'auteur1', 'auteur', 'auteurs', 'auteur institutionnel', 'last1', 'last', 'author1', 'author' ) if auteur then if validArg( 'auteurs' ) then wiki.minsert( args.auteurs ) else wiki.minsert( Commun.responsabilitePrincipale( args, validArg, true ) ) end local coauteur = validArg( 'co-auteur', 'coauteurs', 'coauteur', 'coauthors' ) if coauteur then wiki.minsert( ', ', coauteur ) end wiki.minsert( Commun.responsabiliteSecondaire( args, validArg ), ', ' ) end -- url local url = validArg( 'url', 'lire en ligne', 'url texte', 'lien' ) if url then -- remplacement des crochets et espaces par leur équivalent HTML url = string.gsub( string.gsub( string.gsub( url, ' ', '%%20' ), '%[', '%%5B' ), '%]', '%%5D' ) -- ajout http:// si nécessaire : if not ( string.match( url, '^http' ) or string.match( url, '^ftp' ) or string.match( url, '^//' ) ) then url = 'http://' .. url end if dead then wiki.minsert( '<span class="noarchive">' ) end wiki.minsert( '[', url ) elseif not validArg( 'pmid', 'pmcid', 'doi', 'jstor', 'bibcod', 'math reviews', 'zbl', 'zbmath', 'arxiv' ) then args.categ.url = true end -- titre local titre = validArg( 'titre', 'title' ) local description = validArg( 'description' ) if titre then -- suppression des retours ligne éventuels, sinon MediaWiki ne reconnaît pas le lien externe -- et remplacement des crochets par leur équivalent HTML (uniquement le crochet de fermeture) titre = titre:gsub( '\n', ' ' ):gsub ( '%]', ']' ) local c = titre:sub(1,1) -- on teste d'abord si titre contient déjà des guillemets if(string.byte(c) ~= 194) then local sousTitre if validArg( 'sous-titre' ) then sousTitre = ' : ' .. args['sous-titre'] sousTitre:gsub( ' ?»$', '' ) else titre:gsub( ' ?»$', '' ) end local color = dead and ' color:red;' wiki.minsert( ' « <cite style="font-style: normal;', color, '">', titre, sousTitre, '</cite> »', url and ']' ) else wiki.minsert( ' ', titre, url and ']' ) end -- traduction titre local traductionTitre = validArg( 'traduction titre' ) if traductionTitre and traductionTitre ~= args.titre then wiki.minsert( ' [« ', traductionTitre, ' »]' ) end if description then wiki.minsert( ', ', description ) end elseif description then if dead then wiki.minsert( ' <span style="color:red;">', description, '</span>', url and ']' ) else wiki.minsert( ' ', description, url and ']' ) end else args.categ.titre = true if url then wiki.minsert( ' ', url, ']' ) end end -- message d'erreur if args.categ.url or args.categ.titre then local absent = { } if args.categ.url then table.insert( absent, '« <code>url</code> »' ) end if args.categ.titre then table.insert( absent, '« <code>titre</code> »' ) end wiki.insert( 1, Outils.erreur( 'Modèle ' .. modele ..' : paramètre' .. ( #absent > 1 and 's ' or ' ') .. mw.text.listToText( absent ) .. ' manquant. ' ) ) end -- liens archives pour les liens brisés if url and dead then wiki.minsert( '<sup class="plainlinks">(', '[http://web.archive.org/web/*/', url, ' Archive] • ', '[http://archive.wikiwix.com/cache/?url=', url, ' Wikiwix] • ', '[http://archive.is/', url, ' Archive.is] • ', '[https://www.google.fr/search?q=cache:', url, ' Google] • ', '[[Projet:Correction des liens externes#J\'ai trouvé un lien mort, que faire ?|Que faire ?]])', '</sup></span>' ) end -- format wiki.minsert( References.indicationDeFormat( validArg( 'format électronique', 'format' ) ) ) -- série, site, éditeur local serie = validArg( 'série', 'work' ) if serie then wiki.minsert( [[, '']], serie, [['']] ) args.categ.work = validArg( 'work' ) -- il y a ambiguïté sur l'utilisation de ce paramètre end local site = validArg( 'site', 'website' ) if site then wiki.minsert( [[, sur '']], site, [['']] ) end local periodique = validArg( 'périodique' ) if periodique then wiki.minsert( ', ', periodique ) end local lieu = validArg( 'lieu', 'lieu édition', 'location' ) if lieu then wiki.minsert( ', ', lieu ) end local editeur = validArg( 'éditeur', 'publisher', 'editeur' ) if editeur then local lienEditeur = validArg( 'lien éditeur' ) if lienEditeur then wiki.minsert( ', [[', lienEditeur, '|', editeur, ']]' ) else wiki.minsert( ', ', editeur ) end end -- date if validArg( 'année', 'date', 'year', 'en ligne le', 'en ligne' ) then args.date = validArg( 'date', 'en ligne le', 'en ligne' ) local lrm if Langue.nonLatin( wiki.concat() ) then lrm = '‎ ' end wiki.minsert( ',', lrm, ' ', Commun.inscriptionDate( args ) ) end if validArg( 'brisé le' ) then wiki.minsert( ', brisé le ', Commun.inscriptionDate{ date = args['brisé le'] } ) end -- liens externe (isbn, doi...) et "consulté le" entre parenthèses, et en plus petit, sauf en note wiki.minsert( References.affichageLiensExternes( args, validArg, false, true ) ) -- fin du span wiki.minsert( spanFinal ) -- citation et passage local citation = validArg( 'citation', 'extrait', 'quote' ) if citation then wiki.minsert( ' : <span class="citation">« ', citation, ' »</span>' ) end local passage = validArg( 'page', 'pages', 'passage' ) if passage then if string.match( passage, '^[%dIVXLCM]' ) then wiki.minsert( ', ', Commun.page, passage ) else wiki.minsert( ', ', passage ) end end -- Ponctuation local patternPonct = '[,.;:!?] ?»?$' local ponctuation = mw.ustring.match( wiki.concat():gsub( '%b<>', '' ), patternPonct ) if not ponctuation then local ponctuationFinale = validArg( 'ponctuation finale' ) if ponctuationFinale == ';' then ponctuationFinale = ' ;' end wiki.minsert( ponctuationFinale ) end if mw.title.getCurrentTitle().namespace == 0 then wiki.minsert( args.categ.langue and '[[Catégorie:Page du modèle Lien web comportant une erreur|langue]]', args.categ.url and '[[Catégorie:Page du modèle Lien web comportant une erreur|Url]]', args.categ.titre and '[[Catégorie:Page du modèle Lien web comportant une erreur|titre]]', args.categ.isbnInvalid and '[[Catégorie:Page avec ISBN invalide]]', args.categ.issnInvalid and '[[Catégorie:Page avec ISSN invalide]]', dead and not validArg( 'nocat' ) and '[[Catégorie:Article contenant un lien mort]]' ) elseif dead and not validArg( 'nocat' ) then wiki.minsert( '[[Catégorie:Page contenant un lien mort]]' ) end return wiki.concat() end function Lien.lienWeb( args ) return formatLien( args, false ) end function Lien.lienBrise( args ) args.titre = Commun.validTextArg( args, 'titre', 'title', 'url', 'lire en ligne', 'url texte', 'lien' ) return formatLien( args, true ) end return Lien