/ / Пишіть додаток jekyll для спеціальних тегів з вкладеними тегами - ruby, jekyll, liquid

Проблема з написанням плагіна jekyll для користувацьких тегів з вставленими тегами - ruby, jekyll, liquid

Я намагаюся кодувати плагін jekyll, щоб додати деякі теги для обробки деяких блоків із вкладками, оскільки на моєму сайті буде багато сторінок, що мають такий тип блоків.

Я намагаюся використати цей код:

{% 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 для відповіді № 1

Я не знаю, чому, але Джекіл або Рідкіс вважали, що, з огляду на поглиблення, це був якийсь код для високого рівня.

Я вирішив цю проблему, знову скинувши код конвертованої версії, щоб видалити розриви рядків і видаливши деякі відступи:

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(/rn|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 для відповіді № 2

Це фантастично. Для всіх, хто стикається з цим:

змінити:

getConverterImpl

до

find_converter_instance