# Initiation au Lua avec Scribunto/L'objet Title

Nous devons pas perdre de vue que le Lua a été implanté avec Scribunto afin de faciliter la gestion des pages se trouvant dans les différents projets de la fondation Wikimédia. Nous allons donc voir, dans ce chapitre, comment accéder à ces pages et plus précisément, comment accéder à divers renseignements concernant ces pages. Que ce soit le contenu des pages, le titre, ou d'autres renseignements, nous allons voir que nous disposons de toute une palette de fonctions utiles et pratiques qu’il nous faut bien maîtriser.

## La librairie Title

Dans ce paragraphe, nous allons étudier en détail les fonctions se trouvant dans la librairie Title.

#### mw.title.new

Cette commande est essentielle car c’est elle qui va créer un nouvel objet Title concernant la page passée en argument. Cette commande renvoie une table contenant tout ce qui est nécessaire pour obtenir des renseignements concernant la page rentrée en argument. Par exemple :
après :
Les tables title1 et title2 contiendront tout ce qui est nécessaire pour obtenir des renseignements respectivement sur les pages dont les noms sont contenus dans les variables page1 et page2.
Comme exemple d'application, voir tous les exemples donnés ci-dessous car, sans cette commande, aucun accès aux pages n'est possible.
* Nous devons aussi notez que cette commande est très vorace en temps d'exécution. En conséquence, il n’est pas autorisé de l’utiliser plus de 99 fois dans une même page. Voir : mw:Manual:$wgExpensiveParserFunctionLimit
* Contrairement à ce que l’on pourrait croire à priori, si la page entrée en argument n'existe pas, un objet title est tout de même créé. C'est à l'intérieur de cet objet title que l’on aura des indications sur l'existence ou non de la page

#### mw.title.getCurrentTitle

Cette fonction crée un objet Title comme le ferait la fonction title.new mais concernant la page ou se trouve le module contenant la fonction. Si le module contenant cette fonction se trouve dans un modèle, la fonction retournera le titre de la page dans laquelle le modèle est placé.
Pour un exemple d'utilisation, voir le sous- paragraphe title.text plus bas, dans cette page.

#### mw.title.makeTitle

