美文网首页
Jekyll Liquid使用小问题: {% raw %} 引发

Jekyll Liquid使用小问题: {% raw %} 引发

作者: 爱折腾的大懒猪 | 来源:发表于2019-01-22 00:58 被阅读33次

    今天写了篇Liquid的笔记. 由于用到大量Liquid语法, 因此markdown文件内就使用了{% raw %} ... {% endraw %} 将文章内容包裹起来,避免liquid语法被提前处理. (我不需要他处理, 我只需要他处理markdown部分).

    然后Jekyll 一直报 Warning:

    Warning: Excerpt modified in _posts/Notes/It/Jekyll/2015-07-28-Jekyll_Liquid.md!
         Found a Liquid block containing separator ' ' and has been modified with the appropriate closing tag.
         Feel free to define a custom excerpt or excerpt_separator in the document's Front Matter if the generated excerpt is unsatisfactory.
    

    根据提示, 查了一下Jekyll的excerpt_separator.


    原来, 在Jekyll里面, 能够使用excerpt变量来访问每篇文章post的摘要内容, 默认情况下, 这个摘要内容是第一段内容. 例如我想网页每篇文章都显示部分内容, 就可以用这个excerpt变量.

    可以通过人为指定excerpt_separator变量, 来使文章的摘要部分遇到该excerpt_separator为止. 一般这个excerpt_separator可以在post前面YAML前部指定或者全局在_config.yml中进行指定. 这样, 你的摘要就可以是好几段内容, 而不仅仅是一段内容.

    例如在YAML头部指定:

    ---
    excerpt_separator: <!--more-->
    ---
    
    Excerpt with multiple paragraphs
    
    Here's another paragraph in the excerpt.
    <!--more-->
    Out-of-excerpt
    

    如果要使用excerpt变量, 可以:

    <ul>
      {% for post in site.posts %}
        <li>
          <a href="{{ post.url }}">{{ post.title }}</a>
          {{ post.excerpt }}
        </li>
      {% endfor %}
    </ul>
    

    开始时, 不清楚原理, 找这个错误根据帖子内容, 我尝试在头部加入excerpt_separator: 问题就解决了. 不过这个解决办法的结果是, 整篇内容都变了摘要...

    那为什么会报错内? 因为我从头到尾都用{% raw %} .. {% endraw %}包起来了, Jekyll在处理时优先使用Liquid进行文档解释, 再进行Markdown解释, 这会导致Jekyll在判断excerpt时无法找到第一段内容作为摘要 (实际我肯定有第一段内容的).

    最终解决办法是, 早文章前面先写第一段内容, 再写{% raw %}. 例如:

    ---
    layout: post_toc
    title: Jekyll Liquid语法
    date: 2015-07-28 12:08:07
    categories: IT
    tags: Jekyll Website
    note: 1
    ---
    
    Liquid是 `Shopify` 开发的简易灵活安全的标记语言. 一个重要的应用场景就是Jekyll. Jekyll使用Liquid作为模板语言, 加入了一些标签和filter. Jekyll使用的不一定是最新的Liquid, 可以在Jekyll中查看Liquid的版本. 
    
    {% raw %}
    
    ## 语法基础
    ....
    
    {% endraw %}
    

    OK. 问题解决.


    不过还有个遗留问题: 在Jekyll里面怎么正常表达{% endraw %} 呢...

    找到了参考文献2, 眼前一亮, 问题解决! 将{% 储存为Liquid变量, 再将变量显示出来即可!

    {% assign openTag = '{%' %}
    {% raw %}
    前面的内容...
    {% endraw %}
    这里是要使用endraw的内容. 
    - `{{ openTag }} raw %} ... {{ openTag }} endraw %}`, 不作为Liquid解释, 会作为源码显示. 例如本文上边文字部分由该对tag包围. **很重要!**.
    {% raw %}
    后面的内容...
    {% endraw %}
    
    1. Jekyll post-excerpts
    2. SLaks.Blog: Writing the endraw tag in Jekyll code blocks

    相关文章

      网友评论

          本文标题:Jekyll Liquid使用小问题: {% raw %} 引发

          本文链接:https://www.haomeiwen.com/subject/ydekjqtx.html