发布为具有嵌套标签的自定义标签编写jekyll插件的问题

时间:2014-01-14 09:07:33

标签: ruby jekyll liquid

我正在尝试编写一个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">&lt;div id=&quot;tab-1&quot; class=&quot;tab-pane&quot;&gt;&lt;p&gt;Content of tab #1&lt;/p&gt;</code></pre>
</div>

我不知道为什么而且我在Ruby / Liquid中不太了解它自己处理它:)。 有什么想法吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

我不知道为什么,但是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

答案 1 :(得分:1)

太棒了。对于任何遇到此问题的人:

变化:

cellButton = UIButton(frame: CGRect(x: 0, y: 0, width: 30, height: 30));

getConverterImpl