所以在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 %}
因此,我们希望能够为您提供我想要做的基本情况,但我对如何实现这一点感到茫然。
答案 0 :(得分:1)
好的,这就是我完成我的目标。
首先,我不得不喋喋不休地阅读Jekyll的源代码。一旦我对它的工作方式有了基本的了解,我就可以进去修补某些东西。
基本上,Liquid是一个非常简单的模板系统,您无法使用它转换任何数据。您必须在“有效负载”中将数据发送到Liquid,这只是一个很大的哈希值。因此,如果我想转换一些数据,我必须在Ruby发送到Liquid之前这样做。
所以我做了一个名为PayloadExtension
的事情:
<强>插件/ site.rb 强>
module Jekyll
class Site
alias :old_site_payload :site_payload
def site_payload
PayloadExtension.payload(old_site_payload)
end
end
end
<强>插件/ 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>