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模板文件就可以解决。

  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.

请我喝杯咖啡吧~