Pour ceux qui ne sont pas familiers avec le formalisme des DTD, rappelons que la directive ELEMENT déclare le nom d’une balise et de quoi elle est composée (éventuellement de rien, avec le mot-clé EMPTY : seuls les attributs en justifient l’existence). La directive ATTLIST déclare les attributs de cette balise sous forme de trio nom, type, présence. La directive ENTITY déclare juste une abréviation (mais son nom est souvent porteur d’informations informelles). Pour plus de précisions se reporter à la
définition officielle de XML.
Le but du fichier plugin.xml
est d’indiquer le nom du plugin, de décrire son intention et de donner des informations techniques sur ses différentes réalisations. Un même fichier plugin.xml
peut décrire plusieurs réalisations, afin que les développeurs puissent maintenir un seul jeu de fichiers pour différentes réalisations, seul les points d’entrées décrits dans ce fichier étant changés. Cela conduit à avoir une balise racine spip-plugin
englobant une suite non vide de balises plugin
contenant elles-mêmes chacune des balises de description. En revanche un niveau supplémentaire d’emboîtement n’est pas nécessaire, les informations à fournir n’étant pas structurées. Par ailleurs, il est préférable d’employer autant que possible des attributs afin d’avoir des balises auto-fermantes, plus concises à écrire. Enfin, on a utilisé les entités XML pour typer implicitement les attributs, qui pourront facillement être analysés par des RegExp appropriés.
On a repris les noms des balises actuellement utilisées dans plugin.xml
pour SPIP <= 2.1, mais lorsque le niveau d’emboîtement apparaissait superflu, cette balise est devenue un nom d’attribut de sa balise mère. Toutefois le nom ID n’a pas pas été repris quand ça n’était pas compatible avec son statut particulier en XML exigeant la non répétition de sa valeur dans un même document.
Voici donc cette proposition :
<!ENTITY % MAIL "CDATA"> <!-- adresse mail -->
<!ENTITY % NAME "CDATA"> <!-- identificateur (notamment nom de fonction) -->
<!ENTITY % NUMBER "CDATA"> <!-- nombre entier naturel -->
<!ENTITY % PATH "CDATA"> <!-- chemin d'acces a un fichier ou repertoire -->
<!ENTITY % QUERY_STRING "CDATA"> <!-- couples x=y separes par esperluete -->
<!ENTITY % URI "CDATA"> <!-- lien sur le Web -->
<!ENTITY % VNUM "CDATA"> <!-- 3 entiers naturels separes par un point: x.y.z -->
<!ELEMENT spip-plugin (description plugin+) >
<!ATTLIST spip-plugin
id ID #REQUIRED
>
<!ELEMENT description (#PCDATA)>
<!ELEMENT plugin (auteur|bouton|chemin|necessite|onglet|pipeline|utilise)* >
<!ATTLIST plugin
prefix %NAME #REQUIRED
categorie %NAME #IMPLIED
etat (experimental|dev|test|stable) #REQUIRED
licence #CDATA #REQUIRED
lien %URI #IMPLIED
logo %PATH #IMPLIED
version %VNUM #REQUIRED
version_base %NUMBER #IMPLIED
install %PATH #IMPLIED
options %PATH #IMPLIED
fonctions %PATH #IMPLIED
meta %NAME #IMPLIED
>
<!ELEMENT auteur (#PCDATA)>
<!ATTLIST auteur
mail %MAIL #IMPLIED
>
<!ELEMENT chemin EMPTY>
<!ATTLIST chemin
path %PATH #REQUIRED
type %NAME #IMPLIED
>
<!ELEMENT pipeline EMPTY>
<!ATTLIST pipeline
nom %NAME #REQUIRED
action %NAME #REQUIRED
path %PATH #IMPLIED
>
<!ELEMENT necessite EMPTY>
<!ATTLIST necessite
nom %NAME #REQUIRED
version %VNUM #REQUIRED
>
<!ELEMENT utilise EMPTY>
<!ATTLIST utilise
nom %NAME #REQUIRED
version %VNUM #REQUIRED
>
<!ELEMENT bouton EMPTY>
<!ATTLIST bouton
nom %NAME #REQUIRED
parent %NAME #REQUIRED
action %NAME #REQUIRED
args %QUERY_STRING #REQUIRED
icone %PATH #IMPLIED
>
<!ELEMENT onglet EMPTY>
<!ATTLIST onglet
nom %NAME #REQUIRED
parent %NAME #REQUIRED
action %NAME #REQUIRED
args %QUERY_STRING #REQUIRED
icone %PATH #IMPLIED
>