IsAncestor

IsAncestor


Reports whether PAGE1 is an ancestor of PAGE2.

With this content structure:

content/
├── auctions/
│   ├── 2023-11/
│   │   ├── _index.md
│   │   ├── auction-1.md
│   │   └── auction-2.md
│   ├── 2023-12/
│   │   ├── _index.md
│   │   ├── auction-3.md
│   │   └── auction-4.md
│   ├── _index.md
│   ├── bidding.md
│   └── payment.md
└── _index.md

When rendering the “auctions” page:

{{ with .Site.GetPage "/" }}
  {{ $.IsAncestor . }} → false
{{ end }}

{{ with .Site.GetPage "/auctions" }}
  {{ $.IsAncestor . }} → false
{{ end }}

{{ with .Site.GetPage "/auctions/2023-11" }}
  {{ $.IsAncestor . }} → true
{{ end }}

{{ with .Site.GetPage "/auctions/2023-11/auction-2" }}
  {{ $.IsAncestor . }} → true
{{ end }}

In the examples above we are coding defensively using the with statement, returning nothing if the page does not exist. By adding an else clause we can do some error reporting:

{{ $path := "/auctions/2023-11" }}
{{ with .Site.GetPage $path }}
  {{ $.IsAncestor . }} → true
{{ else }}
  {{ errorf "Unable to find the section with path %s" $path }}
{{ end }}

Understanding context #

Inside of the with block, the context (the dot) is the section Page object, not the Page object passed into the template. If we were to use this syntax:

{{ with .Site.GetPage "/auctions" }}
  {{ .IsAncestor . }} → true
{{ end }}

The result would be wrong when rendering the “auction-1” page because we are comparing the section page to itself.

{{ with .Site.GetPage "/auctions" }}
  {{ $.IsAncestor . }} → true
{{ end }}