Réaliser un éditeur XML avec SCENARIbuilder
Modélisation de hiérarchie
Réaliser un éditeur correspondant au modèle suivant.
Récursivité
Réaliser deux éditeurs correspondant aux deux modèles suivants.
Question
Document -> Titre, Section+
Section -> Titre, (Section | Texte)+
Texte -> sTxt
Solution
Le but est de pouvoir ajouter récursivement des sous-sections.
Syntaxe :
En Relax NG, la structure (Section | Texte)+ s'écrit :
<oneOrMore>
<choice>
<element name="section">
...
</element>
<element name="texte">
...
</element>
</choice>
</oneOrMore>
Dans SCENARIbuilder, cela correspond à un set de plusieurs parts :

Remarque : Set optionnel
Pour réaliser l'équivalent d'un zeroOrMore plutôt qu'un oneOrMore, mettre l'attribut usage du set à optional.
Question
Document -> Titre, Section+
Section -> Titre, (Section+ | Texte+)
Texte -> sTxt
Solution
Le but est de pouvoir ajouter un ensemble de sous-sections ou un ensemble de textes (mais pas les deux à la fois au même niveau).
Syntaxe :
En Relax NG, la structure (Section+ | Texte+) s'écrit :
<choice>
<oneOrMore>
<element name="section">
...
</element>
</oneOrMore>
<oneOrMore>
<element name="texte">
...
</element>
</oneOrMore>
</choice>
Dans SCENARIbuilder, cela correspond à une alternative de plusieurs sets :

Remarque : Name du set dans une alternative
Dans une alternative, le set a besoin d'un name (pour que l'éditeur puisse proposer le choix entre un set ou un autre) : ici, cela fait sens de reprendre les names des parts en les mettant au pluriel.
Remarque : Alternative optionnelle
Pour réaliser l'équivalent d'un zeroOrMore plutôt qu'un oneOrMore, mettre l'attribut usage de l'alternative à optional (un ensemble de sections ou un ensemble de textes ou rien).
Modelet "base"
Copier et modifier les .model sTitle et sTxt dans un nouvel espace, de façon à réaliser un éditeur correspondant au modèle suivant.
Question
Document -> Titre, Section+, Glossaire
...
Glossaire -> Entree+
Entree -> Terme, Definition
Avec Terme se comportant comme un sTitle et Definition comme un sTxt encore simplifié comprenant seulement des Paragraphe et des mots de type Emphasis.
Solution
Copier sTxt.model dans l'espace dédié à cette question (on n'a pas besoin de copier sTitle.model avec, car il ne sera pas modifié).
On souhaite garder uniquement les paragraphes et le balisage inline "Important", on va donc tout supprimer sauf :
l'appel à la primitive
paraTag, dename"Paragraphe" ;l'
inlineStyleTag(dans lesinlineTags) et l'htmlStyle(dans la partie ) derole"imp" (et dename"Important").
On peut également supprimer les balises devenues "inutiles" dans la partie authoring, à savoir toutes celles n'ayant pas le role "imp".
Il est important de noter le changement de la balise identification ici, sans laquelle on aurait un conflit entre les deux versions de sTxt.model mobilisées dans le modèle (l'originale de base pour les sections, et celle-ci pour les entrées) ; dans cette version modifiée, on doit donc changer :
soit le code ;
soit le namespace (ce qui est le plus cohérent).

Créer un .model pour l'entrée et bien penser à référencer le sTxt.model modifié en allowedModel de la part.
Créer un .model pour le glossaire et le référencer en allowedModel dans une nouvelle part de Document.
Modelet "binaries"
Réaliser un éditeur permettant l'intégration d'images (binaires externes).
Question
Adapter le modèle Entree pour ajouter des illustrations dans les définitions.
On s'inspirera pour cela de flow.model.
Solution
On a besoin de remplacer sTxt par un modèle plus complexe dans la part de l'entrée, ce qui donne lieu à la création de definition.model.
Il est important de souligner que la part correspondant aux images (png.model, jpeg.model, etc.) ne peut pas avoir son attribut internalized égal à always (les images sont par définition des ressources externes).
Remarque :
Il y a plusieurs façons d'interpréter l'énoncé de la question ; ici, on a choisi de pouvoir en mettre un ensemble (optionnellement) à la suite du texte.
Attention :
Les .models des images doivent être ajoutés aux publicClasses du wspdef, pour que l'auteur puisse les instancier de manière autonome.
Métadonnées
Utiliser la primitive dataFormPrim pour ajouter à Document les 15 éléments principaux du Dublin Core, comme sur le modèle suivant.
Question
Document -> Entete, Section+, Glossaire
Entete -> Titre, Créateur, ...
...
Solution
Jusqu'à là, on a uniquement utilisé des méta-données de type titlePrim (sTitle) ; le type dataFormPrim permet une structuration plus complexe, ce qui convient bien pour les éléments du Dublin Core.
Créer entete.model de type dataFormPrim et le paramétrer, par exemple, comme ceci :
On remarquera les types proposés pour les champs de méta-données (string, date, etc.)
Remarque :
Ici, on s'est servi des balises group (pour grouper plusieurs champs de méta-données sous un nom) et field (champ auquel on peut associer un type), mais la dataFormPrim fournit également :
une balise
subDatapour référencer d'autres dataFormPrim (utile quand on a un modèle de méta-données complexe et/ou requérant des parties externalisées) ;une balise
setOf(équivalent d'un set dans la compositionPrim, utile pour pouvoir définir des mots-clés par exemple).
Plan logique
Renseigner les champs family de façon à obtenir le plan adéquat.
Question
Solution
Mettre l'attribut family des parts correspondant aux sections (dans document.model et section.model) à la valeur sub-level : cela permet de spécifier que ces parts sont des éléments structurels (par opposition à des éléments de contenu).

Dès lors, dans SCENARIchain (ou SCENARItest), un clic-droit sur un item de type "document", puis "Afficher le plan" doit faire apparaître le plan à droite, sous forme d'arborescence où la racine est le document et les feuilles sont ses différentes sections ou sous-sections.
Externalisation
Autoriser la transclusion entre items sections.
Question
Modifier la propriété d'internalisation de façon à rendre les sections (pas les sous-sections) externalisables et réutilisables si l'utilisateur le décide (userDependent).
Solution
Mettre l'attribut internalized des parts correspondant aux sections à la valeur userDependant : cela laisse le choix à l'auteur d'externaliser une section, ou au contraire de la laisser intégrée au document ou à la section la contenant.

Attention :
Comme dans la question 8, il faut ajouter section.model aux publicClasses dans le wspdef, pour que l'auteur puisse instancier des items de type "section".
Cette démarche est à faire impérativement, dès lors qu'un item est "externalisable" (concrètement, le choix "Section" sera présent dans le menu de création d'item pour l'auteur).
Déploiement
Préparer le déploiement d'un modèle dans SCENARIchain.
Question
Ajouter un item de type packMake pour générer un wsppack à installer dans SCENARIchain.
Solution
Créer un item de type packMake ("Gestion des ateliers -> Compilation" dans le menu de création d'item) puis référencer le wspDef dans la balise du même nom.
Le résultat de la compilation dans cet item est un fichier .wsppack, qu'on peut installer dans SCENARIchain ensuite.










