如何将源代码片段添加到 Jekyll 的 _data yaml 中?

How to add source code snippets into _data yaml in Jekyll?

我正在尝试创建代码片段作为我在 Jekyll 中创建的项目网站的示例。

我有这样的 yaml:

-
  description: "Scheme hygienic macro that creates assoc list, with macroexpand."
  code: >
     (define-syntax alist
       (syntax-rules ()
          ((_) ())
          ((_ x y z ...)
           (cons (cons x y) (alist z ...)))))

     (print (alist "foo" 10 "bar" 20 "baz" 30))
     ;; ==> ((foo . 10) (bar . 20) (baz . 30))
     (macroexpand (alist "foo" 10 "bar" 20))
     ;; ==> (#:cons (#:cons "foo" 10)
                    (#:cons (#:cons "bar" 20)
                            ()))

问题是与第一行缩进完全相同的行被连接成单行。我希望它与我的 pre 标记中的 yaml 完全一样。如果我将每一行都缩进 space 我在添加代码段时会在 pre 标记中得到额外的 space。

有没有办法让它准确插入我在yaml文件中的代码?如何在 yaml 中正确缩进,以便在每行之前没有 spaces,并在输出中将每一行都放在自己的行中 html?

我试图在字符串周围添加引号,但它们出现在输出中,我无法在 Liquid 中删除它们。

我试过这个:

  {% for example in site.data.examples %}
  {% assign code = example.code | split: '^"|"$' %}
  <li>
    <div class="example">
      <pre>{{ code[1] }}</pre>
    </div>
    <div class="description">
      {{ example.description }}
    </div>
  </li>
  {% endfor %}

但是 split 不接受正则表达式。我也试过:

{% assign len = example.code.length  %}
{% assign code = example.code | slice: 1,len-2  %}

但它只打印第一个括号。 编辑:

我已经解决了删除引号的问题,但那是死胡同,我仍然在每行之前得到 spaces。

这是一种在 Jekyll 中从字符串中删除引号的方法:

{% assign code = example.code | remove_first: '"' | rstrip | append: "__" | remove: '"__'  %}

看来这比我想的要简单。所需要的只是 Yaml 中的块(参考:https://idratherbewriting.com/documentation-theme-jekyll/mydoc_yaml_tutorial.html

-
  description: "Scheme hygienic macro that creates assoc list, with macroexpand."
  code: |
     (define-syntax alist
       (syntax-rules ()
          ((_) ())
          ((_ x y z ...)
           (cons (cons x y) (alist z ...)))))

     (print (alist "foo" 10 "bar" 20 "baz" 30))
     ;; ==> ((foo . 10) (bar . 20) (baz . 30))
     (macroexpand (alist "foo" 10 "bar" 20))
     ;; ==> (#:cons (#:cons "foo" 10)
                    (#:cons (#:cons "bar" 20)
                            ()))

你可以使用普通变量:

  {% for example in site.data.examples %}
  <li>
    <div class="example">
      <pre>{{ example.code }}</pre>
    </div>
    <div class="description">
      {{ example.description }}
    </div>
  </li>
  {% endfor %}

如果以上内容不适合您,这里是旧版本的答案:

液体非常有限,但我能够创造这个技巧:

  {% for example in site.data.examples %}
  {% assign code = example.code | remove_first: '"' | rstrip | append: "__" | remove: '"__'  | newline_to_br | split: "<br />" %}
  <li>
    <div class="example">
      <pre>{% for line in code %}{{ line | remove_first: " " }}{% endfor %}</pre>
    </div>
    <div class="description">
      {{ example.description }}
    </div>
  </li>
  {% endfor %}

这是我的 examples.yaml

作为参考
-
  description: "Scheme hygienic macro that creates assoc list, with macroexpand."
  code: >
    " (define-syntax alist
       (syntax-rules ()
          ((_) ())
          ((_ x y z ...)
           (cons (cons x y) (alist z ...)))))

     (print (alist "foo" 10 "bar" 20 "baz" 30))
     ;; ==> ((foo . 10) (bar . 20) (baz . 30))
     (macroexpand (alist "foo" 10 "bar" 20))
     ;; ==> (#:cons (#:cons "foo" 10)
                    (#:cons (#:cons "bar" 20)
                            ()))"