1

プラグインの説明に従って、テンプレート ページを作成する独自のジェネレーターを作成します。しかし、それは私のように振る舞うことはありません。生成されたテンプレートは Liquid によって解析されず、生成後にレンダリングされません。

どうすればできるか知っていますか?

現在、ジェネレーターは次のようになっています。

module Jekyll
   class TagPages < Generator
   safe true
   priority :highest

      def generate(site)
         site.tags.each { |tag, posts|
             html = ''
             html << <<-HTML
---
layout: tag_page
---
<ul>
HTML
             posts.each { |post| html << "<li>#{post.url}</li>" }
             html << "</ul>"
             File.open("tags/#{tag}.html", 'w+') do |file|
                 file.puts html
             end
         }
      end
   end
end

というわけで、例えばタグの場合、こんな感じfree-softwareのページを作成します。tags/free-software.html

---
layout: tag_page
---
<ul>
<li>/link_to_my_post_relative_to_free_software.html</li>
<li>/another_amazing_post.html</li></ul>

液体システムがこのページをレンダリングするようにしたい場合はどうすればよいですか? サイトの生成の開始時に Generator が実際に呼び出されることを確認する方法はありますか?

編集:

jekyll のソース コードによると、generateが前に呼び出されrenderます (80 行目)。だから誰かが私が間違っていることを教えてくれたら、それは助けになるかもしれません.

編集2:

renderの後に が呼び出されてもgenerate、この 2 つのステップの間にディスクからファイルを読み取らないため、生成されたファイルは無視されます。

4

2 に答える 2

1

この古代の謎を解決するために:generateは確かに の前に呼び出されますが、 inventoryの後にrender呼び出されます。ジェネレーターが実行されるまでに、Jekyll は処理するファイル (およびその内容) のリストを既に「認識」しており、生成されたファイルはそれらの中にありません (または、古いものが横たわっていた場合、古い内容は既知であり、生成されたコンテンツは無視されます)。

これを解決するには、新しい Jekyll::Page を site.pages に追加し、インベントリされたものがあればそれをダンプします:

def generate(site)
    site.static_files.select {|sf| sf.path.end_with?('/your_infile_name')}.each {|your_infile|

        # generate your_new_file from your_infile

        relative_dir = your_infile.relative_path[1..-15] # -length of your new_file_name 
        new_page =  Jekyll::Page.new(site, Dir.pwd, relative_dir, new_file_name)
        site.pages.delete_if {|p| p.path == relative_dir + file_name}  << new_page
于 2014-10-09T18:57:03.683 に答える
0

私はそれを液体タグにします。それを行うより良い方法です。

于 2011-04-21T14:04:51.657 に答える