Middleman のコードを少し調べてみたところ、#parent
、#children
、および#siblings
メソッドを記述した Cucumber テストを見つけました。
middleman / middleman-core / features / sitemap_traversal.feature :
Feature: Step through sitemap as a tree
Scenario: Root
Given the Server is running at "traversal-app"
When I go to "/index.html"
Then I should see "Path: index.html"
Then I should not see "Parent: index.html"
Then I should see "Child: sub/index.html"
Then I should see "Child: root.html"
Then I should not see "Child: proxied.html"
...continued...
- つまり、親リソースは「index.html」というファイル名で 1 レベル上にあるように見えるので、 を表示している場合
/foo/bar/some_resource.html
、その親は にあります/foo/index.html
。
/foo/bar/
その兄弟はリクエストと同じレベルです (「名前を冠したディレクトリ」は「インデックス ファイル」に変換されることに注意し/foo/bar.html
て/foo/*
ください。
- その子は下のレベルにあります。
#parent
ファイル階層のそれぞれの位置に任意のファイルを配置することで、 、#children
、またはを呼び出して、そのファイル、またはそのファイルを含むセットを参照できるはずです#siblings
。
テストを読んでいる間、構成ファイルに設定されたいくつかの「偽の」ルート (/sub/fake.html
およびfake2.html
、/directory-indexed/fake.html
およびfake2.html
) があることに注意してください。
より深いダイビング
キュウリのテストを額面通りに受けることができない場合 (私はあなたを責めません)、他にもあります! 結局のところ、この「見るべき」と「見るべきではない」というナンセンスとは何なのか?そうですね、それには答えがあります。
テスト用のフィクスチャ ( middleman/middleman-core/fixtures/traversal-app/ ) では、layout.erbが内容を含む唯一のファイルです。その中で、Child、Parent、および Sibling パスが HTML ドキュメントの本文に出力されていることがわかります。
ミドルマン / ミドルマンコア / フィクスチャ / トラバーサルアプリ / ソース / layout.erb :
Path: <%= current_page.path %>
Source: <%= current_page.source_file.sub(root + "/", "") %>
<% if current_page.parent %>
Parent: <%= current_page.parent.path %>
<% end %>
...continued...
これは、レイアウトに由来する、応答本文内の文字列を単に探しているテストを説明するのに役立ちます。テストの正確な動作は、Cucumber のステップ定義 ( middleman / middleman-core / lib / middleman-core / step_definitions / ) で確認できます。
最後に、レイアウトは、最初に記述したメソッド#parent
、#children
、および#siblings
を使用します。これらは middleman-core で定義されています。
middleman / middleman-core / lib / middleman-core / sitemap / extensions / traversal.rb 内:
module Traversal
# This resource's parent resource
# @return [Middleman::Sitemap::Resource, nil]
def parent
parts = path.split("/")
parts.pop if path.include?(app.index_file)
return nil if parts.length < 1
parts.pop
parts << app.index_file
parent_path = "/" + parts.join("/")
store.find_resource_by_destination_path(parent_path)
end
# This resource's child resources
# @return [Array<Middleman::Sitemap::Resource>]
def children
return [] unless directory_index?
if eponymous_directory?
base_path = eponymous_directory_path
prefix = %r|^#{base_path.sub("/", "\\/")}|
else
base_path = path.sub("#{app.index_file}", "")
prefix = %r|^#{base_path.sub("/", "\\/")}|
end
store.resources.select do |sub_resource|
if sub_resource.path == self.path || sub_resource.path !~ prefix
false
else
inner_path = sub_resource.path.sub(prefix, "")
parts = inner_path.split("/")
if parts.length == 1
true
elsif parts.length == 2
parts.last == app.index_file
else
false
end
end
end
end
# This resource's sibling resources
# @return [Array<Middleman::Sitemap::Resource>]
def siblings
return [] unless parent
parent.children.reject { |p| p == self }
end
...continued...
end
仕事に急がなければならないので、Ruby コードの説明は割愛します。さらに調査をご希望の場合は、コメントでお知らせください。折り返しご連絡いたします。