Quand une chaîne se prend pour un nombre (et fait tout planter)

string peut devenir number ou boolean dans une expression XML Blogger

Il est 2h17 du matin, le thème XML de ton blog brille comme une Ferrari fraîchement sortie de l'usine de Maranello. Tu cliques sur “Enregistrer”. Et là… BOUM !

Un message surgit tel un Trump déchaîné devant un parterre de démocrates endormis : Error interpreting blog theme - Invalid expression

Tu fixes ton écran. Tu relis ton code. Tu grognes. Tu penses à tout plaquer pour devenir berger en Nouvelle-Zélande.

Ce message, tous les développeurs de thèmes Blogger l’ont croisé un jour. Il peut venir d’une petite faute de frappe, d’un mauvais opérateur, d’un oubli de quote ou, plus sournoisement… d’un changement automatique de type dans une expression XML, provoqué par l’unique volonté du parseur, ce capricieux petit démon codé par Blogger.

Et c’est justement cette dernière situation qu’on va explorer aujourd’hui, à travers l’histoire tragiquement cocasse de… Toto, le plus grand fan de Johnny que la blogosphère ait connu.

Toto, Blogger et les libellés

Toto, c’est un passionné. Pas n’importe lequel. Toto, c’est LE plus grand fan de Johnny que la Terre (et peut-être même l'univers) ait porté.

Pour partager cette passion, il crée un blog sur Blogger — évidemment — avec tout le sérieux d’un webmaster amateur. Et comme tout bon padawan du XML, il farfouille dans le Centre d’aide, puis plonge dans les abysses de Blogger Code PE, où il découvre des joyaux comme les balises <b:if> et la donnée data:view.search.label.

Il comprend vite que cette dernière donnée magique lui permet d’afficher du contenu spécifique selon le libellé sélectionné par un visiteur.

Parfait pour lui ! Il a justement classé ses articles en deux grandes familles :

Par année
  • 1950
  • 1960
  • 1970
  • 1980
  • 1990
  • 2000
  • 2010
  • 2025
Par nom
  • Johnny Cash
  • Johnny Hallyday
  • Johnny English

Toto a une idée géniale : Afficher un message spécial sur toutes les pages de libellés contenant le mot “Johnny”. Et avec l’opérateur contains, c’est du gâteau.

Il écrit donc tout fier son petit bout de code XML :

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

  Je suis le plus grand fan de Johnny ! ! !

</b:if>

Résultat ? Sur les pages "Johnny Cash" ou "Johnny English", tout fonctionne à merveille.

Mais quelques heures plus tard, il retourne voir ses libellés par année… et là… c’est le drame.

... Erreur.
... Message rouge.
... L’univers s’effondre.
... Johnny… ne répond plus.

Le bug surprise

Tout marchait comme sur des roulettes.

Toto filtrait ses libellés, son message apparaissait bien pour les "Johnny", et tout semblait parfait… jusqu’à ce qu’il tombe sur les libellés numériques.

Il teste la page de libellé 1950.

Et là… pan :

Error interpreting blog theme - Invalid expression

Plus rien ne s’affiche. Pas de message personnalisé. Pas même une trace d’article. Juste ce vilain message d’erreur qui casse tout le rendu de la page.

Et ce n’est pas un bug temporaire. Les pages pour 1960, 1970, 1980… même combat : toutes plantent. Mais curieusement, celles pour "Johnny Hallyday" ou "Johnny English", elles, continuent de fonctionner normalement.

Pourquoi ça plante ?

Le code de Toto n’a pas changé. Il utilise bien l’expression data:view.search.label contains "Johnny" dans une balise <b:if>, syntaxiquement correcte.

Mais… il y a un piège invisible, un truc sournois qui se glisse dans l’équation.

Quelque chose qui transforme en douce une valeur parfaitement inoffensive…

Spoiler : c’est pas la faute à Toto. C’est celle du parseur Blogger.

Et on va maintenant voir comment il trahit les chaînes de caractères au profit des nombres, sans prévenir personne.

L’autopsie du bug

Quand on parle d’un Invalid expression dans Blogger, c’est souvent qu’on a fait une coquille dans l’opération, mal fermé une quote ou oublié une donnée.

Mais ici, rien de tout ça.

Le code est parfaitement écrit.

Alors… pourquoi diable Blogger panique-t-il face à 1950 et pas à Johnny ?

Le coupable : la conversion automatique de type

Sous le capot, Blogger essaie d’être malin. Trop malin.

Quand il voit un libellé "1950", il se dit :

« Hmm, ça ressemble à un nombre... allez hop, on convertit ça en number ! »

Résultat : dans l’expression, data:view.search.label qui était "1950" devient 1950 sans guillemets.

Et là… c’est le drame.

L’opérateur contains s’attend à une chaîne de caractères, pas à un nombre.

Il n’est pas programmé pour gérer une syntaxe du type :

1950 contains "Johnny"

Et comme cette combinaison n’est pas autorisée, Blogger te renvoie une belle erreur de syntaxe.

Résumé technique

Valeur du libellé Interprété comme… Résultat avec contains
"Johnny Hallyday" string ✅ Fonctionne
"1950" number ❌ Erreur

C’est ce qu’on appelle un changement implicite de type.

La solution magique

Face à un parseur qui transforme les chaînes en nombres sans crier gare, il nous faut une astuce simple, propre et infaillible.

Et bonne nouvelle : elle existe. Elle tient en une seule ligne, et elle utilise… le bon vieux signe +.

Pourquoi le + fonctionne ?

Sur Blogger, comme en JavaScript, le + a un double rôle :

  • Il sert à faire une addition si les deux côtés sont des nombres.

  • Il fait une concaténation s’il y a une chaîne dans le lot.

Et ça, c’est la clé de notre parade. On va faire un petit test pour deviner le type de la valeur :

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

Ce que ça fait :

Libellé Résultat de la comparaison
"Johnny" "Johnny0""Johnny" → ❌ Faux (ce n’est pas un nombre)
"1950" 1950 = 1950 → ✅ Vrai (c’est un nombre)

Donc si la condition est vraie, on est face à une valeur numérique → on n’utilise pas contains.

Et si elle est fausse, on est bien sur du texte → on peut y aller !

Mise en pratique complète

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

  <!-- Ce libellé est un nombre. On évite "contains". -->

<b:else/>

  <!-- Libellé textuel : on peut utiliser "contains" -->

  <b:if cond='data:view.search.label contains "Johnny"'>
    Je suis le plus grand fan de Johnny !
  </b:if>
</b:if>

Résultat

Libellé Message affiché
"Johnny Cash" Je suis le plus grand fan de Johnny !
"1980" ❌ (aucun message, mais aucune erreur non plus)

Conclusion

Blogger n’est pas capricieux pour rien. C’est juste… qu’il aime jouer avec les types comme un chat avec une pelote de variables.

Toto pensait afficher un simple message pour les fans de Johnny ?

Il s’est retrouvé à déboguer une expression dont la chaîne s’est transformée en nombre, lui jetant à la figure un majestueux : Error interpreting blog theme - Invalid expression

Mais maintenant, grâce à son œil affûté, il sait :

  • Détecter quand une valeur “texte” devient un nombre.

  • Contourner le problème en comparant valeur + 0 à valeur.

  • N’utiliser contains que quand c’est du texte pur.

Toto peut à nouveau dormir sur ses deux oreilles. Son blog est sauvé.

Les fans de Johnny peuvent naviguer sans plantage.

Spotlight

Ajouter son blog dans l’omnibox de Firefox

Populaires cette semaine

Foire aux questions Blogger (Novembre 2021)