Nous avons ici une troisième fonction qui créé un objet Title. Sa particularité est que le titre de la page, dont on veut créer l’objet Title, est fourni par morceaux à travers ses paramètres.
mw.title.makeTitle(Espace,titre,fragment, interwiki)
Pour le paramètre espace, on rentrera le numéro ou le nom de l'espace où se trouve la page.
Pour la Wikiversité, nous donnons la correspondance entre le numéro d'espace et le nom d'espace dans le tableau suivant :
* 0 : Espace principal.
* 1 : Discussion de l'espace principal.
* 2 : Espace utilisateur.
* 3 : Espace discussion utilisateur.
* 4 : Espace Wikiversité.
* 5 : Espace discussion Wikiversité.
* 6 : Espace fichier.
* 7 : Espace discussion fichier.
* 8 : Espace média wiki.
* 9 : Espace discussion média wiki.
* 10 : Espace modèle.
* 11 : Espace discussion modèle.
* 12 : Espace aide.
* 13 : Espace discussion aide.
* 14 : Espace catégorie.
* 15 : Espace discussion catégorie.
* 102 : Espace projet
* 103 : Espace discussion projet
* 104 : Espace recherche
* 105 : Espace discussion recherche
* 106 : Espace faculté
* 107 : Espace discussion faculté
* 108 : Espace département
* 109 : Espace discussion département
* 110 : Espace transwiki
* 111 : Espace discussion transwiki
* 828 : Espace module
* 829 : Espace discussion module
Pour le paramètre titre, on rentrera le titre de la page, sans préfixe.
Pour le paramètre fragment, on rentrera le fragment. Qu’est ce qu'un fragment ? voir à le propos la page Identificateur de fragment
Pour le paramètre interwiki, voir la page Interwiki
Les deux derniers paramètres fragment et interwiki sont facultatifs (ouf!)
* Question : Pourquoi s’embêter avec la fonction mw.title.makeTitle ? Pourquoi ne pas prendre la fonction mw.title.new et taper simplement en paramètre le nom de la page avec son préfixe ?
* Réponse : Pour des besoins de programmation, les paramètres de la fonction mw.title.makeTitle peuvent être variables et sont fournis par d'autres fonctions ou des variables. En fait la fonction mw.title.makeTitle se trouvera dans un module placé dans un modèle qui sera placé dans un grand nombre de pages et l’objet Title que l’on voudra obtenir dépendra de la page où est placé le modèle.
Nous donnons ci-dessous un exemple simple :
(Voir title.prefixedText que nous avons utilisé dans le programme)
{{#invoke:Title|creation|12|Maintenance à l'aide du Lua}} nous donne : Le titre de la page dont on vient de créer l’objet Title est : Aide:Maintenance à l'aide du Lua

## Objets en relation avec l’objet Title

Tous les exemples de ce paragraphe se trouvent dans le Module:Title
Les objets que nous allons étudier dans ce paragraphe se trouvent dans l’objet Title. Nous commencerons donc par écrire une fonction p.visualisation permettant de les visualiser.
{{#invoke:Title|visualisation|{{PAGENAME}}}} nous donne : À la clé isRedirect, on trouve un objet de type : boolean À la clé fullUrl, on trouve un objet de type : function À la clé canonicalUrl, on trouve un objet de type : function À la clé fragment, on trouve un objet de type : string À la clé subjectPageTitle, on trouve un objet de type : table À la clé nsText, on trouve un objet de type : string À la clé thePartialUrl, on trouve un objet de type : string À la clé text, on trouve un objet de type : string À la clé prefixedText, on trouve un objet de type : string À la clé isTalkPage, on trouve un objet de type : boolean À la clé exists, on trouve un objet de type : boolean À la clé talkPageTitle, on trouve un objet de type : table À la clé inNamespace, on trouve un objet de type : function À la clé isSubpageOf, on trouve un objet de type : function À la clé canTalk, on trouve un objet de type : boolean À la clé rootText, on trouve un objet de type : string À la clé hasSubjectNamespace, on trouve un objet de type : function À la clé partialUrl, on trouve un objet de type : function À la clé isSubpage, on trouve un objet de type : boolean À la clé isLocal, on trouve un objet de type : boolean À la clé talkNsText, on trouve un objet de type : string À la clé basePageTitle, on trouve un objet de type : table À la clé baseText, on trouve un objet de type : string À la clé interwiki, on trouve un objet de type : string À la clé isExternal, on trouve un objet de type : boolean À la clé subjectNsText, on trouve un objet de type : string À la clé isSpecialPage, on trouve un objet de type : boolean À la clé subPageTitle, on trouve un objet de type : function À la clé inNamespaces, on trouve un objet de type : function À la clé id, on trouve un objet de type : number À la clé subpageText, on trouve un objet de type : string À la clé localUrl, on trouve un objet de type : function À la clé redirectTarget, on trouve un objet de type : boolean À la clé isContentPage, on trouve un objet de type : boolean À la clé fullText, on trouve un objet de type : string À la clé cascadingProtection, on trouve un objet de type : table À la clé rootPageTitle, on trouve un objet de type : table À la clé contentModel, on trouve un objet de type : string À la clé protectionLevels, on trouve un objet de type : table À la clé namespace, on trouve un objet de type : number À la clé getContent, on trouve un objet de type : function
Nous voyons que nous avons un grand nombre d'objets à étudier, alors ne perdons pas de temps !

#### title.Redirect

title.Redirect indique si la page est une redirection.
Exemple :
{{#invoke:Title|redirection|Bac à sable}} nous donne : La page Bac à sable n’est pas une redirection.
{{#invoke:Title|redirection|Aide:Maintenance à l'aide du Lua}} nous donne : La page Aide:Maintenance à l'aide du Lua n’est pas une redirection.
(Et l’on constate que cela ne marche pas ! un bon point pour celui qui trouvera pourquoi ! )

#### title.fullUrl

title.fullUrl est de type function. title.fullUrl(query, proto) Retourne l'URL complète de la page (avec optionnellement un "query", une chaîne ou une table). proto est optionnel et permet de préciser "http", "https", "relative" (par défaut), ou "canonical".

#### title.canonicalUrl

title.canonicalUrl est de type function. title.canonicalUrl(query) retourne l'URL canonique de la page (avec optionnellement un "query", une chaîne ou une table)

#### title.fragment

title.fragment est de type string et donne le fragment (voir w:Identificateur de fragment).

#### title.subjectPageTitle

identique à mw.title.makeTitle( mw.site.namespaces[title.namespace].subject.id, title.text ).

#### title.isExternal

indique si la page a un interwiki

#### title.text

title.text contient le titre de la page concernée par l’objet Title. On imagine facilement qu’il serait absurde de créer un objet Title en utilisant la fonction mw.title.new pour avoir le titre d'une page car justement le titre de la page est fourni en argument à la fonction mw.title.new. L'objet Title sera donc, dans ce cas, logiquement fourni par la fonction mw.title.getCurrentTitle ou par la fonction mw.title.makeTitle.
Écrivons, par exemple, une fonction p.titre qui nous indique le titre de la page que nous sommes en train de lire !
{{#invoke:Title|titre}} nous donne : Le titre de cette page est : Initiation au Lua avec Scribunto/L'objet Title

#### title.prefixedText

title.prefixedText est de type string. Cette variable contient le titre de la page avec l'espace de noms ainsi que l'interwiki.
Si l’on souhaite avoir en plus le fragment, on utilisera à la place title.fullText
Donnons un exemple :
Le programme, ci-dessous, créé un objet Title et affiche le nom complet de la page concernée
{{#invoke:Title|creation|Aide|Maintenance à l'aide du Lua}} nous donne : Le titre de la page dont on vient de créer l’objet Title est : Aide:Maintenance à l'aide du Lua

#### title.isTalkPage

indique si la page est une page de discussion
Exemple :
{{#invoke:Title|discussion|Discussion:Initiation au Lua avec Scribunto}} nous donne : La page Discussion:Initiation au Lua avec Scribunto est une page de discussion.
{{#invoke:Title|discussion|Aide:Maintenance à l'aide du Lua}} nous donne : La page Aide:Maintenance à l'aide du Lua n’est pas une page de discussion.

#### title.exists

C'est un booléen qui nous indique si la page existe. Ceci peut paraître bizarre dans la mesure où l’on pourrait croire que, si une page n'existe pas, la fonction mw.title.new devrait nous retourner nil. C'est faux ! Si la page n'existe pas alors l’objet title est tout de même créé, mais le booleen title.exists sera à false. Nous allons vérifier ce que l’on vient de dire en faisant un programme qui nous indique si, d'une part, l’objet title existe et si, d’autre part, la page associée à cet objet title existe.
{{#invoke:Title|existe|Bof}} nous donne : L'objet title existe et la page n'existe pas.
{{#invoke:Title|existe|Aide:Maintenance à l'aide du Lua}} nous donne : L'objet title existe et la page existe.

#### title.talkPageTitle

Cette commande est identique à mw.title.makeTitle( mw.site.namespaces[title.namespace].talk.id, title.text ), ou à nil si la page ne peut pas avoir de page de discussion.
Plus simplement, cette commande créé un objet title pour la page de discussion associée à la page dont on a créé un objet title appelé title
Par exemple si, sur la Wikiversité, on a créé un objet title pour une page de l'espace principal appelé title, cette commande est identique a mw.title.makeTitle( 1 , title.text ). Car 1 est le numéro d'espace pour une page de discussion de l'espace principal.

#### title.inNamespace

title.inNamespace est de type function. title.inNamespace(ns) indique si la page est dans l'espace de noms indiqué. ns peut être toute clé trouvée dans mw.site.namespaces.

#### title.isSubpageOf

title.isSubpageOf est de type function. title.isSubpageOf(title2) indique si la page est une sous-page de title2.

#### title.canTalk

indique si la page peut avoir une page de discussion
Exemple :
{{#invoke:Title|discute|Spécial:Nouvelles pages}} nous donne : La page Spécial:Nouvelles pages ne peut pas avoir une page de discussion.
{{#invoke:Title|discute|Aide:Maintenance à l'aide du Lua}} nous donne : La page Aide:Maintenance à l'aide du Lua peut avoir une page de discussion.

#### title.getContent

Cette commande retourne le contenu de la page concernée par l’objet Title. Contrairement à ce que l’on pourrait penser a priori, l'argument de cette commande est l’objet Title retourné par la commande mw.title.new et pas le nom de la page dont on extrait le contenu. Par exemple, on écrira :
C'est-à-dire que l’on commence par créer un objet Title (ici la table title) et on passe cette table comme argument de la fonction title.getContent pour recueillir dans la variable texte le contenu de la page dont le titre était dans la variable page.
* Question : Pourquoi n'existe-t-il pas une fonction qui permettrait d'obtenir directement le contenu d'une page en donnant le nom de cette page en argument ? Ce qui éviterait la création d'un objet Title et devrait permettre ainsi de gagner en temps d'exécution !
* Réponse : (Si vous avez la réponse à cette question, veuillez remplacer cette phrase entre parenthèse par celle-ci)
Donnons un exemple concret en écrivant une fonction p.mot qui permet de dire si un mot se trouve dans la page : Statique/Présentation de la leçon.
{{#invoke:Title|mot|système}} nous donne : Le mot système a été trouvé en position 108
{{#invoke:Title|mot|cacahuète}} nous donne : Le mot cacahuète n'a pas été trouvé dans la page

#### title.hasSubjectNamespace

hasSubjectNamespace est de type function. hasSubjectNamespace(ns) indique si l'espace de noms sujet de la page est dans l'espace de noms indiqué. ns peut être toute clé trouvée dans mw.site.namespaces

#### title.partialUrl

title.partialUrl est de type function. title.partialUrl(text) retourne text encodé comme une URL

#### title.isSubpage

Indique si la page est une sous-page.
Exemple :
{{#invoke:Title|souspage|Initiation au Lua avec Scribunto/L'objet Frame}} nous donne : La page Initiation au Lua avec Scribunto/L'objet Frame est une sous-page.
{{#invoke:Title|souspage|Aide:Maintenance à l'aide du Lua}} nous donne : La page Aide:Maintenance à l'aide du Lua n’est pas une sous-page.

#### title.isSpecialPage

Indique si la page est dans l'espace de noms "Spécial:"
Exemple :
{{#invoke:Title|special|Spécial:Nouvelles pages}} nous donne : La page Spécial:Nouvelles pages est une page spéciale.
{{#invoke:Title|special|Aide:Maintenance à l'aide du Lua}} nous donne : La page Aide:Maintenance à l'aide du Lua n’est pas une page spéciale.

#### title.basePageTitle

title.basePageTitle est une fonction qui retourne un nouvel objet title. Si title est un objet title concernant une sous-page, alors title.basePageTitle retourne un objet title concernant la page ayant pour sous-page, la sous-page du premier objet title.
Plus précisément, si title est par exemple l’objet title de la page : Recherche:Les asticots/Introduction, title.basePageTitle retournera un objet title associé à la page : Recherche:Les asticots
Bien sur, si le premier objet title concerne une page qui n’est pas une sous-page, le deuxième objet title, créé par title.basePageTitle, concernera la même page
Écrivons un petit programme pour mieux comprendre la syntaxe et voir l'effet sur différents types de pages :
{{#invoke:Title|basepagetitle|Bof/Niouf}} nous donne : Le premier objet title concerne la page : Bof/Niouf Le deuxième objet title concerne la page : Bof (bien que la page Bof/Niouf n'existe pas!)
{{#invoke:Title|basepagetitle|Aide:Maintenance à l'aide du Lua}} nous donne : Le premier objet title concerne la page : Aide:Maintenance à l'aide du Lua Le deuxième objet title concerne la page : Aide:Maintenance à l'aide du Lua
{{#invoke:Title|basepagetitle|Recherche:Les fonds patrimoniaux des bibliothèques publiques/Parchemin et cuir}} nous donne : Le premier objet title concerne la page : Recherche:Les fonds patrimoniaux des bibliothèques publiques/Parchemin et cuir Le deuxième objet title concerne la page : Recherche:Les fonds patrimoniaux des bibliothèques publiques
Nous voyons aussi que title.basePageTitle est identique à mw.title.makeTitle(title.namespace,title.baseText)

#### title.baseText

title.baseText est un objet de type string. Si l’on a affaire à une sous-page, title.baseText donne le titre de la page dont c’est la sous-page, sans préfixe d'espace. Sinon title.baseText a le même effet que title.text. Nous voyons alors que title.baseText est l'équivalent de {{BASEPAGENAME}} dans la syntaxe wiki. Écrivons un petit programme pour voir comment se comporte title.baseText avec un choix de page donnée en argument :
{{#invoke:Title|base|Bof/Niouf}} nous donne : Pour la page : Bof/Niouf, title.baseText nous donne : Bof. (bien que la page Bof/Niouf n'existe pas!)
{{#invoke:Title|base|Aide:Maintenance à l'aide du Lua}} nous donne : Pour la page : Aide:Maintenance à l'aide du Lua, title.baseText nous donne : Maintenance à l'aide du Lua.
{{#invoke:Title|base|Recherche:Les fonds patrimoniaux des bibliothèques publiques/Parchemin et cuir}} nous donne : Pour la page : Recherche:Les fonds patrimoniaux des bibliothèques publiques/Parchemin et cuir, title.baseText nous donne : Les fonds patrimoniaux des bibliothèques publiques.

#### title.nsText

title.nsText est de type string et donne le nom de l'espace de noms de la page concernée.

#### title.isLocal

Indique si la page est locale au projet. Par exemple sur en: tous les Wikipédias sont considérés comme locaux mais pas les Wiktionnaires.
Exemple :
{{#invoke:Title|locale|Initiation au Lua avec Scribunto}} nous donne : La page Initiation au Lua avec Scribunto est locale au projet.
{{#invoke:Title|locale|en:wikt:amandantium}} nous donne : La page en:wikt:amandantium est locale au projet.
(ça n'a pas l'air de marcher, à revoir)

#### title.fullText

title.fullText est de type string et donne le titre de la page, avec l'espace de nom, l'interwiki et le fragment.

#### title.subPageTitle

title.subPageTitle est de type function. subPageTitle(text) est identique à mw.title.makeTitle( title.namespace, title.text .. '/' .. text )

#### title.inNamespaces

title.inNamespaces est de type function. title.inNamespaces(...) indique si la page est dans l'un des espaces de nom indiqués. Les espaces de noms peuvent être toute clé trouvée dans mw.site.namespaces.

#### title.id

C'est un objet de type number qui nous donne l'identifiant de la page. Chaque page créée sur un Wiki a un identifiant. La première page créée a l'identifiant 1. La deuxième page créée a l'identifiant 2 et ainsi de suite. Si la page n'existe pas, ce nombre sera égal à 0. Nous allons vérifier ce que l’on vient de dire en faisant un programme qui nous indique si la page entrée en argument existe et quel est son identifiant.
{{#invoke:Title|identifiant|Bof}} nous donne : La page n'existe pas. L'identifiant de la page est 0
{{#invoke:Title|identifiant|Aide:Maintenance à l'aide du Lua}} nous donne : La page existe. L'identifiant de la page est 51770

#### title.subpageText

title.subpageText est un objet de type string. Si l’on a affaire à une sous-page, title.subpageText donne le suffixe de la page. Sinon title.subpageText a le même effet que title.text. Nous voyons alors que title.subpageText est l'équivalent de {{SUBPAGENAME}} dans la syntaxe wiki. Écrivons un petit programme pour voir comment se comporte title.subpageText avec un choix de page donnée en argument :
{{#invoke:Title|subpage|Bof/Niouf}} nous donne : Pour la page : Bof/Niouf, title.subpageText nous donne : Niouf. (bien que la page Bof/Niouf n'existe pas!)
{{#invoke:Title|subpage|Aide:Maintenance à l'aide du Lua}} nous donne : Pour la page : Aide:Maintenance à l'aide du Lua, title.subpageText nous donne : Maintenance à l'aide du Lua.
{{#invoke:Title|subpage|Recherche:Les fonds patrimoniaux des bibliothèques publiques/Parchemin et cuir}} nous donne : Pour la page : Recherche:Les fonds patrimoniaux des bibliothèques publiques/Parchemin et cuir, title.subpageText nous donne : Parchemin et cuir.

#### title.subjectNsText

title.subjectNsText est de type string et donne le nom de l'espace de noms sujet de la page.

#### title.rootText

title.rootText est de type string et donne le titre de la page de base sans préfixe si l’on se trouve dans une sous-page. Sinon est identique à title.text.
indique si la page est une sous-page

#### title.isContentPage

Indique si la page est dans un espace de noms de contenu.
Exemple :
{{#invoke:Title|contenu|Initiation au Lua avec Scribunto}} nous donne : La page Initiation au Lua avec Scribunto est une page de contenu.
{{#invoke:Title|contenu|Bac à sable}} nous donne : La page Bac à sable est une page de contenu.
{{#invoke:Title|contenu|Recherche:Évolution prébiotique}} nous donne : La page Recherche:Évolution prébiotique est une page de contenu.
{{#invoke:Title|contenu|Faculté:Informatique}} nous donne : La page Faculté:Informatique n’est pas une page de contenu.
{{#invoke:Title|contenu|Aide:Maintenance à l'aide du Lua}} nous donne : La page Aide:Maintenance à l'aide du Lua n’est pas une page de contenu.
Il semblerait que seules les pages de l'espace principal, y compris les redirections, soient des pages de contenu.

#### title.rootPageTitle

identique à mw.title.makeTitle( title.namespace, title.rootText )

#### title.localUrl

title.localUrl est de type function. title.localUrl(query) retourne l'URL locale de la page (avec optionnellement un "query", une chaîne ou une table)

#### title.contentModel

Le type de contenu pour ce titre, sous forme de chaîne. Voir mw:Manual:ContentHandler.

#### title.interwiki

title.interwiki est de type string et donne le préfixe interwiki. S'il n'y a pas de préfixe interwiki, la chaîne de caractère retournée est vide.

#### title.namespace

title.namespace est de type number et permet d'obtenir le numéro d'espace dans lequel se trouve la page consernée.
{{#invoke:Title|num_espace|Aide:Maintenance à l'aide du Lua}} nous donne : La page Aide:Maintenance à l'aide du Lua se trouve dans l'espace de numéro : 12
| L'objet Frame | L'objet URI |