0

middleman でページを作成するとき、どのページが親/兄弟/子であるかをどのように示すのですか? ドキュメントには、親の兄弟と子のメソッドを使用してナビゲーションとブレッドクラムを作成する方法が示されていますが、ディレクトリ内のこれらのメソッド (親、兄弟、子) に応答するようにページを配置する方法については言及されていません。適切な方法。

Each resource in the sitemap is a Resource object. Pages can tell you all kinds of interesting things about themselves. You can access frontmatter data, file extension, source and output paths, a linkable url, its mime type, etc. Some of the properties of the Page are mostly useful for Middleman's rendering internals, but you could imagine filtering pages on file extension to find all .html files, for example.

Each page can also find other pages related to it in the site hierarchy. The parent, siblings, and children methods are particularly useful in building navigation menus and breadcrumbs.

これは親メソッドです http://rubydoc.info/github/middleman/middleman/Middleman/Sitemap/Extensions/Traversal#parent-instance_method

これは子メソッド http://rubydoc.info/github/middleman/middleman/Middleman/Sitemap/Extensions/Traversal#children-instance_methodです

これが兄弟方式です

http://rubydoc.info/github/middleman/middleman/Middleman/Sitemap/Extensions/Traversal#siblings-instance_method

4

1 に答える 1

8

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 コードの説明は割愛します。さらに調査をご希望の場合は、コメントでお知らせください。折り返しご連絡いたします。

于 2013-03-19T13:42:34.583 に答える