为具有嵌套标签的自定义标签编写 jekyll 插件时出现问题
Posted
技术标签:
【中文标题】为具有嵌套标签的自定义标签编写 jekyll 插件时出现问题【英文标题】:Issue writing a jekyll plugin for custom tags having nested tags 【发布时间】:2014-01-14 09:07:33 【问题描述】:我正在尝试编写一个 jekyll 插件来添加一些标签来处理一些选项卡式块,因为我的网站会有很多页面都有这种块。我想在 Markdown 中轻松编辑它。
我正在尝试使用这个液体代码:
% tabs %
% tab tab-1 %
Content of tab #1
% endtab %
% tab tab-2 %
Content of tab #2
% endtab %
% tab tab-3 %
Content of tab #3
% endtab %
% endtabs %
给出这个 html 代码:
<div class="tab-content">
<div class="tab-pane" id="tab-1">
Content of tab #1
</div>
<div class="tab-pane" id="tab-2">
Content of tab #2
</div>
<div class="tab-pane" id="tab-3">
Content of tab #3
</div>
</div>
这是我的插件:
module Tags
class TabsBlock < Liquid::Block
def render(context)
'<div class="tab-content">' + super + "</div>"
end
end
class TabBlock < Liquid::Block
def initialize(tag_name, tab, tokens)
super
@tab = tab.strip
end
def render(context)
return "" if @tab.empty?
site = context.registers[:site]
converter = site.getConverterImpl(Jekyll::Converters::Markdown)
content = super.strip
content = converter.convert(content)
'<div id="' + @tab + '" class="tab-pane">' + content + "</div>"
end
end
end
Liquid::Template.register_tag("tabs", Tags::TabsBlock)
Liquid::Template.register_tag("tab", Tags::TabBlock)
当我尝试时,标记不正确。 只有第一个选项卡的标记是我所期望的,其他选项卡通过代码荧光笔传递,我得到:
<div class="highlight">
<pre><code class="text language-text" data-lang="text"><div id="tab-1" class="tab-pane"><p>Content of tab #1</p></code></pre>
</div>
我不知道为什么,而且我对 Ruby/Liquid 了解不多,无法自己处理 :)。 有什么想法吗?
谢谢!
【问题讨论】:
【参考方案1】:我不知道为什么,但 Jekyll 或 Liquid 认为,鉴于缩进,这是一些需要突出显示的代码。
我通过再次剥离降价转换代码以删除换行符并删除一些缩进来解决此问题:
class TabBlock < Liquid::Block
def initialize(tag_name, tab, tokens)
super
@tab = tab.strip
end
def render(context)
return "" if @tab.empty?
site = context.registers[:site]
converter = site.getConverterImpl(Jekyll::Converters::Markdown)
lines = super.rstrip.split(/\r\n|\r|\n/).select |line| line.size > 0
indentation = lines.map do |line|
match = line.match(/^(\s+)[^\s]+/)
match ? match[1].size : 0
end
indentation = indentation.min
content = indentation ? super.gsub(/^#' |\t' * indentation/, '') : super
content = converter.convert(content)
content = content.strip # Strip again to avoid "\n"
'<div id="' + @tab + '" class="tab-pane">' + content + "</div>"
end
end
【讨论】:
【参考方案2】:这太棒了。对于遇到此问题的任何人:
改变:
getConverterImpl
到
find_converter_instance
【讨论】:
以上是关于为具有嵌套标签的自定义标签编写 jekyll 插件时出现问题的主要内容,如果未能解决你的问题,请参考以下文章