Comment résoudre fondamentalement le problème d'incompatibilité des balises avec Hexo

Erreurs rencontrees

Si votre blog est construit avec github + hexo, vous avez probablement rencontre des problemes d'analyse des fichiers md dus aux balises de modele nunjucks. Les problemes courants sont les suivants :

15:07:29.010 FATAL Something is wrong. Maybe you can find the solution here: http://hexo.io/docs/troubleshooting.html
Template render error: (unknown path) [Line 37, Column 81]
  expected variable end
    at Object._prettifyError (/Users/ubuntuvim/git/xcoding/node_modules/nunjucks/src/lib.js:36:11)
    at Template.render (/Users/ubuntuvim/git/xcoding/node_modules/nunjucks/src/environment.js:524:21)
    at Environment.renderString (/Users/ubuntuvim/git/xcoding/node_modules/nunjucks/src/environment.js:362:17)
    at Promise (/Users/ubuntuvim/git/xcoding/node_modules/hexo/lib/extend/tag.js:66:9)

Ou encore :

Unhandled rejection Template render error: (unknown path) [Line 10, Column 95]
  unexpected token: #
    at Object._prettifyError (/Users/ubuntuvim/git/xcoding/node_modules/nunjucks/src/lib.js:36:11)

La cause de ces erreurs provient du fait que vos fichiers Markdown contiennent des balises qui entrent en conflit avec le moteur de modeles nunjucks, comme %%, {#, {%. Ces balises sont reservees au moteur de modeles. Pour plus d'informations sur nunjucks, consultez la documentation officielle.

Solution 1

La premiere approche consiste a utiliser des balises brutes :

{% raw %}
%%nom%%
{% endraw %}

Cependant, cette solution n'est que temporaire. Si vous utilisez cette methode, tout le contenu Markdown contenant ces balises sera analyse de maniere incorrecte par la suite.

Solution 2

Il est possible de modifier le code source de nunjucks directement. Locatez le fichier suivant :

node_modules/nunjucks/src/lexer.js

Au debut du fichier, vous trouverez ce code :

'use strict';

var lib = require('./lib');

var espaces = " \n\t\r\xA0";
var delimites = '()[]{}%*-+~/#,:|.<>=!';
var chiffres = '0123456789';
var DEBUT_BLOC = '{%';
var FIN_BLOC = '%}';
var DEBUT_VARIABLE = '[[';
var FIN_VARIABLE = ']]';
var DEBUT_COMMENTAIRE = '{@';
var FIN_COMMENTAIRE = '@}';
var TYPE_CHAINE = 'chaine';

Vous pouvez modifier ces delimiters de rendu. Par exemple, si votre fichier Markdown necessite d'afficher des code comme %%nom%%, procédez comme suit :

var DEBUT_VARIABLE = '[[';
var FIN_VARIABLE = ']]';

Apres avoir modifie les delimiters du moteur de modeles, l'analyse ne rentrera plus en conflit avec votre contenu Markdonw. Cette modfiication s'applique a tous les fichiers Markdown.

Attention : Si vous executez npm install pour mettre a jour les dependances, le fichier node_modules/nunjucks/src/lexer.js sera reimprime et vous devrez re-appliquer cette modification.

Modification des plugins de recherche et RSS

Si vous utilisez hexo-generator-feed, hexo-generator-search ou d'autres plugins dependants de hexo, vous devez egalement modifier les balises de traitement des modeles de ces plugins. taking the search plugin as an example :

Modifiez le fichier suivant :

node_modules/hexo-generator-search/templates/search.xml

Remplacez toutes les occurrences de { par [[ selon vos modifications precedentes.

<?xml version="1.0" encoding="utf-8"?>
<search> 
  {% if posts %}
    {% for post in posts.toArray() %}
    <entry>
      <title>[[ post.title ]]</title>
      <link href="[[ (url + post.path) | uriencode ]]"/>
      <url>[[ (url + post.path) | uriencode ]]</url>
      <content type="html"><![CDATA[[[ post.content | noControlChars | safe ]]]></content>
      {% if post.categories and post.categories.length>0 %}
      <categories>
          {% for cate in post.categories.toArray() %}
          <category> [[ cate.name ]] </category>
          {% endfor %}
      </categories>
      {% endif %}
      {% if post.tags and post.tags.length>0 %}
        <tags>
            {% for tag in post.tags.toArray() %}
            <tag> [[ tag.name ]] </tag>
            {% endfor %}
        </tags>
      {% endif %}
    </entry>
    {% endfor %}
  {% endif %}
</search>

Solution 3

Une solution permanente consiste a modifier le fichier package.json de votre projet et a remplacer les plugins par des versions personnalisees :

{
  "name": "monblog",
  "version": "0.0.1",
  "private": true,
  "hexo": {
    "version": "3.7.1"
  },
  "dependencies": {
    "hexo-generator-feed-cst": "^0.1.0",
    "hexo-generator-search-cst": "^0.1.0"
  }
}

Apres avoir modifie package.json, executez la commande npm install pour reinstaller les dependances. Cette approche ne necessite aucune modification supplementaire des configurations des plugins et vous n'aurez pas a vous soucier des mises a jour qui pourraient ecraser vos modifications.

Étiquettes: hexo nunjucks JavaScript Markdown blog

Publié le 4 juillet à 04h50