Aller au contenu

Module:Infobox/Fonctions/Logiciel

Cette page est semi-protégée.
Une page de Wikipédia, l'encyclopédie libre.

 Documentation[voir] [modifier] [historique] [purger]

Cette page réunit des fonctions qui peuvent être réutilisées pour construire des modules d'infobox visant à décrire un logiciel. Sauf mention contraire, les fonctions utilisent des données fournies en paramètre dans l'article, ou alors, lorsque celles-ci sont absentes, des données issues de Wikidata.

Qualificatifs temporels

Certaines valeurs ne sont valables qu'à une certaine date ou pour une période donnée. Ces informations sont ajoutées aux propriétés de l'élément en tant que qualificateurs. Ces informations :

  • apparaîtrons, éventuellement, entre parenthèse après la valeur de la propriété,
  • permettront de trier chronologiquement les valeurs affichées,
  • de n'afficher que la valeur actuelle d'une propriété.

Les qualificatifs temporels sont : P585 (« date »), P580 (« date de début ») et P582 (« date de fin »).

Fonctions exportables

p.programmingLanguage(disableCat)

p.programmingLanguagesSupported()

p.internationalisation(nbmax)

p.developmentStart()

p.versionsNavigator()

p.firstVersion()

p.lastStableVersion()

p.advancedVersion()

p.softwareType()

p.creator()

p.developer()

p.license()

Affiche la ou les licences du logiciel. Si la licence dispose d’un identifiant SPDX, c’est celui-ci qui est affiché plutôt que le libellé de l’élément Wikidata de la licence.

Paramètres de l'infobox
Libellé Paramètres Wikidata Description
Licence
Licences
licence
licences
P275 (« licence »)
P582 (« date de fin »)
P2479 (« identifiant SPDX ») (sur l’élément de la licence)
Licences du logiciel.
Une erreur fréquente est d’utiliser un nom générique de licence plutôt que de préciser sa version précise (par exemple « GPL » au lieu de « GPL-2.0 ») : il faut bien préciser la version de la licence utilisée.

Lorsque des propriétés de Wikidata sont utilisées le ou les formats s'affichent en respectant les règles suivantes, dans l'ordre, jusqu'à ce qu'il soit possible de renvoyer quelque chose à afficher :

  1. les valeurs qui ont un qualificatif P582 (« date de fin ») avec un valeur dans le passé ne sont jamais pris en compte.
  2. les valeurs ayant un rang égal à deprecated ne sont jamais pris en compte.
  3. pour une catégorie de valeurs, celles ayant un rang normal ne sont pris en considération que s'il n'y en a aucun ayant un rang preferred.

Lorsque la licence utilisée dispose d’un identifiant SPDX, c’est ce dernier qui est affiché plutôt que le libellé de la licence.
Exemples :
Pour Inkscape, la licence est [[GPLv2|GPL-2.0]]

p.repository()

Affiche le lien vers le dépôt de code source de ce logiciel.

Paramètres de l'infobox
Libellé Paramètres Wikidata Description
Dépôt
Dépôts
dépôt P1324 (« dépôt du code source »)
P582 (« date de fin »)
Lien vers le dépôt de code source de ce logiciel.

Lorsque des propriétés de Wikidata sont utilisées le ou les formats s'affichent en respectant les règles suivantes, dans l'ordre, jusqu'à ce qu'il soit possible de renvoyer quelque chose à afficher :

  1. les valeurs qui ont un qualificatif P582 (« date de fin ») avec un valeur dans le passé ne sont jamais pris en compte.
  2. les valeurs ayant un rang égal à deprecated ne sont jamais pris en compte.
  3. pour une catégorie de valeurs, celles ayant un rang normal ne sont pris en considération que s'il n'y en a aucun ayant un rang preferred.

Exemples :
Pour OpenVPN, le dépôt de code source est https://gitlab.com/openvpn/openvpn

p.qualityAssurance()

Affiche l’assurance qualité de ce logiciel.

Paramètres de l'infobox
Libellé Paramètres Wikidata Description
Assurance qualité assurance qualité P2992 (« assurance qualité logicielle »)
P582 (« date de fin »)
Assurance qualité pour ce logiciel.

Lorsque des propriétés de Wikidata sont utilisées le ou les formats s'affichent en respectant les règles suivantes, dans l'ordre, jusqu'à ce qu'il soit possible de renvoyer quelque chose à afficher :

  1. les valeurs qui ont un qualificatif P582 (« date de fin ») avec un valeur dans le passé ne sont jamais pris en compte.
  2. les valeurs ayant un rang égal à deprecated ne sont jamais pris en compte.
  3. pour une catégorie de valeurs, celles ayant un rang normal ne sont pris en considération que s'il n'y en a aucun ayant un rang preferred.

