6

サイト上のすべてのページ(投稿ではない)の階層ナビゲーションツリーを出力するJekyllのカスタムタグプラグインを作成しようとしています。私は基本的に<ul>、特定のCSSクラスによって現在のページが記録されているページへのリンク(リンクテキストとしてページタイトルを使用)を含むネストされた束が必要です。

私はルビーに非常に不慣れです。私はPHPの人です。

私は、すべてのページを繰り返し処理して1次元のリストを出力することから始めて、少なくともそれができることを確認することから始めようと考えました。これが私がこれまでに持っているものです:

module Jekyll

  class NavTree < Liquid::Tag
    def initialize(tag_name, text, tokens)
      super
    end

    def render(context)
      site = context.registers[:site]
      output = '<ul>'
      site.pages.each do |page|
        output += '<li><a href="'+page.url+'">'+page.title+'</a></li>'
      end
      output += '<ul>'

      output
    end
  end

end

Liquid::Template.register_tag('nav_tree', Jekyll::NavTree)

そして、を介して液体テンプレートに挿入してい{% nav_tree %}ます。

問題は、page上記のコードの変数に、期待するすべてのデータが含まれていないことです。page.titleは未定義でありpage.url、その前にスラッシュが付いた単なるベース名です(たとえば/a/b/c.html、それは私に与えているだけです/c.html)。

私は何が間違っているのですか?

補足:私はすでに純粋なLiquidマークアップでこれを実行しようとしましたが、最終的にはあきらめました。Liquidを使用すると簡単に繰り返し処理できますsite.pagesが、リストを適切にネストする方法がわかりませんでした。

4

3 に答える 3

4

page.title常に定義されているわけではありません(例:) atom.xml。定義されているかどうかを確認する必要があります。次にpage.name、エントリを処理するかどうかを指定できます...

def render(context)
  site = context.registers[:site]
  output = '<ul>'
  site.pages.each do |page|
    unless page.data['title'].nil?
      t = page.data['title']
    else
      t = page.name
    end
    output += "<li><a href="'+page.dir+page.url+'">'+t+'</a></li>"
  end
  output += '<ul>'
  output
end
于 2012-06-04T06:39:31.603 に答える
4

試す:

module Jekyll

  # Add accessor for directory
  class Page
          attr_reader :dir
  end


  class NavTree < Liquid::Tag
    def initialize(tag_name, text, tokens)
      super
    end

    def render(context)
      site = context.registers[:site]
      output = '<ul>'
      site.pages.each do |page|
        output += '<li><a href="'+page.dir+page.url+'">'+(page.data['title'] || page.url) +'</a></li>'
      end
        output += '<ul>'

      output
    end
  end

end

Liquid::Template.register_tag('nav_tree', Jekyll::NavTree)
于 2012-05-30T09:26:03.497 に答える
0

最近、「nillを文字列に変換できません」というエラーが頭を悩ませているという同様の問題に直面しました。私のconfig.ymlファイルには、「baseurl:/ paradocs / jekyll / out /」のような行が含まれています。これで、サーバーのローカルの場合、そのbeseurlを空にする必要があり、ビルド時にエラーが表示されるようになりました。 " baseurl:/ "を作成しました..そしてそれが私の仕事でした。

于 2015-04-14T15:08:03.153 に答える