Aller au contenu

Module:Wikidata/Test

Une page de Wikipédia, l'encyclopédie libre.
Ceci est une version archivée de cette page, en date du 15 janvier 2015 à 18:07 et modifiée en dernier par Zolo (discuter | contributions). Elle peut contenir des erreurs, des inexactitudes ou des contenus vandalisés non présents dans la version actuelle.

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

Module permettant d'utiliser de récupérer et de mettre en forme des données issues de Wikidata.

Dans la mesure du possible, ce module devrait être neutre sur le plan linguistique. Pour les textes spécifiquement français, voir Module:Wikidata/I18n.

Fonctions exportables

Fonctions opérant au niveau d'un snak

Nom Arguments Description
formatSnak snak, params Récupère la valeur d'un snak et la met en forme
getDataValue snak, params Récupère la valeur d'un snak avec une valeur de type "value" et la met en forme
isSpecial snak retourne true si un snak est une valeur spéciale (novalue ou somevalue)
getId snak retourne l'identifiant Qdd de l'élément utilisé comme valeur d'un snak

Fonctions opérant au niveau d'une affirmation

Nom Arguments Description
formatStatement params Transforme une déclaration individuelle en chaîne wikitexte, selon les mêmes paramètres que stringTable
getDate statement, qualifs récupère les informations de date stockées dans une déclaration Wikidata (qualificatifs ou valeur principale) et les stocke sous forme de table
getFormattedDate statement, params récupère la date associée à un déclaration Wikidata comme getDate, mais la retourne sous forme d'une chaîne formattée selon les paramètres params
hasQualifier claim, acceptedqualifs, acceptedvals, excludequalifiervalues retourne true si l'affirmation comporte des qualificatifs utilisant les propriétés acceptedqualifs avec les valeurs acceptedvals, et sans les valeurs excludequalifiervalues. Si acceptedqualifs n'est pas renseignée, toutes les propriétés sont acceptées. Si acceptedvals n'est pas renseigné, toutes les valeurs sont acceptées.
getMainId claim retourne l'identifiant Qdd de l'élément utilisé comme valeur du "mainsnak" d'une déclaration
getFormattedQualifiers statement, qualifs, params à partir d'une affirmation, retourne une chaîne contenant les qualificatifs demandés. La table params permet de personnaliser l'affichage, voir #Paramètres.
getReferences statement récupère et affiche la partie références d'une déclaration Wikidata.
addTrackingCat property, cat catégorise dans [[Catégorie:Page utilisant $property]]

Fonctions opérant au niveau d'une entité

Nom Arguments Description
sortClaims claims, sorttype Met en ordre une série de valeurs pour ordre chronologique ou de quantité, voir l'argument "sorttype" pour plus de détail.
filterClaims claims, params Prend une table d'affirmations, et exclut celles qui ne correspondent pas aux critères donnés dans la table params. Pour la liste de ces arguments, voir l'aide ci dessous
getClaims params Retourne une table d'affirmations (ou nil) en fonction des instructions données dans la table params, qui dont contenir une clé |entity = et |property = , et peut contenir de nombreux autres paramètres optionnels, voir #Paramètres.
getIds params Sélectionne des affirmations de la même manière que getClaims met au lieu de retourner les affirmations complètes, elle ne retourne que l'identifiant de son mainsnak (ne fonctionne que pour les données de type élément).
stringTable Retourne les mêmes affirmations que getClaims, sauf éventuellement celles supprimées par le paramètre removedupes. Chacune est rendue sous forme d'une chaîne en Wikitexte directement utilisable. Les paramètres de mise en forme sont également contenus dans la table params.
formatStatements params Retourne les mêmes valeurs que stringTable, mais concaténées sous forme de chaîne unique. La méthode de concaténation est définie par le paramètre conjtype qui utilise Module:Linguistique. Si les paramètres linkback et addcat sont activés, un rétrolien et une catégorie de maintenance peuvent également être ajoutés.
formatAndCat params Même fonction que formatStatements, mais ajoute un rétrolien vers Wikidata et une catégorie de maintenance
getTheDate params affiche une date qui se trouve soit en valeur principale soit en qualificatif de la propriété prop de l'élément item
mainDate entity Récupère et met en forme la "date principale" que l'on peut associer à l'élément, en fonction de ses propriétés P580 (« date de début »), P582 (« date de fin ») et P585 (« date »)
keyDate event, item, params Récupère et format une date provenant de l'élément item. event doit être soit un identifiant de propriété, dans ce cas là, la fonction récupérera les valeurs dans cette propriété, soit un identifiant d'élément. Dans ce cas là, elle cherchera cet élément dans les valeurs de P793 (« événement clé ») et retournera la date indiquée en qualificatif.event peut également être une liste d'identifiants sous forme de table, dans ce cas là, la valeur retournée sera celle du premier identifiant pour lequel quelque chose est trouvé. Par exemple wd.keyDate('Q1417098', 'P1690'} cherchera la valeur dans P793 (« événement clé ») Q1417098 (« inauguration ») et si elle ne trouve rien, elle cherchera dans P1690 (« ICD-10-PCS »).
getLabel entity, lang1, lang2 Retourne le libellé Wikidata de l'entité en langue donnée par le code lang1 (français par défaut) ; si il est absent, le libellé en langue donnée par le code lang2 (par défaut, l'anglais ou la première langue de Module:Wikidata/Hiérarchie des langues ayant un libellé) et une catégorie de maintenance indiquant la langue utilisée.
siteLink entity, lang, project retourne un lien vers la page projet demandé ('wikipedia', 'wikivoyage', 'commons') etc. lié à l'entité Wikidata indiquée, dans la langue demandée. Par défaut, la langue est le français et le projet Wikpédia.
formatEntity entity, params Prend l'identifiant (ou la table de données) donnée en paramètre entité et la transforme, et la retourne sur la forme d'un texte contenant un libellé et éventuellement un lien interne.
getDescription entity, lang affiche la description Wikidata pour une entité donnée, dans un langue donnée (français par défaut)
getNumericId snak retourne l'identifiant numérique de l'élément utilisé comme valeur d'un snak
getEntity str retourne la table de données correpondant à un identifiant (inverse de getEntityId)
getEntityId str retourne l'identifiant d'une entité Wikidata passée sous la forme d'une table de données (inverse de getEntity)

Fonctions récupérant des données dans plusieurs entités

Nom Arguments Description
isSubclass class, item, maxdepth
isinstance class, item, maxdepth
inTransitiveVals searchedval, sourceval, query, maxdepth, maxnodes
Nom Arguments Description
iterate entité, chemin : iterateur retourne un itérateur sur toutes les valeurs possibles d’un chemin qui part de l’entité spécifiée. Exemple d’utilisation.
matches entité, chemin, valeur : retourne une valeur booléenne pour savoir si le chemin spécifié permet d’aller de l’entité « entité » à l’entité « valeur ». « isInstance » au-dessus est équilavente à path.matches(item, "P31/P279*", class) par exemple. Maxdepth pour l’instant pas implémenté, mais sans doute possible, il y a déjà une limite en dur dans les chemins).

