Commit b2a54551 authored by Boris's avatar Boris
Browse files

BUG: inconsistent use of tabs and spaces in indentation

parent 2354d868
......@@ -56,7 +56,7 @@ def set_relationships(generator):
page.children = []
# set immediate parents and children
global PAGE_URL
global PAGE_URL
for page in _all_pages():
parent_url = PAGE_URL.replace('{slug}', os.path.dirname(page.url[:-1]))
Page Hierarchy
*Author: Ahmad Khayyat (<>)*
A [Pelican][1] plugin that creates a URL hierarchy for pages that
matches the filesystem hierarchy of their sources.
For example, to have the following filesystem structure of page
sources result in the URLs listed next to each file,
└── content/pages/ # PAGE_DIR
├── # URL: pages/about/
├── # URL: pages/projects/
├── projects/ # (directory)
│ ├── # URL: pages/projects/p1/
│ ├── # URL: pages/projects/p2/
│ └── p2/ # (directory)
│ └── # URL: pages/projects/p2/features/
└── # URL: pages/contact/
you can use this plugin with the following Pelican settings:
PAGE_URL = '{slug}/'
PAGE_SAVE_AS = '{slug}/index.html'
SLUGIFY_SOURCE = 'basename'
When generating the `url` and `save_as` attributes, the plugin
prefixes the page's `slug` by its relative path. Although the initial
`slug` is generated from the page's `title` by default, it can be
generated from the source file basename by setting the
`SLUGIFY_SOURCE` setting to `'basename'`, as shown in the settings
snippet above. The `slug` can also be set using [`PATH_METADATA`][2].
This plugin is compatible with [Pelican translations][3].
Parent and Children Pages
This plugin also adds three attributes to each page object:
- `parent`: the immediate parent page. `None` if the page is
top-level. If a translated page has no parent, the default-language
parent is used.
- `parents`: a list of all ancestor pages, starting from the top-level
- `children`: a list of all immediate child pages, in no specific
These attributes can be used to generate breadcrumbs or nested
navigation menus. For example, this is a template excerpt for
<ul class="breadcrumb">
<li><a href="{{ SITEURL }}/" title="{{ SITENAME }}">
<i class="fa fa-home fa-lg"></i>
{% for parent in page.parents %}
<li><a href="{{ SITEURL }}/{{ parent.url }}">{{ parent.title }}</a></li>
{% endfor %}
<li class="active">{{ page.title }}</li>
from pelican import signals, contents
import os.path
from copy import copy
from itertools import chain
This plugin creates a URL hierarchy for pages that matches the
directory hierarchy of their sources.
class UnexpectedException(Exception): pass
def get_path(page, settings):
''' Return the dirname relative to PAGE_PATHS prefix. '''
path = os.path.split(page.get_relative_source_path())[0] + '/'
path = path.replace( os.path.sep, '/' )
# Try to lstrip the longest prefix first
for prefix in sorted(settings['PAGE_PATHS'], key=len, reverse=True):
if not prefix.endswith('/'): prefix += '/'
if path.startswith(prefix):
return path[len(prefix):-1]
raise UnexpectedException('Page outside of PAGE_PATHS ?!?')
def in_default_lang(page):
# page.in_default_lang property is undocumented (=unstable) interface
return page.lang == page.settings['DEFAULT_LANG']
def override_metadata(content_object):
if type(content_object) is not contents.Page:
page = content_object
path = get_path(page, page.settings)
def _override_value(page, key):
metadata = copy(page.metadata)
# We override the slug to include the path up to the filename
metadata['slug'] = os.path.join(path, page.slug)
# We have to account for non-default language and format either,
infix = '' if in_default_lang(page) else 'LANG_'
return page.settings['PAGE_' + infix + key.upper()].format(**metadata)
for key in ('save_as', 'url'):
if not hasattr(page, 'override_' + key):
setattr(page, 'override_' + key, _override_value(page, key))
def set_relationships(generator):
def _all_pages():
return chain(generator.pages, generator.translations)
# initialize parents and children lists
for page in _all_pages():
page.parent = None
page.parents = []
page.children = []
# set immediate parents and children
for page in _all_pages():
# Parent of /a/b/ is /a/, parent of /a/b.html is /a/
parent_url = os.path.dirname(page.url[:-1])
if parent_url: parent_url += '/'
for page2 in _all_pages():
if page2.url == parent_url and page2 != page:
page.parent = page2
# If no parent found, try the parent of the default language page
if not page.parent and not in_default_lang(page):
for page2 in generator.pages:
if (page.slug == page2.slug and
os.path.dirname(page.source_path) ==
# Only set the parent but not the children, obviously
page.parent = page2.parent
# set all parents (ancestors)
for page in _all_pages():
p = page
while p.parent:
page.parents.insert(0, p.parent)
p = p.parent
def register():
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment