Nunjucks Errors

  • 🕥😴
  • Nunjucks模板标签导致MD文件解析报错的问题:
1
2
3
4
5
6
7
8
FATAL {
err: Error [Nunjucks Error]: _posts/mathBasic.md [Line 13, Column 14] expected variable end
===== Context Dump =====
=== (line number probably different from source) ===
8 | <p>$f’({ {x}<em>{0} })=\underset{\Delta x\to 0}{\mathop{\lim } },\frac{f({ {x}</em>{0} }+\Delta x)-f({ {x}_{0} })}{\Delta x}$ (1)</p>
9 | <p>或者:</p>
10 | <p>$f’({ {x}<em>{0} })=\underset{x\to { {x}</em>{0} }}{\mathop{\lim } },\frac{f(x)-f({ {x}<em>{0} })}{x-{ {x}</em>{0} }}$ (2)</p>

分析

  • Markdown文件中有标签与nunjucks模板引擎的标签冲突,比如
1
2
3
4
{{
{{{
}}}
}}
  • 这些标签都是模板引擎的,如果Markdown文件中有这些标签,那么在解析的时候就会把Markdown中的标签动态解析
  • 处理方法就是避免出现这些标签

解决方案1

  • 考虑过将在两个标签中增加一个空格来避免冲突,可以成功渲染,本地markdown也可以解析出公式,但hexo上的markdowm无法解析,故建议不要使用,本质上没有完全解决问题。

解决方案2

参考两个Issues

网上目前很多解决方案都是进行类似如下的替换,需要对所有公式进行替换,量比较大并且治标不治本,暂不采用

1
2
3
{% raw %}
{{name}}
{% endraw %}

解决方案3

  • 直接修改Nunjucks源码

node_modules/nunjucks/src/lexer.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
'use strict';

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

var whitespaceChars = " \n\t\r\xA0";
var delimChars = '()[]{}%*-+~/#,:|.<>=!';
var intChars = '0123456789';
var BLOCK_START = '{%';
var BLOCK_END = '%}';
var VARIABLE_START = '{$';
var VARIABLE_END = '$}';
var COMMENT_START = '{#';
var COMMENT_END = '#}';
var TOKEN_STRING = 'string';
var TOKEN_WHITESPACE = 'whitespace';
var TOKEN_DATA = 'data';
var TOKEN_BLOCK_START = 'block-start';
var TOKEN_BLOCK_END = 'block-end';
var TOKEN_VARIABLE_START = 'variable-start';

冲突部分:

1
2
var VARIABLE_START = '{{';
var VARIABLE_END = '}}';

作如下替换:

1
2
var VARIABLE_START = '{$';
var VARIABLE_END = '$}';

找到定义部分的VARIABLE_STARTVARIABLE_END,这次的{{`和`}}错误就是这个导致,上述代码已经将两个变量从{{`改为`{$`,`}}改为$}
通过直接修改渲染标签,解析的时候就不会和markdown中的复杂公式冲突,并且对所文件都有效,为了防止之后重新npm install的时候还原,所以在这里记录一笔

Others

其他的hexo依赖插件目前还没有发现因为修改Nunjucks源码而出现的问题,例如hexo-generator-searchdbhexo-generator-sitemap等,有些插件也是依赖于Nunjucks的,如果出现问题,同步修改插件的xml模板文件就可以解决。

Update 2025.04.19

果然记一笔是有用的,最近发现全局搜索出了问题,开始排查,果然是改Nunjucks源码引起的。

  • hexo-generator-searchdb插件的模板文件中也有{{`和`}},所以在搜索的时候会报错,解决方法是将插件中的{{`和`}}作相同的替换,node_modules/hexo-generator-searchdb/templates/search.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version="1.0" encoding="utf-8"?>
<search>
{%- for article in articles %}
<entry>
<title>{$ article.title $}</title>
<url>{$ article.url $}</url>
<content><![CDATA[{$ article.content | safe $}]]></content>
{%- if article.categories %}
<categories>
{%- for category in article.categories %}
<category>{$ category $}</category>
{%- endfor %}
</categories>
{%- endif %}
{%- if article.tags %}
<tags>
{%- for tag in article.tags %}
<tag>{$ tag $}</tag>
{%- endfor %}
</tags>
{%- endif %}
</entry>
{%- endfor %}
</search>
  • hexo-generator-sitemap插件的模板文件中也有{{`和`}}xml文件中的{{`和`}}作相同的替换,node_modules/hexo-generator-sitemap/sitemap.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
{% for post in posts %}
<url>
<loc>{$ post.permalink | uriencode $}</loc>
{% if post.updated %}
<lastmod>{$ post.updated | formatDate $}</lastmod>
{% elif post.date %}
<lastmod>{$ post.date | formatDate $}</lastmod>
{% endif %}
<changefreq>monthly</changefreq>
<priority>0.6</priority>
</url>
{% endfor %}

<url>
<loc>{$ config.url | uriencode $}</loc>
<lastmod>{$ sNow | formatDate $}</lastmod>
<changefreq>daily</changefreq>
<priority>1.0</priority>
</url>

{% for tag in tags %}
<url>
<loc>{$ tag.permalink | uriencode $}</loc>
<lastmod>{$ sNow | formatDate $}</lastmod>
<changefreq>weekly</changefreq>
<priority>0.2</priority>
</url>
{% endfor %}

{% for cat in categories %}
<url>
<loc>{$ cat.permalink | uriencode $}</loc>
<lastmod>{$ sNow | formatDate $}</lastmod>
<changefreq>weekly</changefreq>
<priority>0.2</priority>
</url>
{% endfor %}
</urlset>
  • hexo-generator-feed插件也要改
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2020-2025 | Zhicheng Ling

请我喝杯咖啡吧~