作者: Jim Wang 公众号: 巴博萨船长

在转移自己的文章的时候发现了一个很有意思的事情,现在记录下来,咱们一起看看问题在哪。问题是这样的的,我之前的文章有如下文字

1
ExtractTemporaryFile('{#DotNetFrameWorkWebInstaller}');

如果上述字符以纯文本的形式,即非代码样式和引用样式存在于md文件中,如果这时尝试使用hexo s命令的话,就会有如下异常被抛出。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
someone@somenode-Pro TestBlog % hexo s
INFO Start processing
FATAL Something's wrong. Maybe you can find the solution here: https://hexo.io/docs/troubleshooting.html
Template render error: (unknown path)
Error: expected end of comment, got end of file
at Object._prettifyError (/Users/someone/workspace/TestBlog/node_modules/nunjucks/src/lib.js:36:11)
at Template.render (/Users/someone/workspace/TestBlog/node_modules/nunjucks/src/environment.js:536:21)
at Environment.renderString (/Users/someone/workspace/TestBlog/node_modules/nunjucks/src/environment.js:378:17)
at /Users/someone/workspace/TestBlog/node_modules/hexo/lib/extend/tag.js:120:48
at tryCatcher (/Users/someone/workspace/TestBlog/node_modules/bluebird/js/release/util.js:16:23)
at Function.Promise.fromNode.Promise.fromCallback (/Users/someone/workspace/TestBlog/node_modules/bluebird/js/release/promise.js:209:30)
at Tag.render (/Users/someone/workspace/TestBlog/node_modules/hexo/lib/extend/tag.js:120:18)
at Object.onRenderEnd (/Users/someone/workspace/TestBlog/node_modules/hexo/lib/hexo/post.js:291:22)
at /Users/someone/workspace/TestBlog/node_modules/hexo/lib/hexo/render.js:79:21
at tryCatcher (/Users/someone/workspace/TestBlog/node_modules/bluebird/js/release/util.js:16:23)
at Promise._settlePromiseFromHandler (/Users/someone/workspace/TestBlog/node_modules/bluebird/js/release/promise.js:547:31)
at Promise._settlePromise (/Users/someone/workspace/TestBlog/node_modules/bluebird/js/release/promise.js:604:18)
at Promise._settlePromise0 (/Users/someone/workspace/TestBlog/node_modules/bluebird/js/release/promise.js:649:10)
at Promise._settlePromises (/Users/someone/workspace/TestBlog/node_modules/bluebird/js/release/promise.js:729:18)
at _drainQueueStep (/Users/someone/workspace/TestBlog/node_modules/bluebird/js/release/async.js:93:12)
at _drainQueue (/Users/someone/workspace/TestBlog/node_modules/bluebird/js/release/async.js:86:9)
at Async._drainQueues (/Users/someone/workspace/TestBlog/node_modules/bluebird/js/release/async.js:102:5)
at Immediate.Async.drainQueues (/Users/someone/workspace/TestBlog/node_modules/bluebird/js/release/async.js:15:14)
at processImmediate (internal/timers.js:456:21)

上述异常信息中,重点为Template render error: (unknown path)。应该是,Markdown文件在渲染成html时,ExtractTemporaryFile被视为代码了,而如果修改括号中的参数值为空,异常就不存在了,如下纯文本:

ExtractTemporaryFile(‘’);

确实非常有意思。我了如下的文本,也同样会抛出相同的异常。

1
render('{#DotNetFrameWorkWebInstaller}')

如果试一试一个随意的函数名称呢?比如hello这个作为函数的姓名,如下,一样会抛出异常。

1
hello('{#DotNetFrameWorkWebInstaller}')

这样的话问题应该位于参数部分,即:

1
{#DotNetFrameWorkWebInstaller}

我也做了尝试,如果上述内容作为纯文本出现在Markdown文件内,则会抛出异常。那么如果换个变量名字呢?比如,newparams,即参数部分如下,一行会抛出异常。

1
{#newparams}

问题在于#这个符号,#后面跟着英文字符就会被理解成锚点了。该错误与圆括号有关,即Markdown文件中任何以:左圆括号 + #号 + 英文字符 形式存在的纯文本字符串都会引发上述异常(右侧圆括号可以不存在,例如,下列的字符若以纯文本存在就会引发异常:

1
{#dedee

目前找到的解决方法为在#号前输入两个\ 反斜杠。但是渲染后,还会存在一个反斜杠,所以要额外对此进行说明。感兴趣关注微信公众号,一起讨论学习。


版权声明:
文章首发于 Jim Wang's blog , 转载文章请务必以超链接形式标明文章出处,作者信息及本版权声明。