Comment contourner le changement automatique du type d'une donnée dans une opération XML Blogger ?

string peut devenir number ou boolean dans une expression XML Blogger
En tant que développeurs de thèmes, il vous est sûrement déjà arrivé de tomber sur ce message : Error interpreting blog theme - Invalid expression. Le message est généralement accompagné de l'opération invalide afin d'aider à localiser le problème dans le fichier XML du thème.

Souvent, l'erreur provient d'une simple faute de frappe ou encore d'une mauvaise connaissance des syntaxes de la part du développeur. Mais parfois, le problème peut paraître plus complexe, comme le cas d'un changement automatique du type de la valeur d'une donnée qui a été injectée dans une expression XML Blogger.

C'est ce dernier cas que nous allons aborder aujourd'hui.

C'est l'histoire de Toto

Toto est le plus grand fan de Johnny. Pour partager sa passion au monde entier, il a créé un blog sur la plate-forme Blogger (évidemment).
Comme tout bon Bloggerien qui se respecte, il lit le mode d'emploi du produit dans le Centre d'Aide et se documente attentivement sur Blogger Code PE pour personnaliser son thème.

Jusqu'à présent, tout se passe bien. Il écrit des articles qu'il classe en 2 groupes de libellés comme suit :

Par année
  • 1950
  • 1960
  • 1970
  • 1980
  • 1990
  • 2000
  • 2010
  • 2019
Par nom
  • Johnny Cash
  • Johnny Hallyday
  • Johnny English
Et puis un jour, il tombe par le plus grand des hasards sur la fiche qui traite de l'opérateur de contenu. Le document lui apprend que l'on peut créer des conditions en comparant 2 chaînes de caractères. Il recherche ensuite dans l'Explorateur de Blogger Code PE afin de trouver la bonne donnée qui contient les libellés et qu'il pourra injecter dans l'opération. Et là, BINGO ! Après quelques secondes de recherche, il fini par tomber sur data:view.search.label. La donnée renvoie le libellé de la page de recherche par libellé et la valeur est une chaîne de caractères string. C'est tout juste ce qu'il lui fallait.

Il écrit son code dans le fichier XML du thème afin de filtrer les libellés ne contenant que le mot "Johnny". Le résultat est propre, net et sans bavure :


<b:if cond='data:view.search.label contains "Johnny"'>

  Je suis le plus grand fan de Johnny ! ! !

</b:if>


Mais voilà, bien que le code fonctionne à la perfection sur les bonnes pages de libellés, la joie de Toto est de courte durée, puisqu'il constate que depuis qu'il a enregistré son code, les pages des libellés qu'il avait nommés "1950", "1960", "1970", etc, renvoient le fameux message d'erreur : "Error interpreting blog theme - Invalid expression"...


Que s'est-il passé ?

Rien de bien méchant. Il s'agit juste d'un problème d'analyse syntaxique.

Lorsque les libellés "1950", "1960", "1970", etc, ont été créés, ils ont été enregistrés comme étant des valeurs de type string. Et nous savons que les types de valeurs contenues dans les données sont pratiquement toutes invariables, exceptés lorsqu'ils sont injectés dans une opération et que la chaîne est, pour le cas de Toto, une série de chiffres qui devient 1950, 1960, 1970 (sans quote).

Hors, la syntaxe de l'opérateur est très stricte sur ce point. Il faut que les opérandes soient absolument des chaînes de caractères :

string contains string

Au moment de l'analyse, Blogger a converti automatiquement la chaîne de caractères en nombre et n'a pas réussi à comprendre la nouvelle syntaxe puisqu'elle n'existe pas dans l'algo. D'où le message d'erreur :

number contains string


Comment aider Toto à réparer son thème ?

Toto sera ravi d'apprendre qu'il existe une solution de contournement qui consiste à repérer les chaînes de caractères ressemblants à des nombres, grâce au signe + qui est à la fois un opérateur de concaténation et d'addition :


Syntaxe Concaténation
string + allType

Syntaxe Addition
number + number


Par conséquent, au moment de l'analyse, Blogger pourra choisir l'une de ces 2 syntaxes lorsqu'il lira cette formule :


<b:if cond='(data:view.search.label + 0) == data:view.search.label'>

  <b:comment>Vrai, la chaîne est un nombre</b:comment>

<b:else/>

  <b:comment>Sinon, la chaîne n'est pas un nombre</b:comment>

  <b:if cond='data:view.search.label contains "Johnny"'>

    Je suis le plus grand fan de Johnny ! ! !

  </b:if>

</b:if>


Et voilà Toto. Ton modèle est réparé. Ça te coûtera 3 cacahuètes pour le service de dépannage. 😍


Spotlight

Populaires cette semaine