前2个星期使用hexo的标签插件,在写文章内容,对于代码我都使用其中的Code Block
来高亮显示。
Code Block在markdown中使用可以参考这里,语法为:
最初我并没有在codeblock中指定[lang:language]
:
```
{% codeblock %}
my code here...
my code continue...
my code end...
{% endcodeblock %}
```
于是代码高亮有时候不能正确显示,比如对于c的注释/* some comment */
,单纯一行的注释是没问题的,但如果遇到多行的注释,则在注释开始/*
之后的内容,甚至包括注释结尾*/
之后的代码,就不能正常高亮显示,这困扰了我一个多星期。
今晚看了下hexo的highlight.js这个js内容,它对代码高亮的语言类型做了点预处理和判断:在调用真实做代码高亮的脚本in github前,先判断codeblock是否带lang这个key,如果没有,就让highlight自动高亮代码,问题是这个自动不够智能。
于是手动在codeblock中增加[lang:language]
来显式指定代码语言,问题是一开始我使用的是lang:c++
,然而识别不到c++,代码高亮还是不正常,让我很迷惑。难道真的是highlight.js对于token的解析有错误吗?
后来,在highlight->github->readme中看到,如果要自定义高亮方案,说是参考文件classref.txt,上面包含了它支持的语言的类型,其中:
C++ ("cpp"):
keyword keyword
number number
string string and character
comment comment
preprocessor preprocessor directive
stl_container instantiation of STL containers ("vector<...>")
sigh…在codeblock中应该添加
lang:cpp
来指明要高亮的语言,而不是lang:c++
,其他语言也类似参考这份定义。
于是正常高亮代码。
```
{% codeblock lang:cpp %}
my code here...
my code continue...
my code end...
{% endcodeblock %}
```
hexo的highlight.js增加了lang:plain
这个类型的支持:
if (!options.lang){
var compiled = hljs.highlightAuto(raw).value;
} else if (options.lang === 'plain'){
var compiled = raw;
} else {
var lang = options.lang.toLowerCase();
if (keys.indexOf(lang) !== -1) lang = alias[lang];
try {
var compiled = hljs.highlight(lang, raw).value;
} catch (e){
var compiled = hljs.highlightAuto(raw).value;
}
}
可以用这个类型来屏蔽一些代码高亮,比如写一些伪代码时就可以用上了。
根据styles使用了几个高亮颜色方案,最后还是恢复hexo默认主题自带的颜色。
– EOF –