Jekyll HTML闭合标签转义问题:构建出版物列表时如何避免标签被转义?
嘿,这个问题我之前折腾过好一阵!核心原因其实是你代码里用了HTML实体(</>)代替原生HTML标签,再叠加Jekyll的渲染机制,才导致闭合标签被双重转义。给你几个精准的解决方案:
1. 最关键:把HTML实体换成原生标签
你现在写的</li>这种写法本身就是文本形式的HTML实体,Jekyll会把它当成普通文本处理,最终输出时自然会转义成&lt;/li&gt;。
直接把代码里所有的<替换成<,>替换成>,修正后的代码应该是这样的:
<div class="publications"> {% assign sorted_pubs = site.publications | sort: "date" %} <ol> {% for pub in sorted_pubs %} <li>{% include pubformat.html %}</li> {% endfor %} </ol> </div>
(顺便给代码加了换行,可读性更好,不影响渲染)
2. 把代码放到正确的模板文件里
如果是用_includes,一定要把这段代码存成**.html后缀**的文件(比如_includes/publication-list.html),不要用.md。因为.md文件会经过Markdown解析器处理,可能对HTML标签做额外转义。
之后在你的页面(比如index.html或者某个内容页)里用Liquid标签调用它:
{% include publication-list.html %}
3. 确认Markdown渲染器的设置(如果在.md页面里用)
如果你一定要在.md页面里直接写这段代码,需要确保Jekyll的Markdown渲染器允许内嵌HTML。打开_config.yml,检查或添加以下配置:
markdown: kramdown kramdown: parse_block_html: true
parse_block_html选项会让kramdown(Jekyll默认渲染器)正确识别并渲染块级HTML标签,不会把它们当成普通文本转义。
4. 极端情况:用raw过滤器强制关闭转义
如果上面的方法都不行,大概率是pubformat.html里的内容被Liquid自动转义了。你可以在pubformat.html里输出内容时加上| raw过滤器,强制不转义:
{{ pub.title | raw }} {{ pub.authors | raw }}
不过这种情况很少见,一般前面的步骤就能解决问题。
按这个流程走,应该就能解决标签被转义的问题了!
内容的提问来源于stack exchange,提问作者yohai

