hexo的代码高亮

前2个星期使用hexo的标签插件,在写文章内容,对于代码我都使用其中的Code Block来高亮显示。
Code Block在markdown中使用可以参考这里,语法为:

``` {% codeblock [title] [lang:language] [url] [link text] %} code snippet {% endcodeblock %} ```

最初我并没有在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 –

Categories: hexo
Tags: hexo