【问题标题】:How to specify a custom language parser alias for rouge in Jekyll 3?如何在 Jekyll 3 中为 rouge 指定自定义语言解析器别名?
【发布时间】:2020-09-01 00:33:54
【问题描述】:

如何配置 Jekyll & Rouge 以指定一种语言 应使用另一种语言的解析器突出显示。

例如,我希望能够在我的 markdown 源文件中执行此操作:

```nodejs-repl
> foo();
Uncaught ReferenceError: foo is not defined
```

...但使用相同的代码块语法突出显示 语法高亮 Javascript 语言解析器。

我想这样做有几个原因:

  1. 源文件中的语义正确性
  2. 能够运行 prettier 等工具并让它们绕过这些代码块

Rouge 已经有了语言别名的概念(参见下面的示例), 但是是否可以通过 Jekyll 指定自定义语言别名, 如果是这样,如何做到这一点?


详情:

(1)

我正在使用 Jekyll 3.8.5 和 Rouge 3.11.0。

(2)

以下是我的 Jekyll 配置文件的相关部分:

highlighter: rouge

(3)

为了真正清楚“语言别名”指的是什么, 我举个例子:

对于 Javascript,您可以在代码围栏之后同时使用 jsjavascript, 因为它们在 Rouge 中默认是语言别名。 因此,以下两个代码块是相同的:

使用语言别名js:

```js
foo();
```

使用语言别名javascript:

```javascript
foo();
```

【问题讨论】:

    标签: javascript markdown jekyll rouge


    【解决方案1】:

    我能够利用 Jekyll 的 _plugins 目录“扩展”Rogue 荧光笔。

    我的大部分研究来自rogue-rubyGitHub Issue #1392 和LinkedIn 的source codesource code 基于jekyll 的网站。

    步骤

    1. 在你的 Jekyll 根目录中创建一个_plugins 目录
    2. _plugins目录下创建一个ruby文件
    3. 使用以下代码继承现有的Rogue Javascript code 并“扩展”(也称为覆盖)别名列表。
    # This "hook" is executed right before the site's pages are rendered
    Jekyll::Hooks.register :site, :pre_render do |site|
      puts "Adding more JavaScript Markdown aliases..."
      require "rouge"
    
      # This class defines the PDL lexer which is used to highlight "pdl" code snippets during render-time
      class MoreJSLexer < Rouge::Lexers::Javascript
        title 'MoreJS'
        aliases 'js', 'nodejs-repl'
      end
    end
    
    1. 运行jekyll serve 并注意自定义日志行"Adding more JavaScript Markdown aliases..."
     Incremental build: disabled. Enable with --incremental
          Generating... 
           Jekyll Feed: Generating feed for posts
    Adding more JavaScript Markdown aliases...
                        done in 0.637 seconds.
     Auto-regeneration: enabled for '/Users/kueng/work/sandboxes/minima'
        Server address: http://127.0.0.1:4000
      Server running... press ctrl-c to stop.
    

    测试

    我使用minima GitHub 存储库作为我的沙箱和jekyll 3.8.7。我使用步骤 3 中的代码创建了一个 _plugins/more_javascript.rb Ruby 文件。我使用下面的 markdown sn-p 编辑了其中一个 markdown 文件,发现只有 jsnodejs-repl 有语法高亮显示。

    ```nodejs
    var a, b, c;
    a = 5; b = 6; c = a + b;
    document.getElementById("demo1").innerHTML = c;
    ```
    ```js
    var a, b, c;
    a = 5; b = 6; c = a + b;
    document.getElementById("demo1").innerHTML = c;
    ```
    ```nodejs-repl
    var a, b, c;
    a = 5; b = 6; c = a + b;
    document.getElementById("demo1").innerHTML = c;
    ```
    

    【讨论】:

    • 嘿@Kin 这看起来是一个可行的解决方案......但是,由于使用了自定义 Ruby 代码,我感觉它可能无法在 Github 页面上运行。我现在知道我没有在我原来的问题中指定 Github 页面 - 只是想检查一下你是否对此有任何运气/任何想法?
    • 嘿@bguiz。根据我使用 GitHub 页面的经验,我没有看到我使用自定义 Ruby 代码的方法有任何主要障碍。但是,我只有使用 CI/CD 工具(例如 TravisCI)来处理基于 Jekyll 网站的构建步骤的经验。 TravisCI 将执行jekyll build 并将_site 目录推送到GitHub 页面使用的分支(例如gh-pages)。我还运行了jekyll build 并使用了手动git pushgh-pages 分支。我在上面的示例中运行 jekyll build 并注意到 RAW html 仅将 class=highlighter-rouge 添加到 jsnodejs-repl 部分。
    • 继续。由于原始 HTML 在新的自定义 nodejs-repl 上显示了预期的 Rogue 样式,我怀疑让我的解决方案正常工作的唯一未知因素是 GitHub 如何处理 jekyll build 进程。我的经验早于所有新的 GitHub CI/CD 工具。我确实在这里找到了一些关于_plugins Jekyll 目录的支持文档jekyllrb.com/docs/continuous-integration/github-actions/…
    • 是的,有道理。我刚刚在我的 repo 本地尝试了这个——还没有涉及到 Github 页面——而且插件似乎根本没有触发。我什至没有从puts 得到Adding more JavaScript Markdown aliases...,这很奇怪。编辑:这是我的 Gemfile:gist.github.com/bguiz/f585e0cd4b5c4777283e3eb74749101c
    • 在我的测试中,我没有_config.yml 中指定任何荧光笔。我让 Jekyll 默认使用 Rogue。我通常运行 jekyll 4.0,所以我必须创建一个 Gemfile 来将 minima 代码沙箱降级到 Jekyll 3.x。 Gemfile 只有gem "jekyll", "~&gt; 3.8.5"gem "minima"。我使用bundle installbundle exec jekyll s 运行minima 沙箱。
    猜你喜欢
    • 2012-03-16
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    • 2019-10-26
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 2018-12-15
    相关资源
    最近更新 更多