Compatibilité et limitation¶
StringTemplate 4 supporte plusieurs syntaxes de templating, dont celle de la version 3. Aussi, par soucis de compatibilité, c'est cette syntaxe qui est définie par défaut dans l'API de Silverpeas Template. Toutefois, il y a un changement par rapport aux dernières versions de StringTemplate 3 : l'indentation de code n'y est plus supporté . Ainsi, un template comme celui-ci :
RAPPEL : $contributionTitle;format="toUpperFirstChar"$ aura lieu $if(reminderContributionSeveralDays)$
$if(reminderContributionStart.timeExisting)$
du $reminderContributionStart.dayDate$ à $reminderContributionStart.dayTime$ au $reminderContributionEnd.dayDate$ à $reminderContributionEnd.dayTime$
$else$
du $reminderContributionStart.dayDate$ au $reminderContributionEnd.dayDate$
$endif$
$else$
$if(reminderContributionStart.timeExisting)$
le $reminderContributionStart.dayDate$ de $reminderContributionStart.dayTime$ à $reminderContributionEnd.dayTime$
$else$
le $reminderContributionStart.dayDate$
$endif$
$endif$
$if(reminderContributionZoneId)$
($reminderContributionZoneId$)
$endif$
.
produira, par exemple, avec StringTemplate 4 :
RAPPEL : L'événement <b>super test</b> aura lieu
le 21/02/2018
(UTC)
.
au lieu de :
RAPPEL : L'événement <b>super test</b> aura lieu le 21/02/2018 (UTC).
Dans StringTemplate 4, les espaces, tabulations, retour à la ligne, etc. sont pris comme tels dans la génération du texte à partir du modèle. Par conséquent, les templates devront être formatés comme à l'origine, sans indentation. Ce qui donne avec notre exemple :
RAPPEL : $contributionTitle;format="toUpperFirstChar"$ aura lieu $if(reminderContributionSeveralDays)$$if(reminderContributionStart.timeExisting)$du $reminderContributionStart.dayDate$ à $reminderContributionStart.dayTime$ au $reminderContributionEnd.dayDate$ à $reminderContributionEnd.dayTime$$else$du $reminderContributionStart.dayDate$ au $reminderContributionEnd.dayDate$$endif$$else$$if(reminderContributionStart.timeExisting)$le $reminderContributionStart.dayDate$ de $reminderContributionStart.dayTime$ à $reminderContributionEnd.dayTime$$else$le $reminderContributionStart.dayDate$$endif$$endif$$if(reminderContributionZoneId)$ ($reminderContributionZoneId$)$endif$.
Dans le cas de templates conséquents, pour lesquels l'indentation apporte une visibilité importante, il sera nécessaire de passer à un descripteur de template. Mais pour ce faire, il faudra alors utiliser en lieu et place de la méthode
SilverpeasTemplate#applyFileTemplate(String fileName)
utiliser la méthode
SilverpeasTemplate#applyFileTemplateDescriptor(String descriptor)
Descripteur de template¶
A côté de ce que StringTemplate appelle les modèles bruts ("raw template"), vue ci-dessus, la version 4 supporte une nouvelle forme de définition de template que j'ai appelé les descripteurs de templates. Un descripteur de template n'est ni plus, ni moins, une définition d'un template dans un fichier, cette définition devant respecter la grammaire suivante :
"Template Name"("Comma-Separated list of attributes") ::= << "Template body" >> | <% "Template body" %>
La liste des attributs en paramètre du template, à passer au corps de celui-ci, doivent être définis via l'appel à la méthode
SilverpeasTemplate#setAttribute(String name, Object value)
Par contre, tout ajout d'attribut dans un SilverpeasTemplate doit être déclaré parmi la liste des attributs passés en argument du template, même ceux qui ne sont pas utilisés dans le corps du template.
L'avantage du descripteur est qu'il permet d'indiquer explicitement les attributs attendus par le modèle et, via les marqueurs du corps de template
<%
et
%>
de pouvoir indenter le code du template dans son corps. Par opposition, les marqueurs
<<
et
>>
signifient que les indentations doivent être traités par le générateur de texte (comme avec les modèles bruts).