2012-04-22 12 views
6

Jekyll用のカスタムタグプラグインを作成しようとしていますが、これはサイト上のすべてのページ(投稿ではない)の階層ナビゲーションツリーを出力します。私は基本的に束を入れたいと思っています.のリンクは、特定のCSSクラスが指摘している現在のページのページへのリンク(リンクテキストとしてのページタイトル付き)を持っています。Jekyllプラグインからページデータを取得できません

私は非常にルビーに慣れていません。私は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となります)。

私は間違っていますか?

サイドノート:私はすでに純粋なリキッドマークアップでこれをやってみましたが、やっと私は諦めました。 site.pagesをLiquidでうまく反復することは簡単ですが、リストを適切にネストする方法を見つけることができませんでした。

+0

誰かが答えを知っているかどうかを確認するために[GitHubに関する問題](https://github.com/mojombo/jekyll/issues/548)を作成しました。 – jnrbsn

+0

あなたはネスティングが機能するように管理しましたか?もし私が最終的なコードを見たいと思っていたら – bwest

+0

@Brand残念ながら、私はそれを仕上げることはなかった。 – jnrbsn

答えて

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) 
+0

このコードでは、 'Liquid error:nilをStringに変換できません。 – jnrbsn

+1

あなたはたぶんタイトルがないページを持っていたので、page.data ['title']はnilです。交換する(page.data ['title'] || page.url)。 –

+2

遅れて申し訳ありません。あなたは正しい。タイトルなしのページがありました。あなたのソリューションは機能します。 – jnrbsn

4

page.titleは常に定義されていません(例:atom.xml)。定義されているかどうかをチェックする必要があります。そして、あなたは最近、私はエラー「文字列にnillを変換することはできませんが、」ちょうど私の頭を吹いている同様の問題に直面した...エントリを処理

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

短くしないと短くしてください: 't = page.data ['title'] || page.name' – tamouse

0

page.nameを取るか、またはすることはできません。私のconfig.ymlファイルは、 "baseurl:/ paradocs/jekyll/out/"のような行を保持するようになりました。サーバー用のローカル用です。私はそのbeseurlを空にする必要があります。私は "baseurl:/"としなければなりません。それが私の仕事でした。

関連する問題