0

そのため、Octopressでは、サイトでさまざまな方法で簡単に表示できるパーシャルでいっぱいのフォルダーが必要です。すべてのパーシャルが含まれているドキュメント内にリンクするパーシャルのタイトルのリストが必要です。

これは私が使用したいロジックですが、Octopressで実際に実装する方法がわかりません。

class Collection
  attr_accessor :directory, :files

  def new(dir)
    self.files = []
    self.directory = dir
    load_files
  end

  def list(options={})
    # Handle options here
    files
  end

private

  def load_files
    files_in(@directory).each do |file| # Psuedo-code
      f = Jekyll::FileObject.new(file.read) # Also fictional, but I imagine something similar exists
      f.text # Would return the actual content
      f.yaml # Would return a hash of options from the YAML front matter

      files << f
    end
  end
end

次に、パーシャルのコレクションをロードします。

api_methods = Collection.new("api_methods").list(:alphabetical => true, :method_type => "public")

液体の場合、目次を一覧表示します。

<ul>
{% for partial in api_methods %}
  <li><a href="{% partial.yaml.url %}">{% partial.yaml.name %}</a></li>
{% endfor %}
</ul>

液体の場合、全文を一覧表示します。

{% for partial in api_methods %}
  <h2>{% partial.yaml.name %}</h2>

  {% partial.text %}
{% endfor %}

これで、私がやろうとしていることの基本的な全体像がわかるはずですが、実際にこれを実装する方法については途方に暮れています。

4

1 に答える 1

1

さて、これは私がやろうとしていたことを達成した方法です。

まず、私はナックルダウンして、Jekyllのソースコードを読み通さなければなりませんでした。それがどのように機能するかについての基本的な考えがわかれば、私は入って、特定のものにモンキーパッチを当てることができました。

基本的に、Liquidは非常にシンプルなテンプレートシステムであり、それを使用してデータを変換することはできません。データを「ペイロード」でLiquidに送信する必要があります。これは単なる大きなハッシュです。したがって、データを変換したい場合は、Liquidに送信する前にRubyで変換する必要があります。

だから私はというものを作りましたPayloadExtension

plugins / site.rb

module Jekyll
  class Site
    alias :old_site_payload :site_payload

    def site_payload
      PayloadExtension.payload(old_site_payload)
    end
  end
end

plugins /payload_extension.rb

module Jekyll
  class PayloadExtension
    extend OctopressFilters

    def self.payload(payload)
      pages = payload['site']['pages']

      # Filter pages by Public API methods category and sort by title

      public_api_methods = category_filter(pages, "Public API methods")
      public_api_methods.sort! {|a, b| a.data['title'] <=> b.data['title'] }
      public_api_methods = pre_render(public_api_methods)

      payload['site']['public_api_methods'] = public_api_methods

      payload
    end

  private

    def self.category_filter(pages, category)
      pages.reject do |page|
        cat = page.data['category']

        !cat || cat.empty? || cat != category || ( cat.is_a?(Array) && !cat.include?(category) )
      end
    end

    def self.pre_render(pages)
      pages.collect do |page|
        content = pre_filter(page.content)
        page.data['rendered'] = Liquid::Template.parse(content).render
        page
      end
    end

  end
end

残念ながら、私は混乱することができなかったConvertible#do_layoutので、この段階でアクセスできるデータは最終的なものではありませんが、回避するのは簡単なので問題ありません。

また、ページのコンテンツを自分で手動でレンダリングする必要がありました。これは、配置するだけで、{{ page.content }}完全に解析されていないテキストが吐き出されるためです。

これで、実際のLiquidテンプレートで、次のことができます。

{% for page in site.public_api_methods %}
  <h2>{{ page.title }} / {{ page.http_method | upcase }}</h2>
  {{ page.rendered }}
{% endfor %}

<h3>Public methods</h3>
<ul>
  {% for page in site.public_api_methods %}
    <li><a href="/api/public-methods/#{{ page.title | slugify }}-{{ page.http_method }}">{{ page.title }}</a></li>
  {% endfor %}
</ul>
于 2012-04-20T21:57:05.393 に答える