blob: e1da8bcd4aaf2f002a777dfa05492ccdc3137e42 [file] [log] [blame]
#!/usr/bin/python -B
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# - Pelican plugin that runs shell scripts during initialization
import sys
import subprocess
import shlex
import io
import os
import os.path
import traceback
import pelican.plugins.signals
import pelican.settings
from pelican.contents import Article, Page, Static
from pelican.generators import (ArticlesGenerator, # noqa: I100
PagesGenerator, SourceFileGenerator,
StaticGenerator, TemplatePagesGenerator)
# get setting
# Settings are for the whole pelican environment.
def get_setting(generators, setting):
for g in generators:
if isinstance(g, PagesGenerator):
return g.settings[setting]
except Exception:
return None
# set context
# Context are the processed settings and other environment which is made available to the JINJA template.
# Changes to the settings have no effect as those are already copied to each generator's context.
def set_context(generators, setting, value):
for g in generators:
if isinstance(g, PagesGenerator):
g.context[setting] = value
return value
return None
# get pages
# The PagesGenerator has a list of pages. Retrieve a sorted array of page information
def get_pages(generators):
site_index = []
for g in generators:
if isinstance(g, PagesGenerator):
for p in g.pages:
# use an absolute path
save_as = '/' + p.save_as
if save_as.endswith('/index.html'):
# use "/" for the filename of index.html files assuring that they are first in a folder's list
save_as = save_as[:-10]
# extract the path name
path, page = os.path.split(save_as)
site_index.append((path, save_as, p.title))
return site_index
# get site index
def get_index(site_index, scope):
current_folder = None
started = False
site_listing = ''
if not scope:
scoped = False
if scope != '**':
scoped = True
for p in site_index:
path, page = os.path.split(p[0])
folder = page.capitalize()
if not scoped or (scoped and p[0].startswith(scope)):
if folder != current_folder:
if started:
site_listing += '</ol>\n'
started = True
site_listing += f'<h3><a href="{p[1]}">{p[2]}</a></h3>\n'
site_listing += '<ol>\n'
current_folder = folder
# menu item for page
site_listing += f'<li><a href="{p[1]}">{p[2]}</a></li>\n'
if started:
site_listing += '</ol>\n'
return site_listing
# get site menu
def get_menu(site_index, menus):
currrent_menu = None
site_menu = ''
if menus:
for f in menus:
path, page = os.path.split(f)
folder = page.capitalize()
site_menu += '<li class="nav-item active dropdown">\n'
site_menu += f'<a class="nav-link dropdown-toggle" href="#" id="dropdown{folder}" '
site_menu += f'role="button" data-toggle="dropdown" aria-expanded="false">{folder}</a>\n'
site_menu += f'<ul class="dropdown-menu" aria-labelledby="dropdown{folder}">\n'
for p in site_index:
if p[0] == f:
# menu item for page
site_menu += f'<li><a class="dropdownitem" href="{p[1]}">{p[2]}</a></li>\n'
site_menu += '</ul></li>\n'
return site_menu
# show pages
def show_pages(generators):
site_index = get_pages(generators)
asf_index = get_setting(generators, 'ASF_INDEX')
set_context(generators, 'SITE_MENU', get_menu(site_index, asf_index['menus']))
set_context(generators, 'SITE_INDEX', get_index(site_index, asf_index['index']))
def tb_finalized(generators):
""" Print any exception, before Pelican chews it into nothingness."""
except Exception:
print('-----', file=sys.stderr)
# exceptions here stop the build
def register():