Exemples :
Pour Comprehensive Knowledge Archive Network, l’assurance qualité est [[Intégration continue]]

p.graphicalInterface()

Affiche l’interface graphique utilisée par le logiciel.

Paramètres de l'infobox
Libellé Paramètres Wikidata Description
Interface
Interfaces
interface
interfaces
P1414 (« bibliothèque d'interface utilisateur »)
P582 (« date de fin »)
Interface graphique utilisée par le logiciel.

Lorsque des propriétés de Wikidata sont utilisées le ou les formats s'affichent en respectant les règles suivantes, dans l'ordre, jusqu'à ce qu'il soit possible de renvoyer quelque chose à afficher :

  1. les interfaces qui ont un qualificatif P582 (« date de fin ») avec un valeur dans le passé ne sont jamais pris en compte.
  2. les interfaces ayant un rang égal à deprecated ne sont jamais pris en compte.
  3. pour une catégorie d’interfaces, celles ayant un rang normal ne sont pris en considération que s'il n'y en a aucun ayant un rang preferred.

Exemples :
Pour GIMP, l’interface utilisée est [[GTK (boîte à outils)|GTK]]

p.operatingSystem()

Affiche le ou les systèmes d’exploitation sur lesquels peut fonctionner le logiciel.

Paramètres de l'infobox
Libellé Paramètres Wikidata Description
Système d’exploitation
Systèmes d’exploitation
système d'exploitation
systèmes d'exploitation
environnement
environnements
P306 (« système d'exploitation »)
P582 (« date de fin »)
Systèmes d’exploitation sur lesquels peut fonctionner le logiciel.

Lorsque des propriétés de Wikidata sont utilisées le ou les formats s'affichent en respectant les règles suivantes, dans l'ordre, jusqu'à ce qu'il soit possible de renvoyer quelque chose à afficher :

  1. les systèmes d’exploitation qui ont un qualificatif P582 (« date de fin ») avec un valeur dans le passé ne sont jamais pris en compte.
  2. les systèmes d’exploitation ayant un rang égal à deprecated ne sont jamais pris en compte.
  3. pour une catégorie de systèmes d’exploitation, celles ayant un rang normal ne sont pris en considération que s'il n'y en a aucun ayant un rang preferred.

Exemples :
Pour Mozilla Firefox, un des systèmes d’exploitation est [[Microsoft Windows]]

p.platform()

Affiche la ou les plateformes sur lesquelles peut fonctionner le logiciel.

Paramètres de l'infobox
Libellé Paramètres Wikidata Description
Plate-forme
Plate-formes
plateforme
plateformes
plate-forme
plate-formes
P400 (« plateforme »)
P582 (« date de fin »)
Plateformes sur lesquelles peut fonctionner le logiciel.

Lorsque des propriétés de Wikidata sont utilisées le ou les formats s'affichent en respectant les règles suivantes, dans l'ordre, jusqu'à ce qu'il soit possible de renvoyer quelque chose à afficher :

  1. les plateformes qui ont un qualificatif P582 (« date de fin ») avec un valeur dans le passé ne sont jamais pris en compte.
  2. les plateformes ayant un rang égal à deprecated ne sont jamais pris en compte.
  3. pour une catégorie de plateformes, celles ayant un rang normal ne sont pris en considération que s'il n'y en a aucun ayant un rang preferred.

Exemples :
Pour Minecraft, une des plateformes est [[Xbox 360]]

p.dataSize()

Affiche la taille d’un logiciel, d’un jeu de données, d’un réseau de neurones, ou d’un fichier individuel.

Paramètres de l'infobox
Libellé Paramètres Wikidata Description
Taille des données taille des données P3575 (« taille des données »)
P582 (« date de fin »)
Taille d’un logiciel, d’un jeu de données, d’un réseau de neurones, ou d’un fichier individuel.

Lorsque des propriétés de Wikidata sont utilisées la taille s'affiche en respectant les règles suivantes, dans l'ordre, jusqu'à ce qu'il soit possible de renvoyer quelque chose à afficher :

  1. les tailles qui ont un qualificatif P582 (« date de fin ») avec un valeur dans le passé ne sont jamais pris en compte.
  2. les tailles ayant un rang égal à deprecated ne sont jamais pris en compte.
  3. pour une catégorie de tailles, ceux ayant un rang normal ne sont pris en considération que s'il n'y en a aucun ayant un rang preferred.

Exemples :
Pour Mozilla Firefox, la taille des données est 44 MB

p.readFormats()

Affiche les formats de fichiers ou de flux de données lus ou importés par le logiciel.

Paramètres de l'infobox
Libellé Paramètres Wikidata Description
Formats lus importe P1072 (« format de fichier pouvant être lu »)
P582 (« date de fin »)
Formats de fichiers ou de flux de données lus ou importés par le logiciel.

Lorsque des propriétés de Wikidata sont utilisées le ou les formats s'affichent en respectant les règles suivantes, dans l'ordre, jusqu'à ce qu'il soit possible de renvoyer quelque chose à afficher :

  1. les formats qui ont un qualificatif P582 (« date de fin ») avec un valeur dans le passé ne sont jamais pris en compte.
  2. les formats ayant un rang égal à deprecated ne sont jamais pris en compte.
  3. pour une catégorie de formats, ceux ayant un rang normal ne sont pris en considération que s'il n'y en a aucun ayant un rang preferred.

Exemples :
Pour Adobe Photoshop, un des formats lus est [[JPEG]]

p.writtenFormats()

Affiche les formats de fichiers ou de flux de données écrits ou exportés par le logiciel.

Paramètres de l'infobox
Libellé Paramètres Wikidata Description
Formats écrits exporte P1073 (« format de fichier pouvant être écrit »)
P582 (« date de fin »)
Formats de fichiers ou de flux de données écrits ou exportés par le logiciel.

Lorsque des propriétés de Wikidata sont utilisées le ou les formats s'affichent en respectant les règles suivantes, dans l'ordre, jusqu'à ce qu'il soit possible de renvoyer quelque chose à afficher :

  1. les formats qui ont un qualificatif P582 (« date de fin ») avec un valeur dans le passé ne sont jamais pris en compte.
  2. les formats ayant un rang égal à deprecated ne sont jamais pris en compte.
  3. pour une catégorie de formats, ceux ayant un rang normal ne sont pris en considération que s'il n'y en a aucun ayant un rang preferred.

Exemples :
Pour Adobe Photoshop, un des formats exportés est [[JPEG]]

p.documentation()

Affiche le lien vers la documentation du logiciel.

Paramètres de l'infobox
Libellé Paramètres Wikidata Description
Documentation documentation P2078 (« lien vers le mode d'emploi »)
P582 (« date de fin »)
URL de la documentation du logiciel.

L'adresse doit être complète en commençant par http:// ou https://.
Lorsque des propriétés de Wikidata sont utilisées le ou les sites internet s'affichent en respectant les règles suivantes, dans l'ordre, jusqu'à ce qu'il soit possible de renvoyer quelque chose à afficher :

  1. les sites qui ont un qualificatif P582 (« date de fin ») avec un valeur dans le passé ne sont jamais pris en compte.
  2. les sites ayant un rang égal à deprecated ne sont jamais pris en compte.
  3. pour une catégorie de sites, ceux ayant un rang normal ne sont pris en considération que s'il n'y en a aucun ayant un rang preferred.

Exemples :
Pour darktable, le lien vers la documentation est https://www.darktable.org/usermanual/index.html.php

p.mainimage(cat, defaultimage)

Affiche une illustration du logiciel. Généralement, il s’agit d’une capture d’écran.

Paramètres de la fonction
Argument Type Description
Première syntaxe
cat chaîne Catégorie à laquelle sera ajoutée la page contenant l'infobox si cette denière n'a pas d'image.
defaultimage chaîne Image à afficher en l'absence d'image fournie. Par exemple .
Deuxième syntaxe
args tableau tableau d'arguments qui peut contenir : defaultimage, upright, size, cat, altparameter, alt, defaultimagealt, wikidata,
defaultimage chaîne? ???
Paramètres de l'infobox
Libellé Paramètre Wikidata Description

image
photo
Photo

Fichier de l'image ou de la photographie à afficher dans l'infobox.
Pour les « bâtiments récents » prennez en compte les règles exceptions au droit d'auteur.


Exemples :

légende image
légende
Légende

Qualificatif de l'image affichée :
P2096 (« légende de média »)[1]

Légende de l'image.
Si l'image provient de Wikidata, la légende doit être précisée dans le qualificateur P2096 (« légende de média ») de l'image, sinon il y a un risque d'incohérence.
La légende ne s'affiche que si l'image s'affiche.


Exemples :
Pour l'Académie des Jeux floraux l'infobox est paramétrée avec :
légende image = L’hôtel d'Assézat, où siège l’académie.

upright

Facteur de redimensionnement de l'image. Utile en particulier lorsque l'image est en mode portrait[2].
Voir l'aide sur la mise en forme des images


Exemples :
upright = 0.5

taille image

Largeur de l'image, en pixels.
L'utilisation de ce paramètre est déconseillée dans l'aide sur la mise en forme des images. Le paramètre upright est préférable.
Valeur par défaut : 300
Valeur maximum : 315


Exemples :
Pour AARP l'infobox est paramétrée avec :
taille image = 150.

alternative image

Voir la proposition de propriété alt text

Texte à afficher quand l'image ne peut l'être.
Si l'image provient de Wikidata, le texte alternatif devrait être précisé dans un qualificateur de l'image, afin d'éviter un risque d'incohérence.


Exemples :

  1. Légende en français de l'image si elle existe.
  2. Image dont la hauteur est supérieur à la largeur.

p.logo(upright)

Affiche le logo du logiciel.

Paramètre de la fonction
Argument Type Description
upright nombre Valeur par défaut du facteur de redimensionnement du logo.
Paramètres de l'infobox
Libellé Paramètre Wikidata Description

logo
association_logo

Fichier du logo à afficher dans l'infobox.

Exemples :

légende logo

Légende du logo.
Si le logo provient de Wikidata, la légende doit être précisée dans le qualificateur P2096 (« légende de média ») du logo, sinon il y a un risque d'incohérence.
La légende ne s'affiche que si le logo s'affiche.


Exemples :

upright logo

Facteur de redimensionnement du logo. Utile en particulier lorsque le logo est en mode portrait[2].
Voir l'aide sur la mise en forme des images


Exemples :
upright logo = 0.5


taille logo

Largeur du logo, en pixels.
L'utilisation de ce paramètre est déconseillée dans l'aide sur la mise en forme des images. Le paramètre upright logo est préférable.
Valeur par défaut : 300
Valeur maximum : 315


Exemples :

alternative logo

Voir la proposition de propriété alt text

Texte à afficher quand l'image ne peut l'être.
Si l'image provient de Wikidata, le texte alternatif devrait être précisé dans un qualificateur de l'image, afin d'éviter un risque d'incohérence.


  1. Légende en français de l'image si elle existe.
  2. Image dont la hauteur est supérieur à la largeur.

p.title()

Retourne le titre de l’infobox.

Paramètres de l'infobox
Libellé Paramètre Wikidata Description

nom
association_nom
nom_think
acronymelaboratoire
titre

Texte à afficher dans la barre de titre de l'infobox. Par défaut c'est le libellé en français de l'élément wikidata lié à la page. En son absence, c'est le nom de la page Wikipédia.


Exemples :

p.website(localparam)

Retourne le site web du logiciel.

Paramètre de la fonction
Argument Type Description
localparam chaîne Nom du paramètre à ajouter aux paramètres de l'infobox existants (site web, site_web, site officiel, site internet, web).
Paramètre de l'infobox
Libellé Paramètre Wikidata Description

Site web

site web
site_web
site officiel
site internet
web

URL du site internet.
L'adresse doit être complète en commençant par http:// ou https://.
Lorsque l'un des paramètres est utilisé il ne peut y avoir qu'un seul site.
Lorsque des propriétés de Wikidata sont utilisées le ou les sites internet s'affichent en respectant les règles suivantes, dans l'ordre, jusqu'à ce qu'il soit possible de renvoyer quelque chose à afficher :

  1. les sites ayant un rang égal à deprecated ne sont jamais pris en compte.
  2. pour une catégorie de sites, ceux ayant un rang normal ne sont pris en considération que s'il n'y en a aucun ayant un rang preferred.
  3. S'il y a au moins un site dont le qualificateur P407 (« langue de l'œuvre, du nom ou du terme ») est le français, seuls les sites en français sont renvoyés pour affichage.
  4. Sinon les sites dans les autres langues sont précédés du code de langue, par exemple (en) pour l'anglais et sont renvoyés pour affichage.

Remarques :


Exemples :
Pour la règle 3 voir Conseil international de la danse.
Pour la règle 4 voir Académie nationale des sciences d'Azerbaïdjan.

nom site

Texte affiché pour le lien du site. Ce paramètre ne fonctionne que lorsque l'adresse est spécifiée par un paramètre.


Exemples :
nom site = site officiel

--[[ 
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, de préférence en français, sinon dans d’autres langues.
-- 
-- TODO: mettre à jour la documentation de cette fonction pour préciser le comportement en fonction de la langue.
--]]
function p.documentation()
	return {
		type = 'row',
		label = '[[Documentation logicielle|Documentation]]',
		value = 'documentation',
		wikidata = function()
				local values, num = wikidata.formatAndCat {
					entity = localdata.item,
					displayformat = 'weblink',
					conjtype = 'new line',
					property = 'P2078',
					atdate = 'today',
					isinlang = 'fr',
					--[[
					-- excludespecial car il peut y avoir marqué "aucune valeur"
					-- pour le français, mais y avoir une documentation en anglais
					--]]
					excludespecial = true,
					returnnumberofvalues = true,
				}
				if not values then
					values, num = wikidata.formatAndCat {
						entity = localdata.item,
						displayformat = 'weblink',
						conjtype = 'new line',
						property = 'P2078',
						showlang = true,
						atdate = 'today',
						excludespecial = true,
						returnnumberofvalues = true,
					}
				end
				return values, num
			end,
	}
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