Module:Infobox/Logiciel
Cette page définit un module d'infobox. Pour les conseils sur l'usage de ce module, voyez Modèle:Infobox Logiciel.
Ce module est destiné à remplacer l’infobox Logiciel. Il n’est pas encore fonctionnel et il ne faut pas l’utiliser dans l’espace principal.
Prochaines étapes
- déplacement des fonctions vers Module:Infobox/Fonctions/Logiciel
- documentation du module (cf. Projet:Infobox/Lua/Documentation)
- documentation du modèle
- tests de quelques semaines avec une deuxième annonce sur discussion projet:Informatique et sur la pdd de l’infobox
- demande de SP pour les deux pages de modules concernées
- remplacement du modèle, si pas d’opposition ni de bug majeur
- suppression de la catégorie de maintenance devenue inutile : Catégorie:Page utilisant l'infobox Logiciel avec une description mais pas d'image
- suppressions des sous-cats inutilisées de Catégorie:Logiciel par langage de programmation (toutes celles avec plus qu’un seul langage)
Paramètres pour l’infobox
Le module reprend tous les paramètres de Modèle:Infobox Logiciel. Les changements sont détaillés sur Discussion_modèle:Infobox_Logiciel#Passage_en_lua (en attendant que je fasse la documentation).
La documentation de ce module est générée par le modèle {{Documentation module}}.
Elle est incluse depuis sa sous-page de documentation. Veuillez placer les catégories sur cette page-là.
Les éditeurs peuvent travailler dans le bac à sable (modifier).
Voir les statistiques d'appel depuis le wikicode sur l'outil wstat et les appels depuis d'autres modules.
local general = require "Module:Infobox/Fonctions"
local wikidata = require "Module:Wikidata"
local date = require "Module:Date"
local localdata = require "Module:Infobox/Localdata"
local formatDate = require "Module:Date complexe"
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',
Q15777 = 'C',
Q2407 = 'C++',
Q487378 = 'Delphi',
Q334879 = 'Erlang',
Q83303 = 'Fortran',
Q189248 = 'GNU Bash',
Q37227 = 'Go',
Q34010 = 'Haskell',
Q776372 = 'Information Processing Language',
Q251 = 'Java',
Q2005 = 'JavaScript',
Q132874 = 'Lisp',
Q849146 = 'Common Lisp',
Q1334586 = 'Emacs Lisp',
Q633894 = 'Object Pascal',
Q188531 = 'Objective-C',
Q212587 = 'OCaml',
Q81571 = 'Pascal',
Q42478 = 'Perl',
Q59 = 'PHP',
Q28865 = 'Python',
Q161053 = 'Ruby',
Q575650 = 'Rust',
Q460584 = 'Scala',
Q959549 = 'Script shell',
Q235086 = 'Smalltalk',
Q1138939 = 'Vala',
Q2378 = 'Visual Basic',
}
--[[
-- 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)
--]]
local function catByProgrammingLanguage()
-- On vérifie qu’on est dans l’espace principal
-- À des fins de tests, on peut forcer la catégorisation avec le paramètre "forcer la catégorisation"
-- qui doit être non-vide
if page.namespace ~= 0 and not localdata['forcer la catégorisation'] 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, plangnum = wikidata.getIds(localdata.item, {
property = 'P277',
atdate= "today",
returnnumberofvalues = true,
})
if plangnum == 0 then
return ''
end
local ret = ''
for i=1, #plang do
local cat = programmingLanguageCat[plang[i]]
if cat then
ret = ret .. '[['..'Category:Logiciel écrit en ' .. cat .. ']]'
end
end
-- Catégorie de maintenance
if ret ~= '' then
ret = ret .. '[[' .. 'Category:Page de logiciel catégorisée par le Module:Infobox/Logiciel' .. ']]'
end
return ret
end
--[[
-- Retourne les langues supportées par le logiciel.
-- Si il y en a au moins autant que "nbmax", affiche Multilingue
--]]
local function 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',
returnnumberofvalues = true,
}
if num and (num >= nbmax) then
values, num = wikidata.addLinkBack('[[Multilinguisme|Multilingue]]', localdata.item, 'P407').. wikidata.addTrackingCat('P407'), 1
end
return values, num
end,
}
end
--[[
-- Retourne la ligne avec la première version connue du logiciel
--]]
local function firstVersion()
return {
type = 'row',
label = 'Première version',
wikidata = function()
--[[
-- 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)
-- P571 (date de création) est utilisée en fallback pour récupérer la date de création du logiciel.
-- Les paramètres locaux sont "date de première version" et "première version".
--]]
local values, num = wikidata.formatAndCat {
entity = localdata.item,
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é
returnnumberofvalues = true,
}
if not values then -- Pas de première version, donc on utilise la date de création
values, num = wikidata.formatAndCat {
entity = localdata.item,
displayformat = 'date',
conjtype = 'new line',
property = 'P571',
linktopic = '-',
showqualifiers = {'P1476','P400','P306'},
qualifconjtype = 'comma',
rank = 'best',
returnnumberofvalues = true,
}
end
return values, num
end,
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
-- 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 faudra envisager d’utiliser une propriété dédiée (à créer) 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
}
--[[
-- Retourne la ligne de la dernière version stable
--]]
local function 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 dernière version avancée", ou
-- "dernière 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'] or localdata['dernière version avancée'] or localdata['date de dernière version avancée'] then
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,
}
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 dernière version avancée.
-- Rien ne doit être affiché si la version stable est plus récente.
--]]
local function lastAdvancedVersion()
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 stable est plus récente, il ne faut rien retourner.
--
-- 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 dernière version avancée" et "dernière version avancée".
--
-- Si les paramètres "date de dernière version","dernière version", "date de dernière version avancée", ou
-- "dernière 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 avancées à 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 stables)
-- sauf dans le cas où une version plus récente qui n’est pas considérée comme avancée est en "best rank",
-- et que ces qualificatifs sont comparables avec celle-ci existe.
-- Par exemple si la version avancée est sortie en janvier,
-- et qu’une version stable est sortie le février de la même année,
-- la version avancée n’est pas affichée.
--]]
if localdata['date de dernière version'] or localdata['dernière version'] or localdata['dernière version avancée'] or localdata['date de dernière version avancée'] then
return nil, 0
end
local claimsVS = wikidata.getClaims({
entity = localdata.item,
property = 'P348',
qualifier = 'P548',
-- On ne compare qu’avec les version stables (Q2804309) pour
-- éviter de comparer avec les versions à support étendu dont il est normal
-- d’avoir des versions publiées régulièrement sans que cela n’invalide la
-- pertinence d’afficher une version bêta publiée antérieurement.
-- Si une version avancée s’affiche alors qu’une version non-avancée plus récente
-- existe, c’est probablement car le type de version n’a pas été précisé pour la
-- version non-avancée.
qualifiervalue = 'Q2804309',
})
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,
-- TODO: comparer les qualificatifs P400 et P306
condition = function(claimVA)
-- pas encore de version stable, affichons la version avancée
if not claimsVS then
return true
end
-- date de publication de la version avancée
local dateVA = wikidata.getDateFromQualif(claimVA, 'P577')
if not dateVA then
-- la version avancée doit avoir une date de publication,
-- sinon inutile de l’afficher
return false
end
for i=1, #claimsVS do
local dateVS = wikidata.getDateFromQualif(claimsVS[i], 'P577')
if dateVS and formatDate.before(dateVS, dateVA) then
-- version avancée publiée avant la version stable ou le même jour
if not formatDate.equal(dateVS, dateVA, 'day') then
-- on ne peut pas déterminer quelle version a été publiée en premier
-- donc on affiche les deux
return false
end
end
end
return true
end,
}
end,
value = function()
-- Désactivation de l’affichage du paramètre en utilisant '-'
local versionNum = localdata['dernière version avancée'] or ''
local versionDate = localdata['date de dernière 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
return {
maincolor = '#DFEDFF',
parts = {
general.title('informatique'),
-- Illustrations
general.logo('Article à illustrer Logiciel'),
general.mainimage('Article à illustrer Logiciel'),
{
type = 'table', title = 'Informations', rows = {
-- Informations sur l’auteur
{
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,
},
{
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,
},
-- Informations de version
firstVersion(),
lastStableVersion(),
lastAdvancedVersion(),
-- informations sur le projet
{
type = 'row',
label = '[[Dépôt (informatique)|Dépôt]]',
plurallabel = '[[Dépôt (informatique)|Dépôts]]',
value = 'dépôt',
property = 'P1324'
},
{
type = 'row',
label = '[[Assurance qualité]]',
value = 'assurance qualité',
property = 'P2992'
},
{
type = 'row',
label = 'État du projet',
value = 'état'
},
{
type = 'row',
label = '[[Langage de programmation|Écrit en]]',
value = 'langage de programmation',
wikidata = function()
return wikidata.formatAndCat {
entity = localdata.item,
property = 'P277',
atdate= "today",
returnnumberofvalues = true,
} .. catByProgrammingLanguage()
end,
},
{
type = 'row',
label = '[[Interface graphique|Interface]]',
plurallabel = '[[Interface graphique|Interfaces]]',
value = 'interface',
property = 'P1414'
},
{
type = 'row',
label = '[[Langage de programmation|Supporte le langage]]',
plurallabel = '[[Langage de programmation|Supporte les langages]]',
value = 'langages supportés',
wikidata = function()
return wikidata.formatAndCat {
entity = localdata.item,
property = 'P3985',
atdate= "today",
returnnumberofvalues = true,
}
end,
},
{
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"},
property = 'P306'
},
{
type = 'row',
label = '[[Plate-forme (informatique)|Environnement]]',
-- Note: la forme au pluriel "Environnements" est trop longue et empiète sur
-- le contenu de la colonne de droite. Elle a donc été retirée.
value = {'environnement','environnements'},
property = 'P400'
},
{
type = 'row',
label = '[[Taille de fichier|Taille des données]]',
value = 'taille des données',
property = 'P3575'
},
{
type = 'row',
label = '[[Format de données|Formats]] lus',
value = 'importe',
property = 'P1072'
},
{
type = 'row',
label = '[[Format de données|Formats]] écrits',
value = 'exporte',
property = 'P1073'
},
internationalisation(4),
{
type = 'row',
label = '[[Fichier exécutable|Fichier exécutable]]',
plurallabel ='[[Fichier exécutable|Fichiers exécutables]]',
value = {"exécutable","exécutables"}
},
{
type = 'row',
label = 'Type',
value = 'type',
wikidata = function()
return wikidata.formatAndCat {
entity = localdata.item,
conjtype = 'new line',
property = 'P31',
excludevalues = softwareTypesExcluded,
atdate= "today",
returnnumberofvalues = true,
}
end,
},
{
type = 'row',
label = '[[Politique de distribution]]',
value = 'politique de prix'
},
{
type = 'row',
label = '[[Licence de logiciel|Licence]]',
plurallabel ='[[Licence de logiciel|Licences]]',
value = {'licence','licences'},
property = 'P275'
},
{
type = 'row',
label = '[[Documentation logicielle|Documentation]]',
value = 'documentation',
property = 'P2078'
},
general.website() -- site web
},
},
{
type = 'table',
title = 'Chronologie des versions',
rows = {
{
type = 'navbox',
previousLabel = 'Version précédente',
previousval = 'version précédente',
previousproperty= 'P155',
nextLabel = 'Version suivante',
nextval = 'version suivante',
nextproperty = 'P156',
separated = true,
},
}
},
}
}