Module:Infobox/Fonctions/Logiciel
< Module:Infobox | Fonctions
Aller à la navigation
Aller à la recherche
La documentation pour ce module peut être créée à Module:Infobox/Fonctions/Logiciel/doc
--[[ Avant de mettre en production une nouvelle version avez-vous : - mis en place des tests dans au moins une des pages de test d'un des modèles utilisant la fonction ? - testé avec la version bac à sable ? - modifié la documentation ? ]] -- Fonctions utilisées par les infobox de logiciel local p = {} local localdata = require 'Module:Infobox/Localdata' local general = require 'Module:Infobox/Fonctions' local item = localdata.item local wikidata = require 'Module:Wikidata' local date = require "Module:Date" local page = mw.title.getCurrentTitle() -- Liste locale de la fin des noms de catégories par langage de programmation local programmingLanguageCat = { Q234657 = 'ActionScript', Q154755 = 'Ada', Q165436 = 'Assembleur', Q297868 = 'Assembleur', -- Assembleur x86 Q15777 = 'C', Q2407 = 'C++', Q2370 = 'C sharp', Q4037189 = 'Delphi', Q5362035 = 'Elixir', Q334879 = 'Erlang', Q83303 = 'Fortran', Q189248 = 'GNU Bash', Q37227 = 'Go', Q34010 = 'Haskell', Q776372 = 'Information Processing Language', Q251 = 'Java', Q2005 = 'JavaScript', Q3816639 = 'Kotlin', Q132874 = 'Lisp', Q849146 = 'Common Lisp', Q1334586 = 'Emacs Lisp', Q207316 = 'Lua', Q633894 = 'Object Pascal', Q188531 = 'Objective-C', Q212587 = 'OCaml', Q81571 = 'Pascal', Q42478 = 'Perl', Q59 = 'PHP', Q28865 = 'Python', Q99513286 = 'Python', -- python 2 Q31205855 = 'Python', -- python 3 Q161053 = 'Ruby', Q575650 = 'Rust', Q460584 = 'Scala', Q959549 = 'Script shell', Q235086 = 'Smalltalk', Q17118377 = 'Swift', Q5288 = 'Tcl', Q978185 = 'TypeScript', Q1138939 = 'Vala', Q2378 = 'Visual Basic', -- catégorisation désactivée pour les langages qui suivent: Q726218 = '-', -- XML-based User interface Language (pas un langage de programmation) Q187432 = '-', -- langage de script (trop générique) Q840410 = '-', -- PowerShell (pas assez d’articles pour une catégorie en avril 2023) Q2053 = '-', -- HTML5 (pas pertinent) Q8811 = '-', -- HTML(pas pertinent) Q11707176 = '-', -- CSS3 (pas pertinent) Q46441 = '-', -- CSS (pas pertinent) Q47607 = '-', -- SQL (généralement pas pertinent) } -- Types de versions qui sont considérés comme « version avancée » (ou non-stable) local nonStableVersionTypes = { 'Q3295609', -- version beta 'Q2122918', -- version alpha 'Q1072356', -- version RC 'Q23356219', -- version pre-alpha 'Q51930650', -- version pré-release 'Q21727724', -- version non-stable 'Q5209391', -- daily build } -- Valeur de P31 qui ne doivent pas être affichées dans le champ 'Type' -- Il vaut mieux utiliser une propriété dédiée (P366) et de faire en sorte que l’unique valeur P31 pour les logiciels soit Q7397. -- Idem pour 'Politique de prix' (freeware, donationware, logiciel commercial, etc.), qui reste à remplir manuellement, -- mais qu’il vaudrait mieux remplir par une propriété dédiée (à créer) que par P31. -- Les valeurs relatives à la propriété intellectuelle du logiciel et la licence ne devraient pas être ajoutées dans P31 idéalement, -- puisqu’il existe des propriétés qui permettent de préciser la licence exacte et donc de déduire ces informations. local softwareTypesExcluded = { 'Q166142', -- application 'Q341', -- logiciel libre 'Q7397', -- logiciel 'Q218616', -- logiciel propriétaire 'Q506883', -- logiciel libre et open-source 'Q1130645', -- logiciel open-source 'Q178285', -- freeware 'Q10267', -- donationware 'Q1340793', -- logiciel commercial } --[[ -- Catégorise le logiciel en fonction du langage de programmation dans lequel il est écrit -- (cette fonction était initialement implémentée dans Modèle:Infobox Logiciel en wikicode). -- Lorsque la fonction parvient à catégoriser le logiciel, la catégorie -- « Logiciel catégorisé automatiquement par langage d'écriture » est également ajoutée. -- Lorsque la fonction ne parvient pas à catégoriser le logiciel car aucune catégorie n’est définie -- pour ce langage, la catégorie « Logiciel écrit en un langage sans catégorie associée » -- est ajoutée. On peut désactiver la catégorisation pour un langage en utilisant '-' dans -- la liste des noms de langages (programmingLanguageCat). --]] function p.catByProgrammingLanguage() -- On vérifie qu’on est dans l’espace principal et que l’on a pas le paramètre nocat if page.namespace ~= 0 or localdata['nocat'] then return '' end -- S’il y a des données locales, on abandonne pour éviter toute confusion, -- vu qu’on ne va pas utiliser les données locales (pas structurées, et avec des wikiliens) -- et qu’on ne veut pas que la catégorisation diverge de l’affichage dans l’infobox if localdata['langage de programmation'] then return '' end local plang = wikidata.getIds(localdata.item, { property = 'P277', atdate = "today", }) if #plang == 0 then return '' end local ret = '' local isCat = false for i=1, #plang do local cat = programmingLanguageCat[plang[i]] if cat and cat ~= '-' then -- on peut désactiver la tentative d’ajout dans une catégorie en renseignant '-' -- à la place du nom d’un langage, afin d’éviter de remplir la catégorie -- « Logiciel écrit dans un langage sans catégorie associée » -- si on sait que la catégorie ne sera pas créée. ret = ret .. '[['..'Category:Logiciel écrit en ' .. cat .. ']]' isCat = true elseif cat ~= '-' then -- Catégorie de maintenance ret = ret .. '[[' .. 'Category:Logiciel écrit en un langage sans catégorie associée' .. ']]' end end if isCat then -- Catégorie de maintenance ret = ret .. '[[' .. "Category:Logiciel catégorisé automatiquement par langage d'écriture" .. ']]' end return ret end --[[ -- Retourne les langages de programmation dans lesquels est écrit le logiciel. -- Par défaut, catégorise le logiciel par langages d’écriture (désactivable en mettant disableCat à true). --]] function p.programmingLanguage(disableCat) local catEnabled = not disableCat -- par défaut on active la catégorisation return { type = 'row', label = '[[Langage de programmation|Écrit en]]', value = 'langage de programmation', wikidata = function() local value, num = wikidata.formatAndCat { entity = localdata.item, property = 'P277', atdate= "today", -- le logiciel peut avoir été ré-écrit en un autre langage returnnumberofvalues = true, } return value and (value .. (catEnabled and p.catByProgrammingLanguage())), num end, } end --[[ -- Retourne les langages de programmation supportés. -- Attention: ne pas confondre avec le langage de programmation dans lequel le logiciel est écrit. --]] function p.programmingLanguagesSupported() return { type = 'row', label = '[[Langage de programmation|Supporte le langage]]', plurallabel = '[[Langage de programmation|Supporte les langages]]', value = 'langages supportés', wikidata = { property = 'P3985', atdate = "today", }, } end --[[ -- Retourne les langues supportées par le logiciel. -- Si il y en a au moins autant que "nbmax", affiche « Multilingue ». -- Dans ce cas, si le français fait parti de ces langues, il est précisé « dont français ». --]] function p.internationalisation(nbmax) return { type = 'row', label = '[[Internationalisation (informatique)|Langue]]', plurallabel = '[[Internationalisation (informatique)|Langues]]', value = 'langues', wikidata = function() local values, num = wikidata.formatAndCat { entity = localdata.item, conjtype = 'new line', property = 'P407', atdate = 'today', returnnumberofvalues = true, } if num and (num >= nbmax) then local fr = wikidata.getIds(localdata.item, { property = 'P407', targetvalue = 'Q150', -- français atdate = 'today', numval = 1, }) values, num = wikidata.addLinkBack('[[Multilinguisme|Multilingue]]' .. (#fr ~= 0 and ' dont [[français]]' or ''), localdata.item, 'P407').. wikidata.addTrackingCat('P407'), 1 elseif num == 1 then local multilingue = wikidata.getIds(localdata.item, { property = 'P407', targetvalue = 'Q20923490', -- multilingue atdate = 'today', numval = 1, }) if #multilingue ~= 0 then -- on regarde si le français fait parti des langues qui ne sont pas en rang préféré local fr = wikidata.getIds(localdata.item, { property = 'P407', targetvalue = 'Q150', -- français atdate = 'today', numval = 1, rank = 'valid', }) if #fr ~= 0 then values, num = wikidata.addLinkBack('[[Multilinguisme|Multilingue]]' .. (#fr ~= 0 and ' dont [[français]]' or ''), localdata.item, 'P407').. wikidata.addTrackingCat('P407'), 1 end end end return values, num end, } end --[[ -- Retourne la date de début du développement --]] function p.developmentStart() return { type = 'row', label = 'Début du [[Développement de logiciel|développement]]', value = 'début du développement', wikidata = { property = 'P571', linktopic = '-', -- on peut séparer les dates de début du développement par OS/plateforme showqualifiers = {'P400','P306'}, }, } end --[[ -- Retourne la boite de navigation vers les versions précédentes et suivantes, si elles font l’objet -- d’un article séparé. --]] function p.versionsNavigator() return { type = 'table', title = 'Chronologie des versions', rows = { { type = 'navigator', previousLabel = 'Version précédente', previousval = 'version précédente', previousproperty= 'P155', nextLabel = 'Version suivante', nextval = 'version suivante', nextproperty = 'P156', separated = true, }, } } end --[[ -- Retourne la ligne avec la première version connue du logiciel --]] function p.firstVersion() return { type = 'row', label = 'Première version', --[[ -- On cherche les identifiants de version (P348) avec un qualificatif type de version (P548) égal à -- Q56514665 (première version). -- On ajoute les qualificatifs: -- * P1476 (titre), -- * P400 (plateforme), -- * P306 (système d’exploitation), -- * P577 (date de publication) -- Les paramètres locaux sont "date de première version" et "première version". --]] wikidata = { conjtype = 'new line', property = 'P348', qualifier = 'P548', qualifiervalue = 'Q56514665', qualifconjtype = 'comma', showqualifiers = {'P1476','P400','P306','P577'}, showsource = true, qualiflinktopic = '-', rank = 'valid', -- La première version est généralement en rang normal, mais peut également être en rang préféré }, value = function() --[[ -- Si les paramètres "date de première version" ou "première version" sont renseignés, -- on ne cherche pas sur Wikidata -- (les deux valeurs étant liées, par cohérence il faut qu’elles soient renseignées au même endroit) --]] -- Désactivation de l’affichage du paramètre en utilisant '-' local versionNum = localdata['première version'] or '' local versionDate = localdata['date de première version'] or '' if (versionNum == '-') or (versionDate == '-') then return '-' end local r = versionNum .. ((versionNum ~= '' and versionDate ~= '') and ' (' or '') .. (date.dateInfobox{args={'date', versionDate, nolinks=true}} or '') .. ((versionNum ~= '' and versionDate ~= '') and ')' or '') if r ~= '' then return r else return nil end end, } end --[[ -- Retourne la ligne de la dernière version stable --]] function p.lastStableVersion() return { type = 'row', label = "[[Version d'un logiciel|Dernière version]]", wikidata = function() --[[ -- On cherche la valeur de P348 (identifiant de version) la plus récente, -- dont la valeur de P548 (type de version) n’est pas une version avancée. -- Idéalement, il faudrait juste regarder si c’est une version de type version stable (Q2804309) -- ou une version avec support étendu (Q104243413) mais ce n’est souvent pas renseigné. -- -- On ajoute les qualificatifs: -- * P1476 (titre), -- * P400 (plateforme), -- * P306 (système d’exploitation), -- * P577 (date de publication) -- -- Les paramètres locaux sont "date de dernière version" et "dernière version". -- -- Si les paramètres "date de dernière version","dernière version", "date de version avancée", ou -- "version avancée" sont renseignés, on ne cherche pas sur Wikidata -- (ces valeurs étant liées, par cohérence il faut qu’elles soient renseignées au même endroit) -- -- Dans cette fonction on suppose que les toutes les versions stables -- à ne pas afficher ne feront jamais parti du "best rank", -- c’est-à-dire qu’on affiche l’intégralité du "best rank" (à l’exception des versions non-stables) -- et on ne filtre pas par date : il peut y avoir différentes valeurs pertinentes pour la version stable (une par plateforme/os), -- indépendamment de la date de publication. --]] if localdata['date de dernière version'] or localdata['dernière version'] then -- valeur locale de la date de dernière version return nil, 0 end if (localdata['version avancée'] or localdata['date de version avancée']) and (localdata['version avancée'] ~= '-' and localdata['date de version avancée'] ~= '-') then -- valeur locale de la date de version avancée return nil, 0 end return wikidata.formatAndCat { entity = localdata.item, conjtype = 'new line', property = 'P348', excludequalifier = 'P548', qualifier = 'P577', showqualifiers = {'P1476','P400','P306','P577'}, excludequalifiervalue = nonStableVersionTypes, showsource = true, qualiflinktopic = '-', qualifconjtype = 'comma', returnnumberofvalues = true, rank = 'best', } end, value = function() -- Désactivation de l’affichage du paramètre en utilisant '-' local versionNum = localdata['dernière version'] or '' local versionDate = localdata['date de dernière version'] or '' if (versionNum == '-') or (versionDate == '-') then return '-' end local r = versionNum .. ((versionNum ~= '' and versionDate ~= '') and ' (' or '') .. (date.dateInfobox{args={'date', versionDate, nolinks=true}} or '') .. ((versionNum ~= '' and versionDate ~= '') and ')' or '') if r ~= '' then return r else return nil end end, } end --[[ -- Retourne la ligne de la version avancée. --]] function p.advancedVersion() return { type = 'row', label = "[[Version d'un logiciel|Version avancée]]", wikidata = function() --[[ -- On cherche la valeur de P348 (identifiant de version) la plus récente, -- dont la valeur de P548 (type de version) est une version avancée. -- -- Si la version avancée est affichée, on affiche le qualificatif date de publication (P548). -- -- On ajoute les qualificatifs: -- * P1476 (titre), -- * P400 (plateforme), -- * P306 (système d’exploitation), -- * P577 (date de publication) -- -- Les paramètres locaux sont "date de version avancée" et "version avancée". -- -- Si les paramètres "date de dernière version", "dernière version", "date de version avancée", ou -- "version avancée" sont renseignés, on ne cherche pas sur Wikidata -- (ces valeurs étant liées, par cohérence il faut qu’elles soient renseignées au même endroit) -- -- Dans cette fonction on suppose que les toutesles versions avancées -- à afficher feront toujours parti du "preferred rank", -- c’est-à-dire qu’on affiche l’intégralité du "preferred rank" (à l’exception des versions stables) -- Justification: -- * une version avancée qui est réellement avancée -- par rapport à la dernière version stable disponible, et qui est la plus récente disponible -- devrait toujours avoir le rang « préféré » -- * une version avancée qui n’est pas plus récente que la dernière version stable -- devrait toujours avoir le rang « normal » -- * une version avancée qui n’est pas la plus récente devrait toujours avoir le rang « normal ». -- * baser l’affichage sur les date de publication des différentes versions ne fonctionne pas bien -- lorsqu’il y a plusieurs branches qui ont un rythme de -- publication indépendants et plusieurs versions d’écart (par exemple pour firefox) -- * on ne peut pas se fier aux numéros de versions car ils ne sont pas toujours sémantiques -- --]] if localdata['date de dernière version'] or localdata['dernière version'] or localdata['version avancée'] or localdata['date de version avancée'] then return nil, 0 end return wikidata.formatAndCat { entity = localdata.item, conjtype = 'new line', property = 'P348', qualifier = 'P548', qualifiervalue = nonStableVersionTypes, showqualifiers = {'P1476','P400','P306','P577'}, showsource = true, qualiflinktopic = '-', qualifconjtype = 'comma', returnnumberofvalues = true, rank = 'preferred', } end, value = function() -- Désactivation de l’affichage du paramètre en utilisant '-' local versionNum = localdata['version avancée'] or '' local versionDate = localdata['date de version avancée'] or '' if (versionNum == '-') or (versionDate == '-') then return '-' end local r = versionNum .. ((versionNum ~= '' and versionDate ~= '') and ' (' or '') .. (date.dateInfobox{args={'date', versionDate, nolinks=true}} or '') .. ((versionNum ~= '' and versionDate ~= '') and ')' or '') if r ~= '' then return r else return nil end end, } end --[[ -- Retourne le type de logiciel. Certains types sont exclus car non pertinents. -- TODO: Update avril 2023: Il faudrait utiliser P366 comme modifié également sur la version Wikicode. --]] function p.softwareType() return { type = 'row', label = 'Type', value = 'type', wikidata = { conjtype = 'new line', property = 'P31', excludevalues = softwareTypesExcluded, atdate = "today", }, } end --[[ -- Retourne le créateur du logiciel. --]] function p.creator() return { type = 'row', label = 'Créateur', plurallabel ='Créateurs', value = 'créateur', wikidata = function() -- Si le "développeur" est une donnée locale, on ne cherche pas le créateur sur Wikidata -- pour ne pas risquer de faire un doublon avec la ligne "développeur" if localdata['développeur'] or localdata['développeurs'] then return nil, 0 end return wikidata.formatAndCat { entity = localdata.item, property = {'P170', 'P112'}, returnnumberofvalues = true, } end, } end --[[ -- Retourne le développeur du logiciel, uniquement si il est différent du créateur du logiciel. --]] function p.developer() return { type = 'row', label = '[[Développeur|Développé par]]', plurallabel ='[[Développeur|Développé par]]', value = {'développeur', 'développeurs'}, wikidata = function() -- Si le "créateur" est une donnée locale, on ne cherche pas les devs sur Wikidata -- pour ne pas risquer de faire un doublon avec la ligne "créateur" if localdata['créateur'] then return nil, 0 end local creators, creatornum = wikidata.formatAndCat { entity = localdata.item, property = {'P170', 'P112'}, returnnumberofvalues = true, } local devs, devnum = wikidata.formatAndCat { entity = localdata.item, property = 'P178', atdate = "today", returnnumberofvalues = true, } -- On affiche cette ligne que si le créateur est différent du développeur if (creatornum == devnum) and (creators == devs) then return nil, 0 end return devs, devnum end, } end --[[ -- Retourne les licences du logiciel. --]] function p.license() return { type = 'row', label = '[[Licence de logiciel|Licence]]', plurallabel ='[[Licence de logiciel|Licences]]', value = {'licence','licences'}, wikidata = function() return wikidata.formatAndCat { entity = localdata.item, conjtype = 'comma', property = 'P275', atdate = 'today', returnnumberofvalues = true, labelformat = function(qid) -- affichage de l’identifiant SPDX qui a l’avantage -- d’être court et explicite local label, isset = wikidata.formatStatements { entity = qid, numval = 1, property = 'P2479', returnnumberofvalues = true, atdate = 'today', -- les identifiants SPDX ont changé en avril 2015 } -- fallback sur le label de la licence if not isset then label = nil end return label end, } end, } end --[[ -- Retourne le dépôt logiciel utilisé. --]] function p.repository() return { type = 'row', label = '[[Dépôt (informatique)|Dépôt]]', plurallabel = '[[Dépôt (informatique)|Dépôts]]', value = 'dépôt', wikidata = { property = 'P1324', atdate = "today", -- ça ne sert à rien d’afficher une adresse qui n’est plus la bonne }, } end --[[ -- Retourne l’assurance qualité du projet. --]] function p.qualityAssurance() return { type = 'row', label = '[[Assurance qualité]]', value = 'assurance qualité', wikdata = { property = 'P2992', atdate = "today", } } end --[[ -- Retourne l’interface graphique du logiciel. --]] function p.graphicalInterface() return { type = 'row', label = '[[Interface graphique|Interface]]', plurallabel = '[[Interface graphique|Interfaces]]', value = 'interface', wikidata = { property = 'P1414', atdate = "today", }, } end --[[ -- Retourne les systèmes d’exploitation supportés. --]] function p.operatingSystem() return { type = 'row', label = "[[Système d'exploitation|Système d’exploitation]]", plurallabel ="[[Système d'exploitation|Systèmes d’exploitation]]", value = {"système d'exploitation", "systèmes d'exploitation", "environnement", "environnements"}, wikidata = { property = 'P306', atdate = "today", }, } end --[[ -- Retourne la plateforme informatique utilisée. --]] function p.platform() return { type = 'row', label = '[[Plate-forme (informatique)|Plate-forme]]', label = '[[Plate-forme (informatique)|Plate-formes]]', value = {'plate-forme','plate-formes', 'plateforme', 'plateformes'}, wikidata = { property = 'P400', atdate = "today", }, } end --[[ -- Retourne la taille du logiciel. --]] function p.dataSize() return { type = 'row', label = '[[Taille de fichier|Taille des données]]', value = 'taille des données', wikidata = { property = 'P3575', atdate = "today", }, } end --[[ -- Retourne les formats de fichiers lus par le logiciel. --]] function p.readFormats() return { type = 'row', label = '[[Format de données|Format]] lu', plurallabel = '[[Format de données|Formats]] lus', value = 'importe', wikidata = { property = 'P1072', atdate = "today", }, } end --[[ -- Retourne les formats de fichiers écrits par le logiciel. --]] function p.writtenFormats() return { type = 'row', label = '[[Format de données|Format]] écrit', plurallabel = '[[Format de données|Formats]] écrits', value = 'exporte', wikidata = { property = 'P1073', atdate = "today", }, } end --[[ -- Retourne le lien vers la documentation du logiciel. --]] function p.documentation() return { type = 'row', label = '[[Documentation logicielle|Documentation]]', value = 'documentation', wikidata = { property = 'P2078', atdate = "today", }, } end --[[ -- Retourne l’image principale --]] function p.mainimage(cat, defaultimage) if not cat then cat = 'Article à illustrer Logiciel' end return general.mainimage(cat, defaultimage) end --[[ -- Retourne le logo --]] function p.logo(upright) return general.logo(upright) end --[[ -- Retourne le titre --]] function p.title() return general.title('informatique') end --[[ -- Retourne le site web --]] function p.website(localparam) return general.website(localparam) end return p