抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

适用于 Volantis5.0.0-rc1~102 版本

0 前言

Hexo当中的主题volantis集成了两种行间代码框高亮模板:highlightjs与prismjs,我们可以在 .yml 配置文件中方便地使用它们。但在使用的时候会出现一些小问题,比如代码字体与正文字体相同和不支持显示行号,可以用接下来提到的方法进行优化。

我参考了GOOPHER老师关于添加highlightjs行号的方法,不过他的文章已经是较为早期的版本了,路径和样式格式已不再适用新版的volantis,因此做了简单的更新。

不过因为我并不熟悉css和JavaScript,本方法仍存在一些没有解决的问题,见最后一个章节,请慎用。

如果有解决方法的话,也请大佬在评论区或者邮件告知我,我会尽快修改该文章。

基于版本号volantis-5.0.0-alpha.5

本方法参考 volantis主题修改代码高亮样式 ,是基于该方法对当前版本的volantis所做的重写。

1 修改步骤

1.1 添加行号显示代码

于位置 /themes/volantis/layout/_plugins/highlight/highlightjs/script.ejs 文件,对其作以下修改:

// 代码高亮部分的css样式
<% if (theme.plugins.highlightjs.css) { %>
  <script>volantis.css("<%- theme.plugins.highlightjs.css %>");</script>
<% } %>
// 代码高亮部分的js,在这里加入引入的代码行号的js文件
<% if (theme.plugins.highlightjs.js) { %>
  <%- js(theme.plugins.highlightjs.js) %>
  <script src="https://npm.elemecdn.com/highlightjs-line-numbers.js@2.8.0/dist/highlightjs-line-numbers.min.js"></script>
  <script>hljs.initHighlightingOnLoad();</script>
  <script>hljs.initLineNumbersOnLoad({ singleLine: true });</script>
  <% } %>
  <script>volantis.requestAnimationFrame(hljs.highlightAll)</script>
  <script>
  volantis.pjax.push(()=>{
      document.querySelectorAll('pre code').forEach((block) => {
        hljs.highlightBlock(block);
        hljs.lineNumbersBlock(block, { singleLine: true });
      });
  },"highlightjs")
  </script>
// 这里是原本拷贝代码按键的部分,只是更改了一下书写格式,好让它不在编辑器里面报太多错
<% if(theme.plugins.highlightjs.copy_code){ %>
<script>
  function pjax_highlightjs_copyCode(){
    if (!(document.querySelector(".highlight .code pre") ||
      document.querySelector(".article pre code"))) {
      return;
    }
    VolantisApp.copyCode(".highlight .code pre, .article pre code")
  }
  volantis.requestAnimationFrame(pjax_highlightjs_copyCode)
  volantis.pjax.push(pjax_highlightjs_copyCode)
</script>
<% } %>

.ejs文件本质上还是JavaScript模板,而原本的引用方法会在我的编辑器当中疯狂警告,因此沿用了参考教程的格式,补充了css和复制按钮部分。

1.2 创建样式文件

路径 /themes/volantis/source/css/ 下创建一个自己的文件夹,如果之前看过添加更多noteblock标签等教程的话,这里面应该存在一个 _自定义名称 的文件夹,这里姑且命名为 _other 文件夹。

这个文件用于存放自己自定义的styl样式,方便整理。当然,要记得在后面的步骤中引入这个文件夹内的样式。

在其中建立名为 codeblock.styl 的样式文件。

/* for block of numbers */
.hljs-ln-numbers {
  -webkit-touch-callout: none;
  -webkit-user-select: none;
  -khtml-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none;
 
  text-align: center;           /* 行号的对齐方式 */
  color: #f6f6f6;               /* 行号颜色 */
  border-right: 1px solid #CCC; /* 竖线的粗细、样式和颜色 */
  vertical-align: top;
  padding-right: 5px;
  font-family:  Menlo, Monaco;  /* 行号的字体,不设置即为正文字体 */
  background:                   /* 行号的背景颜色,为保持一致,请使用highlightjs的css的背景颜色 */
}
 
.hljs-ln-code {
  padding-left: 10px !important;
  font-family:  Menlo, Monaco;  /* 代码的字体,不设置即为code字体 */
  background:                   /* 同上一个background */
}

引入两个部分的样式,分别是行号部分和代码正文部分,可以对其进行样式和字体的修改。

调整暗黑模式下颜色不匹配问题

使用highlightjs之后,volantis的暗黑模式就不会再影响代码框的背景颜色了。

而由于我也不知道什么原因的问题,暗黑模式之下的highlightjs会影响存在代码的代码行的背景色,造成背景色差异。而亮模式下却不存在颜色差异。(可能是因为引入样式之后默认的background参数,不过volantis使用highlightjs之后的代码框在两个模式下都应该是同一个颜色的)

因此,这里用了手动设置背景色 background: 的方法规避掉背景色不同的问题。

这需要在选定好css模板之后,按照模板的颜色设置其背景颜色使其统一,是一种逃课的方法。

诶嘿。

1.3 引入样式文件

在 /themes/volantis/source/css/style.styl 文件中补充引入有刚才写入codeblock.styl 的文件夹(_other),引入形式如下:

@import '_other/'

到这里为止,以前配置完成,只是额外增加行号和更改代码框字体的情况就完全完成了,直接渲染网页,就可以看到更改结果了。

如果之前还没有使用过highlightjs来使代码高亮,那还需要做下后面的事情。

2 使用highlightjs

首先要禁用hexo自带的代码高亮设置,在默认的 _config.yml 文件中:

highlight:
    enable: false

之后在主题的配置文件 _config.volantis.yml 文件中启用highlightjs,并引入选择好的CSS样式。

  # highlight.js
  highlightjs:
    enable: true
    js: https://cdn.jsdelivr.net/gh/highlightjs/cdn-release/build/highlight.min.js # 这一行永远不变
    css: https://npm.elemecdn.com/highlight.js/styles/vs2015.css # 在这一行填写自己选择的样式链接
    # more: https://www.jsdelivr.com/package/npm/highlight.js?path=styles

3 目前存在问题

  1. 使用该方法仍无法解决 folding 插件导致的highlightjs插件渲染代码不分行问题。
  2. 行号相对窗口并非固定位置,当一行代码过长时,移动窗口的滚动条,行号会随代码一同移动。

注:该方法只修改行间代码框字体,没有修改行内代码的字体

评论