/ / Emissione di un plugin jekyll per tag personalizzati con tag nidificati - ruby, jekyll, liquid

Scrivi un plugin jekyll per tag personalizzati con tag nidificati: ruby, jekyll, liquid

Sto cercando di codificare un plugin jekyll per aggiungere alcuni tag per gestire alcuni blocchi a schede poiché il mio sito Web avrà un sacco di pagine con questo tipo di blocchi. Voglio modificarlo facilmente in markdown.

Sto cercando di usare questo codice liquido:

{% 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 %}

Dando questo codice 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>

Ecco il mio plugin:

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)

Quando ci provo, il markup non è corretto. Solo il markup della prima scheda è quello che mi aspetto, le altre schede vengono passate attraverso l'evidenziatore del codice e ottengo:

<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>

Non ho idea del perché e non so molto in Ruby / Liquid per gestirlo da solo :). Qualche idea?

Grazie!

risposte:

2 per risposta № 1

Non so perché, ma Jekyll o Liquid hanno considerato che, data la rientranza, si trattava di un codice per highlitght.

Ho risolto questo problema spogliando nuovamente il codice convertito markdown per rimuovere le interruzioni di riga e rimuovendo alcuni rientri:

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 per risposta № 2

È fantastico. Per chiunque incontri questo:

modificare:

getConverterImpl

a

find_converter_instance