Divers

Nom Arguments Descriptions
Dump entity affiche le contenu d'une entité Wikidata
sourceStr
frameFun (frame) appelle une des fonctions précédentes depuis le frame. Le nom de la fonction est donné en argument 1
addRefAnchor
addLinkback ajoute un rétrolien (généralement utilisé par formatStatements{linkback = true}, mais peut être utile comme fonction indépendante lorsque les données font l'objet de nombreuses manipulations avant leur rendu final
isHere searchset, val retourne true si la chaîne val se trouve dans la table searchset
addNewValues old, new ajoute les nouvelles valeurs à une table, seulement si elles ne s'y trouvent pas déjà

Paramètres

Liste des clés pouvant être utilisées dans la table "params" mentionnée ci-dessous.

Choix des déclarations

Paramètres utilisés par la fonction filterclaims et donc indirectement par les fonctions y faisant appel, tels que getClaims et formatStatements.

Nom Mode d'utilisation Description
claims Lua Liste de déclarations à utiliser. Lorsque ce paramètre est activé, les paramètres property et entity ne sont pas utilisés pour la récupération des données.
entity Lua et wikicode L'identifiant de l'entité Wikidata à utiliser. Par défaut, celle liée à la page.
En Lua, on peut passer une entité déjà chargée plutôt que son identifiant.
property Lua et wikicode Le nom de la propriété à utiliser, sous la forme property = PXX. En Lua, on peut utiliser plusieurs propriétés sous forme de tables
excludespecial Lua et wikicode Retire les déclarations dont la valeur principale (mainsnak) n'est pas de type "valeur", c'est-à-dire les déclarations "valeur inconnue" ou "aucune valeur".

En wikicode : activée par la |excludespecial = true
En Lua, activée par un booléen (excludespecial = true)

targetvalue Lua et wikicode Ne retient que la ou les déclarations dont la valeur du snak principal correspond à la (ou une des) valeurs indiquées
excludevalues Lua et wikicode Exclut les déclarations dont la valeur du snak principal correspond à la (ou une des) valeurs indiquées
targetclass Lua et wikicode Ne retient que la ou les déclarations dont la valeur du snak principal est une instance de la (ou d'une des) classes indiquées, éventuellement via des sous-classes
excludeclasses Lua et wikicode Exclut les déclarations dont la valeur du snak principal est une instance de la (ou d'une des) classes indiquées, éventuellement via des sous-classes
targetsuperclass Lua et wikicode Ne retient que la ou les déclarations dont la valeur du snak principal est une sous-classe (éventuellement indirecte) de la (ou d'une des) classes indiquées
excludesuperclasses Lua et wikicode Exclut les déclarations dont la valeur du snak principal est une sous-classe (éventuellement indirecte) de la (ou d'une des) classes indiquées
qualifier Lua et wikicode Seules les déclarations contenant ce qualificatif son retournées. Pour activer l'affichage du qualificatif, voir showqualifiers
qualifiervalue Lua et wikicode Le qualificatif utilisé par l'argument qualifier doit avoir cette valeur (ou une de ces valeurs, s'il s'agit d'une table ou d'une liste de propriétés séparées par des virgules
excludequalifier Lua et wikicode Les déclarations contenant ce qualificatif sont exclues
excludequalifiervalue Lua et wikicode Si ce paramètre est renseigné, excludequalifier n'est activé que lorsque la valeur du qualificatif se trouve dans celles qu'il indique.
withsource Lua et wikicode Ne retourne que les valeurs contenant une source, utilisant la source indiquée dans la propriété P248 (« affirmé dans »), ou une autre propriété définie par le paramètre sourceproperty. Pour accepter n'importe quelle source du moment qu'elle utilise la propriété demandée, mettre la valeur any. Pour désactiver ce paramètre, mettre la valeur -.
sourceproperty Lua et wikicode Propriété à utiliser pour le paramètre withsource
rank Lua et wikicocde Rangs acceptés :
  • preferred
  • normal
  • deprecated
  • valid (= preferred + normal)
  • best (preferred, ou, si aucune ne répond aux autres critères de la requête, normal)

Valeur par défaut : best

numval Lua et wikicode Nombre maximal de valeurs à retourner (les n premières valeurs de la liste établie par les autres paramètres)
withlink Lua et wikicode Ne retourne que les valeurs contenant un lien vers le site spécifié. Si la valeur du paramètre est simplement true, le site utilisé sera Wikipédia en français.
withdate Lua et wikicode Ne retourne que les valeurs possédant un qualificatif de date : P585 (« date »), P580 (« date de début »), P582 (« date de fin »)
atdate Lua et wikicode Exclut les valeurs dont les qualificatifs P580 (« date de début ») ou P582 (« date de fin ») indiquent qu'elle n'était pas valable à la période indiquée. atdate peut-être une date au format wikibase ou au format ISO. Les valeurs sans date ne sont pas exclues (elle peuvent l'être en ayant recours à la fonction withdate). Pour demander la valeur à la date d'aujourd'hui utiliser : |atdate = today.
minprecision Lua et Wikicode Degré de précision minimum accepté pour les données de type date. Doit être une valeur numérique correspondant au modèle de Wikidata (par exemple année = 9)
condition Lua Pour définir une fonction libre. Si la fonction retourne true, la déclaration sera gardée
sorttype Lua et wikicode Manière de classer les déclarations. Valeurs possibles :
  • chronological
  • inverted (chronologique inversé)
  • ascending par ordre croissant (données de type quantité)
  • descending par ordre décroissant (données de type quantité)
  • age par ordre chronologique des dates de naissances (données de type élément possédant des dates de naissance)
  • ageinverted par ordre chronologique inversé des dates de naissances (données de type élément possédant des dates de naissance)
  • language priorise certaines langues en les mettant en tête. Permet aussi de trier les qualificatifs, si utilisé en conjugaison avec showonlyqualifiers. Pour l'instant l'ordre est arbitraire, français, anglais en premier, des langues latines ensuite[1]
  • l'identifiant d'une propriété numérique utilisée dans les qualificatifs (par exemple P1545)
  • une fonction Lua (pour les appels depuis un module). Voir mw:extension:Scribunto/Lua reference manual#table.sort

Activation / désactivation de Wikidata

Nom Mode d'utilisation Description
value Lua et wikicode Lorsque le paramètre value est non vide, le module ne cherche pas les données de Wikidata, mais utilise celles fournies localement par ce paramètre. Les fonction formatAndCat en revanche lui applique linkback et addcat)
expl Lua et wikicode Lorsque le paramètre expl est présent, la fonction formatStatements ne fait rien si le paramètre value n'a pas la valeur résultat de {{WD}} (utile pour des données mises à jour mais dont l'utilité dans chaque article est difficile à décider automatiquement).

Mise en forme des données

Nom Niveau d'application Mode d'utilisation Description
conjtype liste des déclarations Lua et wikicode La manière de coordonner les déclarations, en utilisant la fonction conj de Module:Linguistique. Valeurs possibles :
  • and ajoute " et " entre l'avant dernière et la dernière valeur, une virgule entre les autres.
  • or ajout " ou " entre l'avant dernière et la dernière valeur
  • comma des virgules partout
  • new line un retour à la ligne

Toute autre valeur donnée au paramètre sera insérée entre chaque valeur (|conjtype = et puis aussi ajoutera "et puis aussi" entre chaque valeurs)

qualifconjtype snak Lua et wikicode Manière de coordonner les qualificatifs. Même fonctionnement que conjtype.
default liste des déclarations Lua et wikicode Résultat par défaut à afficher si l'import depuis Wikidata donne un résultat vide.
linkback liste des déclarations Lua et wikicode Ajoute un rétrolien vers Wikidata sous forme d'un crayon «  »
addcat liste des déclarations Lua et wikicode Met la page dans une catégorie de suivi (voir Catégorie:Page utilisant des données de Wikidata). Le nom de la catégorie correspond à la valeur du paramètre. Si cette valeur est simplement true, la catégorie est fonction du paramètre property.

Attention, ce paramètre peut être source de bugs. Par exemple, si la propriété est utilisée dans une url ou un lien.

removedupes choix des déclarations
(à la fin, dans une fonction différente)
Lua et wikicode Lorsque, après toutes les mises en forme, deux déclarations sont rendues de la même manière, une seule est conservée.
lang mise en forme des données Lua et Wikicode Langue dans lequel le texte doit être retourné.
snak (entité) Lua et wikicode Code Wikimédia de la langue utilisée pour afficher les libellés (par défaut : français)
wikidatalang snak (entité) Lua et Wikicode Code Wikimédia de la langue utilisée pour afficher les libellés en l'absence du français (ou de lang) et de l'anglais. Par défaut, la première langue dont il existe un libellé dans la liste Module:Wikidata/Hiérarchie des langues.
ucfirst liste des déclarations Lua et Wikicode Par défaut, la fonction formatStatements ajoute une majuscule en début de texte. |ucfirst=- permet de désactiver cela.
statementformat déclaration Lua doit être une fonction fonction(statement) return XX retournant une chaîne. Elle sera appliquée à sur chaque déclaration (permet de simplifier certaines infobox Lua)
showdate déclaration Lua et wikicode Pour afficher la date entre parenthèses en petit pour chaque déclaration en utilisant les mêmes qualificatifs que (withdate). Lorsqu'aucune date n'est trouvée, la valeur est affichée sans aucune date.
displayformat snak Lua et wikicode Pour changer le format par défaut entre chaque valeur.
  • weblink transforme les données de type chaîne en lien web
  • raw retourne un format plus brut parfois utile au codage
  • latitude et longitude pour Module:Coordinates
qualifdisplayformat snak Lua et wikicode Format d'affichage des qualificatifs. Même fonctionnement que le paramètre displayformat. Lorsque ce paramètre est laissé vide, les qualificatifs utilisent le paramètre displayformat comme la valeur principale.
showsource déclaration Lua et wikicode Identifiant d'une source que l'on souhaiterait voir affichée en référence si elle est présente.
linktopic snak (temporel) Lua et wikicode Type de lien à ajouter aux dates (voir Module:Date). Pour ne mettre aucun lien : linktopic = -
qualiflinktopic snak (entité) Lua et wikicode Même fonctionnement que le paramètre linktopic, applicable aux qualificatifs. Lorsque ce paramètre est laissé vide, les qualificatifs utilisent le paramètre linktopic comme la valeur principale.
precision snak (temporel) Lua et wikicode Précision avec laquelle les dates doivent être affichées. Valeurs possibles :
  • day
  • month
  • year

Valeur par défaut : day

qualifprecision snak Lua et wikicode Précision avec laquelle les qualificatifs temporels doivent être affichées. Même fonctionnement que precision.
textformat snak (temporel) Lua et wikicode Format d'affichage des intervalles de temps, tels que définis par Module:Date complexe
  • minimum affichera "1995" à la place de "à partir de 1995".
speciallabels snak (entité) Lua Tables de valeurs spéciales à utiliser à la place du libellé Wikidata pour la valeur de certains éléments, par exemple Module:Dictionnaire Wikidata/Métiers.female
labelformat snak (entité) Lua et wikicode (En Lua) fonction de mise en forme des libellés prenant comme argument un qid ; (en Lua ou en wikicode) l'une des chaînes de caractères suivantes :

En Lua, la valeur du paramètre peut aussi être une fonction applicable à un snak.

labelformat2 snak (entité) Lua Fonction de mise en forme des libellés prenant comme argument un libellé.
qualiflabelformat snak (entité) Lua et wikicode Mise en forme des libellés des qualificatifs. Même fonctionnement que le paramètre labelformat. Lorsque ce paramètre est laissé vide, les qualificatifs utilisent le paramètre labelformat comme la valeur principale.
qualiflabelformat2 snak (entité) Lua et wikicode Même fonctionnement que le paramètre qualiflabelformat appliqué à labelformat2. Ce dédoublement est provisoire (26/09/22)
showlang déclaration Lua et wikicode Lorsque la valeur principale est de type "texte monolingue", son code langue est affiché (utilisé par Module:Site officiel)
showqualifiers déclaration Lua et wikicode Qualificatif à retourner entre parenthèses derrière la valeur de la propriété principale demandée. En wikicode sous le format |showqualifiers = P460, en Lua sous le format showqualifiers = "P460" ou showqualifiers = {"P460", "P461"}
showonlyqualifier déclaration Lua et wikicode Qualificatif de même, mais à retourner seul sans la valeur de la propriété principale demandée
link snak (entité) Lua et wikicode Site vers lequel doivent lier les données de type élément. Par défaut : Wikidata en français. Si égal à "-", aucun lien ne sera créé.
qualiflink snak (entité) Lua et wikicode Site vers lequel doivent lier des qualificatifs. Même fonctionnement que le paramètre link. Lorsque ce paramètre est laissé vide, les qualificatifs utilisent le paramètre link comme la valeur principale.
defaultlink snak (entité) Lua et wikicode Lorsque le site demandé par le paramètre link ne retourne pas de lien, affiche un lien entre parenthèses vers le site demandé. Par défaut : Wikipédia en anglais ou, si absent, Wikidata. La valeur "-" désactive le paramètre.
qualifdefaultlink snak Lua et wikicode Même fonctionnement que defaultlink, applicable aux qualificatifs. Lorsque ce paramètre est laissé vide, les qualificatifs utilisent le paramètre defaultlink comme la valeur principale.
defaultlinkquery snak (entité) Lua defaultlinkquery = {property = 'P279'} le lien créé correspondra à celui fourni par l'élément utilisé dans la propriété P279 (« sous-classe de »).
qualifdefaultlinkquery snak Lua et wikicode Même fonctionnement que defaultlinkquery, applicable aux qualificatifs. Lorsque ce paramètre est laissé vide, les qualificatifs utilisent le paramètre defaultlinkquery comme la valeur principale.
targetunit snak (quantité) Lua et Wikicode Unité dans laquelle doivent être converties les données de type quantité. Les valeurs possibles sont visibles dans Module:Conversion/Données, par exemple km ou km2.
qualiftargetunit snak Lua et Wikicode Unité dans laquelle doivent être converties les qualificatifs de type quantité.
showunit snak (quantité) Lua et Wikicode

Manière d'afficher l'unité demandée. Valeurs possibles :

  • 'long' : affiche le nom complet de l'unité (par exemple "12,7 mètres")
  • 'short' affiche l'abréviation conventionnellement utilisée ("12,7 m")
  • '-' : aucune unité affichée

défaut : 'short'

rounding snak (quantité) nombre de chiffres Lua et Wikicode Nombre de chiffres significatifs à afficher dans les données de type quantité, après conversion éventuelle (défaut : dépend de la précision indiquée sur Wikidata)
urlpattern snak (string) Lua et wikicode La valeur du paramètre est un chaîne représentant une URL, l'expression "$1" sera remplacée par la valeur Wikidata
Avec la propriété P214 (« identifiant VIAF ») et la valeur de paramètre http://viaf.org/viaf/$1, la valeur de l'identifiant VIAF stockée sur Wikidata sera utilisée pour créer un lien externe..
text snak (string) Lua et wikicode Texte à afficher lorsque la valeur crée un lien externe, c'est-à-dire pour les données de type chaîne avec displayformat = "weblink" ou avec le paramètre urlpattern renseigné. Par défaut : la valeur initiale de la déclaration. Utilisé sur Module:Site officiel Module:Bases archi.
novaluelabel snak (novalue) Lua et wikicode Libellé à retourner lorsque la valeur est de type "novalue" (aucune valeur). Par défaut : "-".

En Lua, la valeur peut-être une fonction.

unknownlabel snak (somevalue) Lua et wikicode Libellé à retourner lorsque la valeur est de type "somevalue" (valeur inconnue). Par défaut : "inconnu".

En Lua, la valeur peut-être une fonction.

returnnumberofvalues liste des déclarations Lua retourne en deuxième valeur le nombre de valeurs récupérées par getClaims (si la fonction est appelée depuis du Wikicode, le nombre sera concaténé au reste de la chaîne retournée

Exemples

Définition des liens

Code Rendu Remarques
{{#invoke:Wikidata|frameFun|formatStatements|entity = Q79 | property = P36}} Le Caire Capitale de l'Égypte, format standard
{{#invoke:Wikidata|frameFun|formatStatements|entity = Q79 | property = P36|link=-}} Le Caire Capitale de l'Égypte, sans lien
{{#invoke:Wikidata|frameFun|formatStatements|entity = Q79 | property = P36|link=wikidata}} Le Caire Capitale de l'Égypte, avec lien vers Wikidata
{{#invoke:Wikidata|frameFun|formatStatements|entity = Q937 | property = P569}} Date de naissance d'Albert Einstein, en utilisant le format standard de Wikipédia en français
{{#invoke:Wikidata|frameFun|formatStatements|entity = Q937 | property = P569|linktopic = football }} Date de naissance d'Einstein, avec liens spécialisés dans le football
{{#invoke:Wikidata|frameFun|formatStatements|entity = Q937 | property = P569|linktopic = -}} Date de naissance d'Einstein, sans lien

Rang

Il existe trois types de rang sur Wikidata : "normal", "preferred" et "deprecated". Le rang deprecated est réservé aux données que l'on sait fausse mais que l'on garde pour mémoire, par exemple pour documenter une croyance ancienne qui a été infirmée par des études plus récentes.

Par défaut, seul le rang "preferred" est récupéré, mais le paramètre "rank" permet de changer cela.

Code Rendu Remarques
{{#invoke:Wikidata|frameFun|formatStatements|entity =Q12418 | property = P186}} Peinture à l'huile (en) et panneau de peuplier (d) Matériau de la Joconde, affichage par défaut (donc seulement celles avec le rang "preferred" s'il y en a)
{{#invoke:Wikidata|frameFun|formatStatements|entity =Q12418 | property = P186|rank=valid}} Peinture à l'huile (en), panneau de peuplier (d) et bois rank = "valid" accepte les valeur de rang "normal" et "preferred" (par exemple, le matériau d'un chassis qui a été ajouté ultérieurement à la Joconde)
{{#invoke:Wikidata|frameFun|formatStatements|entity =Q12418 | property = P186|rank=normal}} Bois rank = "normal" ne récupère que les données avec un rang "normal", et ignore celles avec un rang "preferred"

Qualificatifs

Les qualificatifs sont des données supplémentaires intégrées à une affirmation Wikidata qu'elle permet de préciser.

Code Rendu Remarques
{{#invoke:Wikidata|frameFun|formatStatements|entity =Q12418 | property = P186|showqualifiers = P518}} Panneau de peuplier (d) ne retient que les valeurs ayant un qualificatif P518 (« s'applique à »)
{{#invoke:Wikidata|frameFun|formatStatements|entity =Q12418 | property = P186|qualifier = P518|qualifiervalue=Q1737943}} Bois qualifiervalue définit la valeur que possède le qualificatif. Ici, Q1737943 (« châssis ») précise que l'on demande la matériau du chassis. Notez qu'aucune valeur de rang "preferred" n'étant trouvé, un valeur de rang "normal" est retournée.
{{#invoke:Wikidata|frameFun|formatStatements|entity =Q12418 | property = P186|showqualifiers = P518|rank=valid}} Peinture à l'huile (en), panneau de peuplier (d) (support de peinture) et bois (châssis) showqualifiers affiche la valeur des qualificatifs demandé entre parenthèse, après la valeur principale
{{#invoke:Wikidata|frameFun|formatStatements|entity =Q12418 | property = P186|showdate = true|rank=valid}} Peinture à l'huile (en), panneau de peuplier (d) et bois (depuis ) si des qualificatifs indiquant la date sont fournis, ils sont affichées

Affichage des sources

{{#invoke:Wikidata|frameFun|formatStatements|entity =Q12418 | property = P276|sourceproperty = P854}} Salle 711 (d)
{{#invoke:Wikidata|frameFun|formatStatements|entity =Q11879536 | property = P460|withsource=Q1645493}} Lisa Gherardini
{{#invoke:Wikidata|frameFun|formatStatements|entity =Q11879536 | property = P460|withsource=Q1645493|showsource=true}} Lisa Gherardini[2],[3] Montre seulement les valeurs données par la source
{{#invoke:Wikidata|frameFun|formatStatements|entity =Q153 | property = P231|showsource=true}} 64-17-5[4],[5],[6]
{{#invoke:Wikidata|frameFun|formatStatements|entity =Q153 | property = P231|showsource=only}} [4],[5],[6]
  1. Introduit pour trier les Modèle:P' dans des {{|Infobox Patrimoine mondial}} par exemple, cf. cette discussion.
  2. Giorgio Vasari, Le vite de piu eccellenti architetti, pittori, et scultori italiani, da Cimabue insino a' tempi nostri (œuvre littéraire), et .Voir et modifier les données sur Wikidata
  3. « https://web.archive.org/web/20110508121954/http://www.ub.uni-heidelberg.de/Englisch/news/monalisa.html » (consulté le )
  4. a et b ChEBI (ontologie), EBI, consulté le .Voir et modifier les données sur Wikidata
  5. a et b Global Substance Registration System (base de données en ligne), consulté le .Voir et modifier les données sur Wikidata
  6. a et b CAS Common Chemistry (base de données en ligne), consulté le .Voir et modifier les données sur Wikidata

Autres options

Code Rendu Remarques
{{#invoke:Wikidata|frameFun|formatStatements|entity = Q937 | property = P106|conjtype = new line|showdate= true}} John Lennon (-)
Ringo Starr ( - )
Paul McCartney (-)
George Harrison (-)
conjtype permet de définir le séparateur entre les valeurs (voir Module:Linguistique). Ici "new line" indique qu'il faut revenir à la ligne après chaque valeur.
{{#invoke:Wikidata|frameFun|formatStatements|entity =Q205309 | property = P793|showdate=true|sorttype=chronological|conjtype =new line}} Construction ()
Premier match (d) ()
Rénovation (-)
Rénovation (-)
Démolition ()
Fermeture (en) ()
sorttype = chronological tente de classer les valeurs par ordre chronologique (en se basant sur les qualificatifs). Ici : les événements principaux (d:P:P793) dans l'histoire de l'ancien Stade d'Arsenal.
{{#invoke:Wikidata|frameFun|formatStatements|entity =Q205309 | property = P793|showdate=true|sorttype=inverted|conjtype = new line}} Fermeture (en) ()
Démolition ()
Rénovation (-)
Rénovation (-)
Premier match (d) ()
Construction ()
sorttype = inverted pour inverser l'ordre chronologique
{{#invoke:Wikidata|frameFun|formatStatements|entity =Q4470 | property = P50|showdate=true|sorttype=P1545|conjtype = new line}} Robert Jordan
Brandon Sanderson
sorttype = P1545 pour trier dans l'ordre de la série
{{#invoke:Wikidata|frameFun|formatStatements|entity = Q230 | property = P1448 | sorttype = language}} Géorgie (la), Georgia, Gruzie, Georgien, საქართველო, Грузия, Sakartvelas et Gruzija sorttype = language pour prioriser certaines langues dans les noms officiels
{{#invoke:Wikidata|frameFun|formatStatements|entity = Q2015257 | property = P1435|targetvalue = Q9259 |showonlyqualifier = P1448| sorttype = language}} Sanctuaire de l'oryx arabe, Arabian Oryx Sanctuary et Santuario del Oryx árabe sorttype = language pour prioriser certaines langues dans les noms officiels, cette fois en utilisant "showonlyqualifier" parce que les noms sont stockés en qualificatif de déclarations
{{#invoke:Wikidata|frameFun|formatStatements|entity =Q12418 | property = P186|displayformat=raw}} Q296955 et Q106857865 affiche les identifiants des valeurs (essentiellement utile pour la programmation)
{{#invoke:Wikidata|frameFun|formatStatements|entity =Q12418 | property = P186|numval=1}} Peinture à l'huile (en) retourne les numval première valeurs répondant au reste de la requête (utile notamment pour récupérer une image)
{{#invoke:Wikidata|frameFun|formatStatements|entity=Q535922 | property=P172 |expl= |value={{WD}} }} avec expl=, pour que la valeur soir retournée il faut value={{WD}}


--script that retrieves basic data stored in Wikidata, for the datamodel, see https://www.mediawiki.org/wiki/Extension:Wikibase_Client/Lua


local p = {}
local linguistic = require('Module:Linguistique')
local dates = require('Module:Wikidata/Dates')
local langmodule = require('Module:Langue')
local convertlangcode = require('Module:Dictionnaire Wikidata/Codes langue')
local formatText = require('Module:Format')
lang = 'fr' -- peut-être écrasé par args.lang

local i18n = {
    ["errors"] = {
        ["property-param-not-provided"] = "property parameter missing",
        ["qualifier-param-not-provided"] = "qualifier parameter missing",
        ["entity-not-found"] = "entity not found",
        ["unknown-claim-type"] = "unknown claim type",
        ["unknown-snak-typeg"] = "unknown snak type",
        ["unknown-datavalue-type"] = "unknown datavalue type.",
        ["unknown-entity-type"] = "unknown entity type",
        ["invalid-id"] = "invalid ID"
    },
    ["no-label"] = "pas de libellé",
    ['no description'] = "pas description",
    ["novalue"] = "not applicable",
    ["somevalue"] = "inconnu",
    ["trackingcat"] = 'Page utilisant des données de Wikidata'
}

local function formatError( key )
    return error(i18n.errors[key])
end

local function addtrackingcat(prop, cat)
	if not prop and not cat then
		return error("no property provided")
	end
	if not cat then
		cat = i18n.trackingcat .. '/' .. string.upper(prop)
	end
	return '[[Category:' .. cat .. ']]'
end

function formatTheUnknown() -- voir si on peut accorder/adapter l'usage de "inconnu"
	return i18n.somevalue
end

local function samevalue(snak, target)
	if snak.snaktype == 'value' and p.getRawvalue(snak) == target then
		return true
	end
end

function showlang(statement) -- retourne le code langue entre paranthèse avant la valeur (par exemple pour les biblios et liens externes)
	local mainsnak = statement.mainsnak
	if mainsnak.snaktype ~= 'value' then
		return
	end
	local langlist = {}
	if mainsnak.datavalue.type == 'monolingualtext' then
		langlist = {mainsnak.datavalue.value.language}
	elseif (not statement.qualifiers) or (not statement.qualifiers.P407) then
		return
	else
		for i, j in pairs( statement.qualifiers.P407 ) do
			if  j.snaktype == 'value' then
				local val =   convertlangcode[j.datavalue.value['numeric-id']]
				table.insert(langlist, val)
			end
		end
	end
	if (#langlist > 1) or (#langlist == 1 and langlist[1] ~= 'fr') then -- si c'est en français, pas besoin de le dire
		return langmodule.indicationMultilingue(langlist)
	end
end

local function getEntity( val )
	if type(val) == 'table' then
		return val
	end
	return mw.wikibase.getEntityObject(val)
end

local function formattable(statements, params) -- transform a table of claims into a table of formatted values
    for i, j in pairs(statements) do
        j = p.formatStatement(j, params)
    end
    return statements
end

local function tableToText(values, params) -- takes a list of already formatted values and make them a text
    if not values then
        return nil
    end
    return linguistic.quickconj( values, params.conjtype)--linguistic.conj( values, params.lang, params.conjtype )
end

function p.getDate(statement)
--[[
return a "timedata" object as used by the date modules with the date of an item from the p580, p582 and p585 qualifiers 
	object format:
		* timestamp 28 char string value for the timepoint, or if non the beginning or if none, the end (for easy sorting)
		* timepoint: snak
		* begin: snak
]]--
	local q = statement.qualifiers
	if not q or not (q.P585 or q.P580 or q.P582) then
		return nil
	end
	if q.P585 and q.P585[1].snaktype == 'value' then -- P585: punctual date
		return dates.dateobject(q.P585[1].datavalue.value)
	end
	local begin, ending

	if q.P582 and q.P582[1].snaktype == 'value' then
		ending = dates.dateobject(q.P582[1].datavalue.value)
	end
	if q.P580 and q.P580[1].snaktype == 'value' then 
		begin = dates.dateobject(q.P580[1].datavalue.value)
	end
	return dates.daterange(begin, ending)
end

function p.getFormattedDate(statement, params)
	local datetable = p.getDate(statement)
	if not datetable then
		return nil
	end
	return dates.objecttotext(datetable, params)
end

local function withtargetvalue(claims, targetvalue)
    targetvalue = string.upper(targetvalue)
    local oldclaims = claims
    local claims = {}
    for i, statement in pairs(oldclaims) do
        if samevalue(statement.mainsnak, targetvalue) then
                table.insert(claims, statement)
        end
    end
    return claims
end

local function validclaims(claims)
    local oldclaims = claims
    local claims = {}
    for i, statement in pairs(oldclaims) do
        if statement.rank == 'preferred' or statement.rank == 'normal' then
                table.insert(claims, statement)
        end
    end
    return claims
end

local function withrank(claims, rank)
    if rank == 'best' then
        local preferred = withrank(claims, 'preferred')
        if #preferred > 0 then
            return preferred
        else
            return withrank(claims, 'normal')
        end
    end
   
    if rank == 'valid' then
        return validclaims(claims)
    end
   
    local oldclaims = claims
    local claims = {}
    for i, statement in pairs(oldclaims) do
        if statement.rank == rank then
                table.insert(claims, statement)
        end
    end
    return claims
end

local function withqualifier(claims, qualifier, qualifiervalue)
    qualifier = string.upper(qualifier)
   if type(qualifiervalue) == string then
   		qualifiervalue = {qualifiervalue}
   	end
    local oldclaims = claims
    local claims = {}
    for i, statement in pairs(oldclaims) do
        if statement.qualifiers and statement.qualifiers then
            if qualifiervalue ~= '' then
                for j, qualif in pairs(statement.qualifiers[qualifier]) do
                	local foundval = p.getRawvalue(qualif)
                    for k, targetval in pairs(qualifiervalue) do
	                    if foundval == targetval then
    	                    table.insert(claims, statement)
        				end
                    end
                end
            else
                table.insert(claims, statement)
            end
        end
    end
    return claims
end
local function withsource(claims, source, sourceproperty)
    local oldclaims = claims
    local claims = {}
    sourceproperty = string.upper(sourceproperty or 'P248')
    local sourcevalue = string.upper(source or '')
    for i, statement in pairs(oldclaims) do
        local success
        if statement.references then
            for j, reference in pairs(statement.references) do
                if success then break end -- sp that it does not return twice the same reference when the property is used twice
                for prop, content in pairs(reference.snaks) do
                    if prop == sourceproperty then
                        if sourcevalue == '' then
                            table.insert(claims, statement)
                            success = true
                        else
                            for l, m in pairs(content) do
                                if p.getRawvalue(m) == source then
                                    table.insert(claims, statement)
                                    success = true
                                end
                            end
                        end
                    end
                end
            end
        end
    end
    return claims
end

local function withdate(claims)
    local oldclaims = claims
    local claims = {}
    for i, statement in pairs(oldclaims) do
    	if statement.qualifiers and (statement.qualifiers['P585'] or statement.qualifiers['P580'] or statement.qualifiers['P582']) then
    		table.insert(claims, statement)
    	end
	end
	return claims
end

local function isinlanguage(claims, lang) -- ne fonctionne que pour les monolingualtext / étendre aux autres types en utilisant les qualifiers ?
	local newclaims = {}
	for i, j in pairs(claims) do 
		if j.mainsnak.snaktype == 'value' and j.mainsnak.datavalue.type == 'monolingualtext' then
			if j.mainsnak.datavalue.value.language == lang then
				table.insert(newclaims,j)
			end
		end
	end
	return newclaims
end

local function excludespecial(claims)
    local oldclaims = claims
    local claims = {}
    for i, statement in pairs(oldclaims) do
        if statement.mainsnak.snaktype == 'value' then
            table.insert(claims, statement)
        end
    end
    return claims
end

local function comparedate(a, b) -- returns true if a is earlier than B or if a has a date but not b
	if a and b then
		return a.timestamp < b.timestamp
	elseif a then
		return true
	end
end

local function chronosort(claims, inverted)
	table.sort(claims, function(a,b)
		local timeA = p.getDate(a)
		local timeB = p.getDate(b)
		if inverted then 
			return comparedate(timeB, timeA)
		else
			return comparedate(timeA, timeB)
		end
		end
	)
	return claims
end

function p.sortclaims(claims, sorttype)
	if sorttype == 'chronological' then
		return chronosort(claims)
	elseif sorttype == 'inverted' then
		return chronosort(claims, true)
	elseif type(sorttype) == 'function' then
		table.sort(claims, sorttype)
		return claims
	end
	return claims
end

local function numval(claims, numval)
    local numval = tonumber(numval) or 0 -- raise a error if numval is not a positive integer ?
    local newclaims = {}
    for i, j in pairs(claims) do
        if #newclaims == numval then
            return newclaims
        end
        table.insert(newclaims,j)
    end
    return newclaims
end

function p.getRawvalue(snak)
    return p.getDatavalue(snak, {format = 'raw'})
end

function p.getDatavalue(snak, params)
	if not params then  
		params = {} 
	end
	local formatting = params.formatting
    if snak.snaktype ~= 'value' then
        return nil
    end
   
    local datatype = snak.datavalue.type
    local value = snak.datavalue.value
    local displayformat = params.format or params.displayformat -- params.format is deprecated
    if datatype == 'wikibase-entityid' then
        if displayformat == 'raw' then
            return "Q" .. tostring(value['numeric-id'])
        elseif type(displayformat) == 'function' then
        	return displayformat(snak, params)
        else
            return p.formatEntity('Q' .. value['numeric-id'], params)
        end
       
    elseif datatype == 'string' then
        if params.displayformat == 'weblink' then
            return require('Module:Weblink').makelink(value, params.showntext)
        elseif params.urlpattern then
        	value = '[' .. mw.ustring.gsub(params.urlpattern, '$1', value) .. ' ' .. value .. ']'
        end
        return value

	elseif datatype == 'time' then -- format example: +00000001809-02-12T00:00:00Z
		local precision = params.precision -- degré de précision à afficher ('day', 'month', 'year'), inférieur ou égal à value.precision
		if formatting == 'raw' then
			return value.time
		else
			return dates.objecttotext(dates.dateobject(value, {precision = precision}))
		end

	elseif datatype == 'globecoordinate' then
		-- retourne une table avec clés latitude, longitude, précision et globe à formater par un autre module (à changer ?)
		value.globe = require('Module:Wikidata/Globes')[value.globe] -- transforme l'ID du globe en nom anglais utilisable par geohack
		if formatting == 'latitude' then
			return value.latitude
		elseif formatting == 'longitude' then
			return value.longitude
		else
			return value -- note : les coordonnées Wikidata peuvent être utilisée depuis Module:Coordinates. Faut-il aussi autoriser à appeler Module:Coordiantes ici ?
		end
		

    elseif datatype == 'quantity' then -- todo : gérer les paramètre précision
        if displayformat == 'raw' then
            return value.amount
        else
            local str = string.sub(value.amount,2) -- 
            return formatText.do_formatnum({str})
        end
	elseif datatype == 'monolingualtext' then
		return langmodule.langue({value.language, value.text})
    else
        return formatError('unknown-datavalue-type' )
    end
end

local function getMultipleClaims(args)
	local newargs = args
	local claims = {}
	for i, j in pairs(args.property) do
		newargs.property = j
		local newclaims = p.getClaims(args)
		for k, l in pairs(newclaims) do
			table.insert(claims, l)
		end
	end
	return claims
end 
function p.getClaims( args ) -- returns a table of the claims matching some conditions given in args
    if not args.property then
        return formatError( 'property-param-not-provided' )
    end
    if type(args.property) == 'table' then
    	return getMultipleClaims(args)
    end
    --Get entity
    if args.item then args.entity = args.item end -- synonyms
    local entity = args.entity
    if type(entity) ~= 'table' then
        entity = getEntity( args.entity )
    end
	if (not entity) or (not entity.claims) then 
		return nil 
	end
	local property = string.upper(args.property)
	local claims = entity.claims[property]
	if not claims then return nil end
    -- mettre ~= '' pour le cas ou le paramètre est écrit mais laissé blanc ({{#invoke:formatStatements|property=pXX|targetvalue = xx}})
    if args.targetvalue and args.targetvalue ~= '' then
        claims = withtargetvalue(claims, args.targetvalue)
    end

    if args.qualifier and args.qualifier ~= '' then
        claims = withqualifier(claims, args.qualifier, args.qualifiervalue)
    end
  
    if (args.source and args.source ~= '') or (args.sourceproperty and args.sourceproperty ~= '') then
        claims = withsource(claims, args.source, args.sourceproperty)
    end
    
    if (args.withdate and args.withdate ~= '') then
        claims = withdate(claims)
    end
   	if (args.isinlanguage and args.isinlanguage ~= '')  then
   		claims = isinlanguage(claims, args.inlanguage)
   	end
    if args.excludespecial and args.excludespecial ~= '' then
        claims = excludespecial(claims)
    end

    if args.rank ~= 'all' then
        if not args.rank or args.rank == '' then
            args.rank = 'best'
        end
        claims = withrank(claims, args.rank)
    end
    
    if args.sorttype then 
    	claims = p.sortclaims(claims, args.sorttype)
    end
    
    if args.numval and args.numval ~= '' then  --keep at the end, after other filters have been implmented
        claims = numval(claims, args.numval)
    end
    if #claims > 0 then
	    return claims
	end
end

function p.formatClaimList(claims, args)
    if not claims then
        return nil
    end
	for i, j in pairs(claims) do
        claims[i] = p.formatStatement(j, args)
    end
    return claims
end

function p.stringTable(args) -- like getClaims, but get a list of string rather than a list of snaks, for easier manipulation
    local claims = p.getClaims(args)
    return p.formatClaimList(claims, args)
end


local function getQualifiers(statement, qualifs, params)
	if not statement.qualifiers then 
		return nil
	end
	local vals = {} 
	for i, j in pairs(qualifs) do
		if statement.qualifiers[j] then
			for k, l in pairs(statement.qualifiers[j]) do
				table.insert(vals, l)
			end
		end
	end
	if #vals == 0 then
		return nil
	end
	return vals
end 

function p.getFormattedQualifiers(statement, qualifs, params)
	if not params then params = {} end
	local qualiftable = getQualifiers(statement, qualifs)
	if not qualiftable then
		return nil
	end
	for i, j in pairs(qualiftable) do
		qualiftable[i] = p.formatSnak(j, params)
	end
	return linguistic.conj(qualiftable)
end

function p.formatStatement( statement, args )
	if not args then args = {} end
    if not statement.type or statement.type ~= 'statement' then
        return formatError( 'unknown-claim-type' )
    end
    local str = p.formatSnak( statement.mainsnak, args )
    if args.showlang == true then
    	str = (showlang(statement) or '') .. str
    end
    if args.showqualifiers then 
    	local qualifs =  args.showqualifiers
    	if type(qualifs) == 'string' then
    		qualifs = mw.text.split(qualifs, ',')
    	end
    	local foundvalues = p.getFormattedQualifiers(statement, qualifs, args)
    	if foundvalues then
    		str = str .. linguistic.inparentheses(foundvalues, lang) 
		end
	end
    
    if args.showdate then -- when "showdate and chronosort are both set, date retrieval is performed twice
    	local timedata = p.getDate(statement)
    	if timedata then
    		local formatteddate = dates.objecttotext(timedata, args)
    		formattteddate = linguistic.inparentheses(formatteddate, lang)
    		str = str .. '<small>' .. formattteddate ..'</small>'
    	end
    end

    if args.showsource and statement.references then --[[needs abritrary access   
    	local sourcestring = ''
        for i, ref in pairs(statement.references) do
            if ref.snaks.P248 then
                for j, source in pairs(ref.snaks.P248) do
                    if source.snaktype == 'value' then
                    	local page
                    	if ref.snaks.P304 and ref.snaks.P304[1].snaktype == 'value' then
                    		page = ref.snaks.P304[1].datavalue.value
                    	end
                        local s = require('Module:Cite/sandbox').citeitem('Q' .. source.datavalue.value['numeric-id'], lang, page)
                        s = mw.getCurrentFrame():extensionTag( 'ref', s )
                        sourcestring = sourcestring .. s
                    end
                end
            elseif ref.snaks.P854 and ref.snaks.P854[1].snaktype == 'value' then
            	s = mw.getCurrentFrame():extensionTag( 'ref', formatLink(ref.snaks.P854[1].datavalue.value))
            	sourcestring = sourcestring .. s
            end
        end 
        str = str .. sourcestring ]]--
    end
    return str
end

function p.formatSnak( snak, params )
    if not args then args = {} end -- pour faciliter l'appel depuis d'autres modules
    if snak.snaktype == 'somevalue' then
        return formatTheUnknown()
    elseif snak.snaktype == 'novalue' then
        return i18n['novalue'] --todo
    elseif snak.snaktype == 'value' then
        return p.getDatavalue( snak, params)
    else
        return formatError( 'unknown-snak-type' )
    end
end

function p._getLabel(entity, default, inlanguage)
	local label
	if not entity then
		return nil
	end
	if inlanguage then -- cherche dans l'élément complet s'il est déjà chargé, ou s'il faut une libellé non-français, inacessible par  mw.wikibase.label
		entity = getEntity(entity)
	end
	if type(entity) == 'table' then
		if entity and entity.labels and entity.labels[lang] then
			label = entity.labels[lang].value
		end
	else
		label = mw.wikibase.label(entity)
	end
	if label then 
		return label
	end
	
    if default == 'nolabel' then
        return i18n['no-label']
    end
    return entity.id
end

function p._getDescription(entity, lang)
	if type(entity) ~= 'table' then
		entity = getEntity(entity)
	end
    if not entity.descriptions then
    	return i18n['no description']
    end
    local descriptions = entity.descriptions
    if not descriptions then 
    	return nil
    end
    if descriptions[lang] then
    	return descriptions[lang].value
    end
    local fblist = require('Module:Fallback').fblist(lang) -- list of fallback languages in no label in the desired language
    for i, j in pairs (mw.language.getFallbacksFor(lang)) do
        if descriptions.lang then
        	return descriptions[lang].value
        end
    end
    if default == 'nolabel' then
        return i18n['no-label']
    end
    return entity.id
end

local function formattedLabel(label, entity, args)
	if not args then 
		args = {}
	end
    if args.link== '-' then
        return label
    end
    local link = mw.wikibase.sitelink( entity )
	if not link then
		link = 'd:' .. entity
	end
	return '[[' .. link .. '|' .. label .. ']]'
end


function p.getmainid(claim)
	if claim and claim.mainsnak.snaktype == 'value' then
		return 'Q' .. claim.mainsnak.datavalue.value['numeric-id']
	end
end

function p.formatEntity( entity, args )
    local label = p._getLabel(entity, lang)
    if not label then
    	label = entity
    end
    return formattedLabel(label, entity, args)
end


function p.getLabel(frame) -- simple for simple templates like {{Q|}}}
	local args = frame.args
    local entity = args.entity
    local lang = lang
    if args.lang and args.lang ~= '' then
        lang = args.lang
    end
    if string.sub(entity, 1, 10) ==  'Property:P' then 
    	entity = string.sub(entity, 10)
    elseif (string.sub(entity, 1, 1) ~= 'P' and string.sub(entity, 1, 1) ~= 'Q') or (not tonumber(string.sub(entity, 2))) then
        return i18n.errors['invalid-id']
    end
    if not args.link or args.link == '' then -- by default: no link
    	args.link = '-'
    end
    if args.link == '-' then
    	return p._getLabel(entity, lang) or  i18n.errors['invalid-id']
    else
    	lang = lang
    	return p.formatEntity(entity, args)
    end
end

function p._formatStatements( args )--Format statement and concat them cleanly
	if args.value == '-' then 
		return nil
	end
	--If a value is already set, use it
	if args.value and args.value ~= '' then
		return args.value
	end
    local valuetable = p.stringTable(args)
    return tableToText(valuetable, args)
end

function p._formatAndCat(args) 
	local val = p._formatStatements( args )
	if val then
		return val .. addtrackingcat(args.property)
	end
end

function p.getTheDate(args)
	local claims = p.getClaims(args)
	if not claims then
		return nil
	end
	local formattedvalues = {}
	for i, j in pairs(claims) do
		table.insert(formattedvalues, p.getFormattedDate(j))
	end
	local val = linguistic.conj(formattedvalues)
	if val and args.addcat == true then
		return val .. addtrackingcat(args.property)
	else 
		return val
	end
end
---FONCTIONS depuis le FRAME 
function p.getaDate(frame)
	return p.getTheDate(frame.args)
end


function p.getQualifier( frame )
	local claims = p.getClaims(frame.args)
	local str = ''
	local qualifs = frame.args.qualifiers or frame.args.qualifier 
	if not qualifs then
		return formatError( 'property-param-not-provided' )
	end
	qualifs =  mw.text.split(qualifs, ',')
	for i, j in pairs(claims) do 
		local new = p.getFormattedQualifiers(j, qualifs) or ''
		str = str .. new
	end
	return str
end

function p.getDescription(frame) -- simple for simple templates like {{Q|}}}
    local entity = frame.args.entity
    if frame.args.lang then
    	lang = frame.args.lang
    end
    if (string.sub(entity, 1, 1) ~= 'P' and string.sub(entity, 1, 1) ~= 'Q') or (not tonumber(string.sub(entity, 2))) then
        return i18n.errors['invalid-id']
    end
    return p._getDescription(entity, lang) or  i18n.errors['invalid-id']
end

function p.numOfClaims(frame)
	local claims = p.getClaims(frame.args)
	if claims then
		return #claims
	else
		return 0
    end
end

function p.formatStatements( frame )
	local args = {}
	if frame == mw.getCurrentFrame() then
		args = frame:getParent().args -- paramètres du modèle appelant (est-ce vraiment une bonne idée ?)
		for k, v in pairs(frame.args) do
			args[k] = v
		end
	else
		args = frame
	end
	return p._formatStatements( args )
end

function p.formatAndCat(frame) 
	local args = {}
	if frame == mw.getCurrentFrame() then
		args = frame:getParent().args -- paramètres du modèle appelant (est-ce vraiment une bonne idée ?)
		for k, v in pairs(frame.args) do
			args[k] = v
		end
	else
		args = frame
	end
	return p._formatAndCat( args )
end

return p