2012-08-29 12:17:59 -07:00
|
|
|
import copy
|
2019-11-17 19:19:37 +03:00
|
|
|
import importlib.util
|
2012-08-01 13:36:47 -04:00
|
|
|
import inspect
|
2011-02-01 21:44:50 +00:00
|
|
|
import locale
|
2012-03-20 13:01:21 +00:00
|
|
|
import logging
|
2015-06-16 09:25:09 +02:00
|
|
|
import os
|
2018-08-07 17:35:16 +02:00
|
|
|
import re
|
2023-10-11 19:29:17 +02:00
|
|
|
import sys
|
2015-06-16 09:25:09 +02:00
|
|
|
from os.path import isabs
|
2020-05-21 21:43:06 -06:00
|
|
|
from pathlib import Path
|
2023-12-17 13:56:33 +01:00
|
|
|
from types import ModuleType
|
|
|
|
|
from typing import Any, Dict, Optional
|
2015-06-16 09:25:09 +02:00
|
|
|
|
|
|
|
|
from pelican.log import LimitFilter
|
2012-03-20 13:01:21 +00:00
|
|
|
|
2019-09-23 17:48:56 +02:00
|
|
|
|
2023-12-17 13:56:33 +01:00
|
|
|
def load_source(name: str, path: str) -> ModuleType:
|
2019-11-17 19:19:37 +03:00
|
|
|
spec = importlib.util.spec_from_file_location(name, path)
|
|
|
|
|
mod = importlib.util.module_from_spec(spec)
|
2023-10-11 19:29:17 +02:00
|
|
|
sys.modules[name] = mod
|
2019-11-17 19:19:37 +03:00
|
|
|
spec.loader.exec_module(mod)
|
|
|
|
|
return mod
|
2013-04-13 16:36:05 -04:00
|
|
|
|
2012-03-20 13:01:21 +00:00
|
|
|
|
|
|
|
|
logger = logging.getLogger(__name__)
|
2010-10-30 00:56:40 +01:00
|
|
|
|
2023-12-17 13:56:33 +01:00
|
|
|
Settings = Dict[str, Any]
|
|
|
|
|
|
2023-10-29 22:18:29 +01:00
|
|
|
DEFAULT_THEME = os.path.join(
|
|
|
|
|
os.path.dirname(os.path.abspath(__file__)), "themes", "notmyidea"
|
|
|
|
|
)
|
2013-03-24 08:38:19 -04:00
|
|
|
DEFAULT_CONFIG = {
|
2023-10-29 22:18:29 +01:00
|
|
|
"PATH": os.curdir,
|
|
|
|
|
"ARTICLE_PATHS": [""],
|
|
|
|
|
"ARTICLE_EXCLUDES": [],
|
|
|
|
|
"PAGE_PATHS": ["pages"],
|
|
|
|
|
"PAGE_EXCLUDES": [],
|
|
|
|
|
"THEME": DEFAULT_THEME,
|
|
|
|
|
"OUTPUT_PATH": "output",
|
|
|
|
|
"READERS": {},
|
|
|
|
|
"STATIC_PATHS": ["images"],
|
|
|
|
|
"STATIC_EXCLUDES": [],
|
|
|
|
|
"STATIC_EXCLUDE_SOURCES": True,
|
|
|
|
|
"THEME_STATIC_DIR": "theme",
|
|
|
|
|
"THEME_STATIC_PATHS": [
|
|
|
|
|
"static",
|
2013-07-29 08:10:28 -04:00
|
|
|
],
|
2023-10-29 22:18:29 +01:00
|
|
|
"FEED_ALL_ATOM": "feeds/all.atom.xml",
|
|
|
|
|
"CATEGORY_FEED_ATOM": "feeds/{slug}.atom.xml",
|
|
|
|
|
"AUTHOR_FEED_ATOM": "feeds/{slug}.atom.xml",
|
|
|
|
|
"AUTHOR_FEED_RSS": "feeds/{slug}.rss.xml",
|
|
|
|
|
"TRANSLATION_FEED_ATOM": "feeds/all-{lang}.atom.xml",
|
|
|
|
|
"FEED_MAX_ITEMS": 100,
|
|
|
|
|
"RSS_FEED_SUMMARY_ONLY": True,
|
2024-04-19 13:54:27 -05:00
|
|
|
"FEED_APPEND_REF": False,
|
2023-10-29 22:18:29 +01:00
|
|
|
"SITEURL": "",
|
|
|
|
|
"SITENAME": "A Pelican Blog",
|
|
|
|
|
"DISPLAY_PAGES_ON_MENU": True,
|
|
|
|
|
"DISPLAY_CATEGORIES_ON_MENU": True,
|
|
|
|
|
"DOCUTILS_SETTINGS": {},
|
|
|
|
|
"OUTPUT_SOURCES": False,
|
|
|
|
|
"OUTPUT_SOURCES_EXTENSION": ".text",
|
|
|
|
|
"USE_FOLDER_AS_CATEGORY": True,
|
|
|
|
|
"DEFAULT_CATEGORY": "misc",
|
|
|
|
|
"WITH_FUTURE_DATES": True,
|
|
|
|
|
"CSS_FILE": "main.css",
|
|
|
|
|
"NEWEST_FIRST_ARCHIVES": True,
|
|
|
|
|
"REVERSE_CATEGORY_ORDER": False,
|
|
|
|
|
"DELETE_OUTPUT_DIRECTORY": False,
|
|
|
|
|
"OUTPUT_RETENTION": [],
|
|
|
|
|
"INDEX_SAVE_AS": "index.html",
|
|
|
|
|
"ARTICLE_URL": "{slug}.html",
|
|
|
|
|
"ARTICLE_SAVE_AS": "{slug}.html",
|
|
|
|
|
"ARTICLE_ORDER_BY": "reversed-date",
|
|
|
|
|
"ARTICLE_LANG_URL": "{slug}-{lang}.html",
|
|
|
|
|
"ARTICLE_LANG_SAVE_AS": "{slug}-{lang}.html",
|
|
|
|
|
"DRAFT_URL": "drafts/{slug}.html",
|
|
|
|
|
"DRAFT_SAVE_AS": "drafts/{slug}.html",
|
|
|
|
|
"DRAFT_LANG_URL": "drafts/{slug}-{lang}.html",
|
|
|
|
|
"DRAFT_LANG_SAVE_AS": "drafts/{slug}-{lang}.html",
|
|
|
|
|
"PAGE_URL": "pages/{slug}.html",
|
|
|
|
|
"PAGE_SAVE_AS": "pages/{slug}.html",
|
|
|
|
|
"PAGE_ORDER_BY": "basename",
|
|
|
|
|
"PAGE_LANG_URL": "pages/{slug}-{lang}.html",
|
|
|
|
|
"PAGE_LANG_SAVE_AS": "pages/{slug}-{lang}.html",
|
|
|
|
|
"DRAFT_PAGE_URL": "drafts/pages/{slug}.html",
|
|
|
|
|
"DRAFT_PAGE_SAVE_AS": "drafts/pages/{slug}.html",
|
|
|
|
|
"DRAFT_PAGE_LANG_URL": "drafts/pages/{slug}-{lang}.html",
|
|
|
|
|
"DRAFT_PAGE_LANG_SAVE_AS": "drafts/pages/{slug}-{lang}.html",
|
|
|
|
|
"STATIC_URL": "{path}",
|
|
|
|
|
"STATIC_SAVE_AS": "{path}",
|
|
|
|
|
"STATIC_CREATE_LINKS": False,
|
|
|
|
|
"STATIC_CHECK_IF_MODIFIED": False,
|
|
|
|
|
"CATEGORY_URL": "category/{slug}.html",
|
|
|
|
|
"CATEGORY_SAVE_AS": "category/{slug}.html",
|
|
|
|
|
"TAG_URL": "tag/{slug}.html",
|
|
|
|
|
"TAG_SAVE_AS": "tag/{slug}.html",
|
|
|
|
|
"AUTHOR_URL": "author/{slug}.html",
|
|
|
|
|
"AUTHOR_SAVE_AS": "author/{slug}.html",
|
|
|
|
|
"PAGINATION_PATTERNS": [
|
|
|
|
|
(1, "{name}{extension}", "{name}{extension}"),
|
|
|
|
|
(2, "{name}{number}{extension}", "{name}{number}{extension}"),
|
|
|
|
|
],
|
|
|
|
|
"YEAR_ARCHIVE_URL": "",
|
|
|
|
|
"YEAR_ARCHIVE_SAVE_AS": "",
|
|
|
|
|
"MONTH_ARCHIVE_URL": "",
|
|
|
|
|
"MONTH_ARCHIVE_SAVE_AS": "",
|
|
|
|
|
"DAY_ARCHIVE_URL": "",
|
|
|
|
|
"DAY_ARCHIVE_SAVE_AS": "",
|
|
|
|
|
"RELATIVE_URLS": False,
|
|
|
|
|
"DEFAULT_LANG": "en",
|
|
|
|
|
"ARTICLE_TRANSLATION_ID": "slug",
|
|
|
|
|
"PAGE_TRANSLATION_ID": "slug",
|
|
|
|
|
"DIRECT_TEMPLATES": ["index", "tags", "categories", "authors", "archives"],
|
|
|
|
|
"THEME_TEMPLATES_OVERRIDES": [],
|
|
|
|
|
"PAGINATED_TEMPLATES": {
|
|
|
|
|
"index": None,
|
|
|
|
|
"tag": None,
|
|
|
|
|
"category": None,
|
|
|
|
|
"author": None,
|
|
|
|
|
},
|
|
|
|
|
"PELICAN_CLASS": "pelican.Pelican",
|
|
|
|
|
"DEFAULT_DATE_FORMAT": "%a %d %B %Y",
|
|
|
|
|
"DATE_FORMATS": {},
|
|
|
|
|
"MARKDOWN": {
|
|
|
|
|
"extension_configs": {
|
|
|
|
|
"markdown.extensions.codehilite": {"css_class": "highlight"},
|
|
|
|
|
"markdown.extensions.extra": {},
|
|
|
|
|
"markdown.extensions.meta": {},
|
2016-03-14 20:37:27 +01:00
|
|
|
},
|
2023-10-29 22:18:29 +01:00
|
|
|
"output_format": "html5",
|
2015-11-08 23:08:03 +01:00
|
|
|
},
|
2023-10-29 22:18:29 +01:00
|
|
|
"JINJA_FILTERS": {},
|
|
|
|
|
"JINJA_GLOBALS": {},
|
|
|
|
|
"JINJA_TESTS": {},
|
|
|
|
|
"JINJA_ENVIRONMENT": {
|
|
|
|
|
"trim_blocks": True,
|
|
|
|
|
"lstrip_blocks": True,
|
|
|
|
|
"extensions": [],
|
2016-08-29 11:19:29 -07:00
|
|
|
},
|
2023-10-29 22:18:29 +01:00
|
|
|
"LOG_FILTER": [],
|
|
|
|
|
"LOCALE": [""], # defaults to user locale
|
|
|
|
|
"DEFAULT_PAGINATION": False,
|
|
|
|
|
"DEFAULT_ORPHANS": 0,
|
|
|
|
|
"DEFAULT_METADATA": {},
|
|
|
|
|
"FILENAME_METADATA": r"(?P<date>\d{4}-\d{2}-\d{2}).*",
|
|
|
|
|
"PATH_METADATA": "",
|
|
|
|
|
"EXTRA_PATH_METADATA": {},
|
|
|
|
|
"ARTICLE_PERMALINK_STRUCTURE": "",
|
|
|
|
|
"TYPOGRIFY": False,
|
|
|
|
|
"TYPOGRIFY_IGNORE_TAGS": [],
|
|
|
|
|
"TYPOGRIFY_DASHES": "default",
|
|
|
|
|
"SUMMARY_END_SUFFIX": "…",
|
|
|
|
|
"SUMMARY_MAX_LENGTH": 50,
|
|
|
|
|
"PLUGIN_PATHS": [],
|
|
|
|
|
"PLUGINS": None,
|
|
|
|
|
"PYGMENTS_RST_OPTIONS": {},
|
|
|
|
|
"TEMPLATE_PAGES": {},
|
|
|
|
|
"TEMPLATE_EXTENSIONS": [".html"],
|
|
|
|
|
"IGNORE_FILES": [".#*"],
|
|
|
|
|
"SLUG_REGEX_SUBSTITUTIONS": [
|
|
|
|
|
(r"[^\w\s-]", ""), # remove non-alphabetical/whitespace/'-' chars
|
|
|
|
|
(r"(?u)\A\s*", ""), # strip leading whitespace
|
|
|
|
|
(r"(?u)\s*\Z", ""), # strip trailing whitespace
|
|
|
|
|
(r"[-\s]+", "-"), # reduce multiple whitespace or '-' to single '-'
|
2018-08-07 17:35:16 +02:00
|
|
|
],
|
2023-10-29 22:18:29 +01:00
|
|
|
"INTRASITE_LINK_REGEX": "[{|](?P<what>.*?)[|}]",
|
|
|
|
|
"SLUGIFY_SOURCE": "title",
|
|
|
|
|
"SLUGIFY_USE_UNICODE": False,
|
|
|
|
|
"SLUGIFY_PRESERVE_CASE": False,
|
|
|
|
|
"CACHE_CONTENT": False,
|
|
|
|
|
"CONTENT_CACHING_LAYER": "reader",
|
|
|
|
|
"CACHE_PATH": "cache",
|
|
|
|
|
"GZIP_CACHE": True,
|
|
|
|
|
"CHECK_MODIFIED_METHOD": "mtime",
|
|
|
|
|
"LOAD_CONTENT_CACHE": False,
|
|
|
|
|
"FORMATTED_FIELDS": ["summary"],
|
|
|
|
|
"PORT": 8000,
|
|
|
|
|
"BIND": "127.0.0.1",
|
2015-06-16 09:25:09 +02:00
|
|
|
}
|
2012-03-09 16:21:38 +01:00
|
|
|
|
2013-09-15 22:43:24 -07:00
|
|
|
PYGMENTS_RST_OPTIONS = None
|
|
|
|
|
|
2013-08-04 17:02:58 +02:00
|
|
|
|
2023-12-17 13:56:33 +01:00
|
|
|
def read_settings(
|
|
|
|
|
path: Optional[str] = None, override: Optional[Settings] = None
|
|
|
|
|
) -> Settings:
|
2018-08-07 17:35:16 +02:00
|
|
|
settings = override or {}
|
|
|
|
|
|
|
|
|
|
if path:
|
|
|
|
|
settings = dict(get_settings_from_file(path), **settings)
|
|
|
|
|
|
|
|
|
|
if settings:
|
|
|
|
|
settings = handle_deprecated_settings(settings)
|
|
|
|
|
|
2013-01-04 10:50:09 -05:00
|
|
|
if path:
|
2018-08-07 17:35:16 +02:00
|
|
|
# Make relative paths absolute
|
|
|
|
|
def getabs(maybe_relative, base_path=path):
|
|
|
|
|
if isabs(maybe_relative):
|
|
|
|
|
return maybe_relative
|
2023-10-29 22:18:29 +01:00
|
|
|
return os.path.abspath(
|
|
|
|
|
os.path.normpath(
|
|
|
|
|
os.path.join(os.path.dirname(base_path), maybe_relative)
|
|
|
|
|
)
|
|
|
|
|
)
|
2018-08-07 17:35:16 +02:00
|
|
|
|
2023-10-29 22:18:29 +01:00
|
|
|
for p in ["PATH", "OUTPUT_PATH", "THEME", "CACHE_PATH"]:
|
2018-08-07 17:35:16 +02:00
|
|
|
if settings.get(p) is not None:
|
|
|
|
|
absp = getabs(settings[p])
|
|
|
|
|
# THEME may be a name rather than a path
|
2023-10-29 22:18:29 +01:00
|
|
|
if p != "THEME" or os.path.exists(absp):
|
2018-08-07 17:35:16 +02:00
|
|
|
settings[p] = absp
|
2012-10-16 01:35:35 +02:00
|
|
|
|
2023-10-29 22:18:29 +01:00
|
|
|
if settings.get("PLUGIN_PATHS") is not None:
|
|
|
|
|
settings["PLUGIN_PATHS"] = [
|
|
|
|
|
getabs(pluginpath) for pluginpath in settings["PLUGIN_PATHS"]
|
|
|
|
|
]
|
2018-08-07 17:35:16 +02:00
|
|
|
|
|
|
|
|
settings = dict(copy.deepcopy(DEFAULT_CONFIG), **settings)
|
|
|
|
|
settings = configure_settings(settings)
|
2012-10-16 01:35:35 +02:00
|
|
|
|
2013-09-15 22:43:24 -07:00
|
|
|
# This is because there doesn't seem to be a way to pass extra
|
|
|
|
|
# parameters to docutils directive handlers, so we have to have a
|
|
|
|
|
# variable here that we'll import from within Pygments.run (see
|
|
|
|
|
# rstdirectives.py) to see what the user defaults were.
|
2024-05-30 10:33:50 -05:00
|
|
|
global PYGMENTS_RST_OPTIONS # noqa: PLW0603
|
2023-10-29 22:18:29 +01:00
|
|
|
PYGMENTS_RST_OPTIONS = settings.get("PYGMENTS_RST_OPTIONS", None)
|
2018-08-07 17:35:16 +02:00
|
|
|
return settings
|
2012-03-22 07:58:04 -07:00
|
|
|
|
|
|
|
|
|
2023-12-17 13:56:33 +01:00
|
|
|
def get_settings_from_module(module: Optional[ModuleType] = None) -> Settings:
|
2013-03-10 20:11:36 -07:00
|
|
|
"""Loads settings from a module, returns a dictionary."""
|
2012-08-01 13:36:47 -04:00
|
|
|
|
2018-08-07 17:35:16 +02:00
|
|
|
context = {}
|
2012-08-01 13:36:47 -04:00
|
|
|
if module is not None:
|
2023-10-29 22:18:29 +01:00
|
|
|
context.update((k, v) for k, v in inspect.getmembers(module) if k.isupper())
|
2012-03-22 07:58:04 -07:00
|
|
|
return context
|
|
|
|
|
|
2011-02-01 21:44:50 +00:00
|
|
|
|
2023-12-17 13:56:33 +01:00
|
|
|
def get_settings_from_file(path: str) -> Settings:
|
2013-03-10 20:11:36 -07:00
|
|
|
"""Loads settings from a file path, returning a dict."""
|
2012-08-01 13:36:47 -04:00
|
|
|
|
2013-01-04 15:09:47 -05:00
|
|
|
name, ext = os.path.splitext(os.path.basename(path))
|
2013-04-13 16:36:05 -04:00
|
|
|
module = load_source(name, path)
|
2018-08-07 17:35:16 +02:00
|
|
|
return get_settings_from_module(module)
|
2012-08-01 13:36:47 -04:00
|
|
|
|
|
|
|
|
|
2023-12-17 13:56:33 +01:00
|
|
|
def get_jinja_environment(settings: Settings) -> Settings:
|
2016-08-29 11:19:29 -07:00
|
|
|
"""Sets the environment for Jinja"""
|
|
|
|
|
|
2023-10-29 22:18:29 +01:00
|
|
|
jinja_env = settings.setdefault(
|
|
|
|
|
"JINJA_ENVIRONMENT", DEFAULT_CONFIG["JINJA_ENVIRONMENT"]
|
|
|
|
|
)
|
2016-08-29 11:19:29 -07:00
|
|
|
|
|
|
|
|
# Make sure we include the defaults if the user has set env variables
|
2023-10-29 22:18:29 +01:00
|
|
|
for key, value in DEFAULT_CONFIG["JINJA_ENVIRONMENT"].items():
|
2016-08-29 11:19:29 -07:00
|
|
|
if key not in jinja_env:
|
|
|
|
|
jinja_env[key] = value
|
|
|
|
|
|
|
|
|
|
return settings
|
|
|
|
|
|
|
|
|
|
|
2023-12-17 13:56:33 +01:00
|
|
|
def _printf_s_to_format_field(printf_string: str, format_field: str) -> str:
|
2018-11-09 10:33:36 -08:00
|
|
|
"""Tries to replace %s with {format_field} in the provided printf_string.
|
|
|
|
|
Raises ValueError in case of failure.
|
|
|
|
|
"""
|
2023-10-29 22:18:29 +01:00
|
|
|
TEST_STRING = "PELICAN_PRINTF_S_DEPRECATION"
|
2018-11-09 10:33:36 -08:00
|
|
|
expected = printf_string % TEST_STRING
|
|
|
|
|
|
2024-05-30 09:05:36 -05:00
|
|
|
result = printf_string.replace("{", "{{").replace("}", "}}") % f"{{{format_field}}}"
|
2018-11-09 10:33:36 -08:00
|
|
|
if result.format(**{format_field: TEST_STRING}) != expected:
|
2023-11-12 13:53:02 +01:00
|
|
|
raise ValueError(f"Failed to safely replace %s with {{{format_field}}}")
|
2018-11-09 10:33:36 -08:00
|
|
|
|
|
|
|
|
return result
|
|
|
|
|
|
|
|
|
|
|
2023-12-17 13:56:33 +01:00
|
|
|
def handle_deprecated_settings(settings: Settings) -> Settings:
|
2018-08-07 17:35:16 +02:00
|
|
|
"""Converts deprecated settings and issues warnings. Issues an exception
|
|
|
|
|
if both old and new setting is specified.
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
# PLUGIN_PATH -> PLUGIN_PATHS
|
2023-10-29 22:18:29 +01:00
|
|
|
if "PLUGIN_PATH" in settings:
|
|
|
|
|
logger.warning(
|
|
|
|
|
"PLUGIN_PATH setting has been replaced by "
|
|
|
|
|
"PLUGIN_PATHS, moving it to the new setting name."
|
|
|
|
|
)
|
|
|
|
|
settings["PLUGIN_PATHS"] = settings["PLUGIN_PATH"]
|
|
|
|
|
del settings["PLUGIN_PATH"]
|
2018-08-07 17:35:16 +02:00
|
|
|
|
|
|
|
|
# PLUGIN_PATHS: str -> [str]
|
2023-10-29 22:18:29 +01:00
|
|
|
if isinstance(settings.get("PLUGIN_PATHS"), str):
|
|
|
|
|
logger.warning(
|
|
|
|
|
"Defining PLUGIN_PATHS setting as string "
|
|
|
|
|
"has been deprecated (should be a list)"
|
|
|
|
|
)
|
|
|
|
|
settings["PLUGIN_PATHS"] = [settings["PLUGIN_PATHS"]]
|
2018-08-07 17:35:16 +02:00
|
|
|
|
|
|
|
|
# JINJA_EXTENSIONS -> JINJA_ENVIRONMENT > extensions
|
2023-10-29 22:18:29 +01:00
|
|
|
if "JINJA_EXTENSIONS" in settings:
|
|
|
|
|
logger.warning(
|
|
|
|
|
"JINJA_EXTENSIONS setting has been deprecated, "
|
|
|
|
|
"moving it to JINJA_ENVIRONMENT setting."
|
|
|
|
|
)
|
|
|
|
|
settings["JINJA_ENVIRONMENT"]["extensions"] = settings["JINJA_EXTENSIONS"]
|
|
|
|
|
del settings["JINJA_EXTENSIONS"]
|
2018-08-07 17:35:16 +02:00
|
|
|
|
|
|
|
|
# {ARTICLE,PAGE}_DIR -> {ARTICLE,PAGE}_PATHS
|
2023-10-29 22:18:29 +01:00
|
|
|
for key in ["ARTICLE", "PAGE"]:
|
|
|
|
|
old_key = key + "_DIR"
|
|
|
|
|
new_key = key + "_PATHS"
|
2018-08-07 17:35:16 +02:00
|
|
|
if old_key in settings:
|
|
|
|
|
logger.warning(
|
2023-10-29 22:18:29 +01:00
|
|
|
"Deprecated setting %s, moving it to %s list", old_key, new_key
|
|
|
|
|
)
|
|
|
|
|
settings[new_key] = [settings[old_key]] # also make a list
|
2018-08-07 17:35:16 +02:00
|
|
|
del settings[old_key]
|
|
|
|
|
|
|
|
|
|
# EXTRA_TEMPLATES_PATHS -> THEME_TEMPLATES_OVERRIDES
|
2023-10-29 22:18:29 +01:00
|
|
|
if "EXTRA_TEMPLATES_PATHS" in settings:
|
|
|
|
|
logger.warning(
|
|
|
|
|
"EXTRA_TEMPLATES_PATHS is deprecated use "
|
|
|
|
|
"THEME_TEMPLATES_OVERRIDES instead."
|
|
|
|
|
)
|
2024-05-30 10:53:38 -05:00
|
|
|
if settings.get("THEME_TEMPLATES_OVERRIDES"):
|
2018-08-07 17:35:16 +02:00
|
|
|
raise Exception(
|
2023-10-29 22:18:29 +01:00
|
|
|
"Setting both EXTRA_TEMPLATES_PATHS and "
|
|
|
|
|
"THEME_TEMPLATES_OVERRIDES is not permitted. Please move to "
|
|
|
|
|
"only setting THEME_TEMPLATES_OVERRIDES."
|
|
|
|
|
)
|
|
|
|
|
settings["THEME_TEMPLATES_OVERRIDES"] = settings["EXTRA_TEMPLATES_PATHS"]
|
|
|
|
|
del settings["EXTRA_TEMPLATES_PATHS"]
|
2018-08-07 17:35:16 +02:00
|
|
|
|
|
|
|
|
# MD_EXTENSIONS -> MARKDOWN
|
2023-10-29 22:18:29 +01:00
|
|
|
if "MD_EXTENSIONS" in settings:
|
|
|
|
|
logger.warning(
|
|
|
|
|
"MD_EXTENSIONS is deprecated use MARKDOWN "
|
|
|
|
|
"instead. Falling back to the default."
|
|
|
|
|
)
|
|
|
|
|
settings["MARKDOWN"] = DEFAULT_CONFIG["MARKDOWN"]
|
2018-08-07 17:35:16 +02:00
|
|
|
|
|
|
|
|
# LESS_GENERATOR -> Webassets plugin
|
|
|
|
|
# FILES_TO_COPY -> STATIC_PATHS, EXTRA_PATH_METADATA
|
|
|
|
|
for old, new, doc in [
|
2023-10-29 22:18:29 +01:00
|
|
|
("LESS_GENERATOR", "the Webassets plugin", None),
|
|
|
|
|
(
|
|
|
|
|
"FILES_TO_COPY",
|
|
|
|
|
"STATIC_PATHS and EXTRA_PATH_METADATA",
|
|
|
|
|
"https://github.com/getpelican/pelican/"
|
2024-06-25 11:33:28 +02:00
|
|
|
"blob/main/docs/settings.rst#path-metadata",
|
2023-10-29 22:18:29 +01:00
|
|
|
),
|
2018-08-07 17:35:16 +02:00
|
|
|
]:
|
|
|
|
|
if old in settings:
|
2023-11-12 13:53:02 +01:00
|
|
|
message = f"The {old} setting has been removed in favor of {new}"
|
2018-08-07 17:35:16 +02:00
|
|
|
if doc:
|
2023-11-12 13:53:02 +01:00
|
|
|
message += f", see {doc} for details"
|
2018-08-07 17:35:16 +02:00
|
|
|
logger.warning(message)
|
|
|
|
|
|
|
|
|
|
# PAGINATED_DIRECT_TEMPLATES -> PAGINATED_TEMPLATES
|
2023-10-29 22:18:29 +01:00
|
|
|
if "PAGINATED_DIRECT_TEMPLATES" in settings:
|
|
|
|
|
message = "The {} setting has been removed in favor of {}".format(
|
|
|
|
|
"PAGINATED_DIRECT_TEMPLATES", "PAGINATED_TEMPLATES"
|
|
|
|
|
)
|
2018-08-07 17:35:16 +02:00
|
|
|
logger.warning(message)
|
|
|
|
|
|
2018-11-11 13:57:13 +01:00
|
|
|
# set PAGINATED_TEMPLATES
|
2023-10-29 22:18:29 +01:00
|
|
|
if "PAGINATED_TEMPLATES" not in settings:
|
|
|
|
|
settings["PAGINATED_TEMPLATES"] = {
|
|
|
|
|
"tag": None,
|
|
|
|
|
"category": None,
|
|
|
|
|
"author": None,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for t in settings["PAGINATED_DIRECT_TEMPLATES"]:
|
|
|
|
|
if t not in settings["PAGINATED_TEMPLATES"]:
|
|
|
|
|
settings["PAGINATED_TEMPLATES"][t] = None
|
|
|
|
|
del settings["PAGINATED_DIRECT_TEMPLATES"]
|
2018-08-07 17:35:16 +02:00
|
|
|
|
|
|
|
|
# {SLUG,CATEGORY,TAG,AUTHOR}_SUBSTITUTIONS ->
|
|
|
|
|
# {SLUG,CATEGORY,TAG,AUTHOR}_REGEX_SUBSTITUTIONS
|
2023-10-29 22:18:29 +01:00
|
|
|
url_settings_url = "http://docs.getpelican.com/en/latest/settings.html#url-settings"
|
|
|
|
|
flavours = {"SLUG", "CATEGORY", "TAG", "AUTHOR"}
|
|
|
|
|
old_values = {
|
|
|
|
|
f: settings[f + "_SUBSTITUTIONS"]
|
|
|
|
|
for f in flavours
|
|
|
|
|
if f + "_SUBSTITUTIONS" in settings
|
|
|
|
|
}
|
|
|
|
|
new_values = {
|
|
|
|
|
f: settings[f + "_REGEX_SUBSTITUTIONS"]
|
|
|
|
|
for f in flavours
|
|
|
|
|
if f + "_REGEX_SUBSTITUTIONS" in settings
|
|
|
|
|
}
|
2018-08-07 17:35:16 +02:00
|
|
|
if old_values and new_values:
|
|
|
|
|
raise Exception(
|
2023-10-29 22:18:29 +01:00
|
|
|
"Setting both {new_key} and {old_key} (or variants thereof) is "
|
|
|
|
|
"not permitted. Please move to only setting {new_key}.".format(
|
|
|
|
|
old_key="SLUG_SUBSTITUTIONS", new_key="SLUG_REGEX_SUBSTITUTIONS"
|
|
|
|
|
)
|
|
|
|
|
)
|
2018-08-07 17:35:16 +02:00
|
|
|
if old_values:
|
2023-10-29 22:18:29 +01:00
|
|
|
message = (
|
|
|
|
|
"{} and variants thereof are deprecated and will be "
|
|
|
|
|
"removed in the future. Please use {} and variants thereof "
|
|
|
|
|
"instead. Check {}.".format(
|
|
|
|
|
"SLUG_SUBSTITUTIONS", "SLUG_REGEX_SUBSTITUTIONS", url_settings_url
|
|
|
|
|
)
|
|
|
|
|
)
|
2018-08-07 17:35:16 +02:00
|
|
|
logger.warning(message)
|
2023-10-29 22:18:29 +01:00
|
|
|
if old_values.get("SLUG"):
|
2024-05-30 09:05:36 -05:00
|
|
|
for f in ("CATEGORY", "TAG"):
|
2018-08-07 17:35:16 +02:00
|
|
|
if old_values.get(f):
|
2023-10-29 22:18:29 +01:00
|
|
|
old_values[f] = old_values["SLUG"] + old_values[f]
|
|
|
|
|
old_values["AUTHOR"] = old_values.get("AUTHOR", [])
|
2018-08-07 17:35:16 +02:00
|
|
|
for f in flavours:
|
|
|
|
|
if old_values.get(f) is not None:
|
|
|
|
|
regex_subs = []
|
|
|
|
|
# by default will replace non-alphanum characters
|
|
|
|
|
replace = True
|
|
|
|
|
for tpl in old_values[f]:
|
|
|
|
|
try:
|
|
|
|
|
src, dst, skip = tpl
|
|
|
|
|
if skip:
|
|
|
|
|
replace = False
|
|
|
|
|
except ValueError:
|
|
|
|
|
src, dst = tpl
|
2023-10-29 22:18:29 +01:00
|
|
|
regex_subs.append((re.escape(src), dst.replace("\\", r"\\")))
|
2018-08-07 17:35:16 +02:00
|
|
|
|
|
|
|
|
if replace:
|
|
|
|
|
regex_subs += [
|
2023-10-29 22:18:29 +01:00
|
|
|
(r"[^\w\s-]", ""),
|
|
|
|
|
(r"(?u)\A\s*", ""),
|
|
|
|
|
(r"(?u)\s*\Z", ""),
|
|
|
|
|
(r"[-\s]+", "-"),
|
2018-08-07 17:35:16 +02:00
|
|
|
]
|
|
|
|
|
else:
|
|
|
|
|
regex_subs += [
|
2023-10-29 22:18:29 +01:00
|
|
|
(r"(?u)\A\s*", ""),
|
|
|
|
|
(r"(?u)\s*\Z", ""),
|
2018-08-07 17:35:16 +02:00
|
|
|
]
|
2023-10-29 22:18:29 +01:00
|
|
|
settings[f + "_REGEX_SUBSTITUTIONS"] = regex_subs
|
|
|
|
|
settings.pop(f + "_SUBSTITUTIONS", None)
|
2018-08-07 17:35:16 +02:00
|
|
|
|
2018-11-03 09:12:20 -06:00
|
|
|
# `%s` -> '{slug}` or `{lang}` in FEED settings
|
2023-10-29 22:18:29 +01:00
|
|
|
for key in ["TRANSLATION_FEED_ATOM", "TRANSLATION_FEED_RSS"]:
|
2020-05-21 21:43:06 -06:00
|
|
|
if (
|
2023-10-29 22:18:29 +01:00
|
|
|
settings.get(key)
|
|
|
|
|
and not isinstance(settings[key], Path)
|
|
|
|
|
and "%s" in settings[key]
|
2020-05-21 21:43:06 -06:00
|
|
|
):
|
2024-05-30 13:21:12 -05:00
|
|
|
logger.warning("%%s usage in %s is deprecated, use {lang} instead.", key)
|
2018-11-09 10:33:36 -08:00
|
|
|
try:
|
2023-10-29 22:18:29 +01:00
|
|
|
settings[key] = _printf_s_to_format_field(settings[key], "lang")
|
2018-11-09 10:33:36 -08:00
|
|
|
except ValueError:
|
2023-10-29 22:18:29 +01:00
|
|
|
logger.warning(
|
|
|
|
|
"Failed to convert %%s to {lang} for %s. "
|
|
|
|
|
"Falling back to default.",
|
|
|
|
|
key,
|
|
|
|
|
)
|
2018-11-09 10:33:36 -08:00
|
|
|
settings[key] = DEFAULT_CONFIG[key]
|
2023-10-29 22:18:29 +01:00
|
|
|
for key in [
|
|
|
|
|
"AUTHOR_FEED_ATOM",
|
|
|
|
|
"AUTHOR_FEED_RSS",
|
|
|
|
|
"CATEGORY_FEED_ATOM",
|
|
|
|
|
"CATEGORY_FEED_RSS",
|
|
|
|
|
"TAG_FEED_ATOM",
|
|
|
|
|
"TAG_FEED_RSS",
|
|
|
|
|
]:
|
2020-05-21 21:43:06 -06:00
|
|
|
if (
|
2023-10-29 22:18:29 +01:00
|
|
|
settings.get(key)
|
|
|
|
|
and not isinstance(settings[key], Path)
|
|
|
|
|
and "%s" in settings[key]
|
2020-05-21 21:43:06 -06:00
|
|
|
):
|
2024-05-30 13:21:12 -05:00
|
|
|
logger.warning("%%s usage in %s is deprecated, use {slug} instead.", key)
|
2018-11-09 10:33:36 -08:00
|
|
|
try:
|
2023-10-29 22:18:29 +01:00
|
|
|
settings[key] = _printf_s_to_format_field(settings[key], "slug")
|
2018-11-09 10:33:36 -08:00
|
|
|
except ValueError:
|
2023-10-29 22:18:29 +01:00
|
|
|
logger.warning(
|
|
|
|
|
"Failed to convert %%s to {slug} for %s. "
|
|
|
|
|
"Falling back to default.",
|
|
|
|
|
key,
|
|
|
|
|
)
|
2018-11-09 10:33:36 -08:00
|
|
|
settings[key] = DEFAULT_CONFIG[key]
|
2018-11-03 09:12:20 -06:00
|
|
|
|
2019-10-04 22:28:24 +02:00
|
|
|
# CLEAN_URLS
|
2023-10-29 22:18:29 +01:00
|
|
|
if settings.get("CLEAN_URLS", False):
|
|
|
|
|
logger.warning(
|
|
|
|
|
"Found deprecated `CLEAN_URLS` in settings."
|
|
|
|
|
" Modifying the following settings for the"
|
|
|
|
|
" same behaviour."
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
settings["ARTICLE_URL"] = "{slug}/"
|
|
|
|
|
settings["ARTICLE_LANG_URL"] = "{slug}-{lang}/"
|
|
|
|
|
settings["PAGE_URL"] = "pages/{slug}/"
|
|
|
|
|
settings["PAGE_LANG_URL"] = "pages/{slug}-{lang}/"
|
|
|
|
|
|
|
|
|
|
for setting in ("ARTICLE_URL", "ARTICLE_LANG_URL", "PAGE_URL", "PAGE_LANG_URL"):
|
2019-10-04 22:28:24 +02:00
|
|
|
logger.warning("%s = '%s'", setting, settings[setting])
|
|
|
|
|
|
|
|
|
|
# AUTORELOAD_IGNORE_CACHE -> --ignore-cache
|
2023-10-29 22:18:29 +01:00
|
|
|
if settings.get("AUTORELOAD_IGNORE_CACHE"):
|
|
|
|
|
logger.warning(
|
|
|
|
|
"Found deprecated `AUTORELOAD_IGNORE_CACHE` in "
|
|
|
|
|
"settings. Use --ignore-cache instead."
|
|
|
|
|
)
|
|
|
|
|
settings.pop("AUTORELOAD_IGNORE_CACHE")
|
2019-10-04 22:28:24 +02:00
|
|
|
|
|
|
|
|
# ARTICLE_PERMALINK_STRUCTURE
|
2023-10-29 22:18:29 +01:00
|
|
|
if settings.get("ARTICLE_PERMALINK_STRUCTURE", False):
|
|
|
|
|
logger.warning(
|
|
|
|
|
"Found deprecated `ARTICLE_PERMALINK_STRUCTURE` in"
|
|
|
|
|
" settings. Modifying the following settings for"
|
|
|
|
|
" the same behaviour."
|
|
|
|
|
)
|
2019-10-04 22:28:24 +02:00
|
|
|
|
2023-10-29 22:18:29 +01:00
|
|
|
structure = settings["ARTICLE_PERMALINK_STRUCTURE"]
|
2019-10-04 22:28:24 +02:00
|
|
|
|
|
|
|
|
# Convert %(variable) into {variable}.
|
2023-10-29 22:18:29 +01:00
|
|
|
structure = re.sub(r"%\((\w+)\)s", r"{\g<1>}", structure)
|
2019-10-04 22:28:24 +02:00
|
|
|
|
|
|
|
|
# Convert %x into {date:%x} for strftime
|
2023-10-29 22:18:29 +01:00
|
|
|
structure = re.sub(r"(%[A-z])", r"{date:\g<1>}", structure)
|
2019-10-04 22:28:24 +02:00
|
|
|
|
|
|
|
|
# Strip a / prefix
|
2023-10-29 22:18:29 +01:00
|
|
|
structure = re.sub("^/", "", structure)
|
|
|
|
|
|
|
|
|
|
for setting in (
|
|
|
|
|
"ARTICLE_URL",
|
|
|
|
|
"ARTICLE_LANG_URL",
|
|
|
|
|
"PAGE_URL",
|
|
|
|
|
"PAGE_LANG_URL",
|
|
|
|
|
"DRAFT_URL",
|
|
|
|
|
"DRAFT_LANG_URL",
|
|
|
|
|
"ARTICLE_SAVE_AS",
|
|
|
|
|
"ARTICLE_LANG_SAVE_AS",
|
|
|
|
|
"DRAFT_SAVE_AS",
|
|
|
|
|
"DRAFT_LANG_SAVE_AS",
|
|
|
|
|
"PAGE_SAVE_AS",
|
|
|
|
|
"PAGE_LANG_SAVE_AS",
|
|
|
|
|
):
|
|
|
|
|
settings[setting] = os.path.join(structure, settings[setting])
|
2019-10-04 22:28:24 +02:00
|
|
|
logger.warning("%s = '%s'", setting, settings[setting])
|
|
|
|
|
|
|
|
|
|
# {,TAG,CATEGORY,TRANSLATION}_FEED -> {,TAG,CATEGORY,TRANSLATION}_FEED_ATOM
|
2023-10-29 22:18:29 +01:00
|
|
|
for new, old in [
|
|
|
|
|
("FEED", "FEED_ATOM"),
|
|
|
|
|
("TAG_FEED", "TAG_FEED_ATOM"),
|
|
|
|
|
("CATEGORY_FEED", "CATEGORY_FEED_ATOM"),
|
|
|
|
|
("TRANSLATION_FEED", "TRANSLATION_FEED_ATOM"),
|
|
|
|
|
]:
|
2019-10-04 22:28:24 +02:00
|
|
|
if settings.get(new, False):
|
|
|
|
|
logger.warning(
|
2023-10-29 22:18:29 +01:00
|
|
|
"Found deprecated `%(new)s` in settings. Modify %(new)s "
|
|
|
|
|
"to %(old)s in your settings and theme for the same "
|
|
|
|
|
"behavior. Temporarily setting %(old)s for backwards "
|
|
|
|
|
"compatibility.",
|
|
|
|
|
{"new": new, "old": old},
|
2019-10-04 22:28:24 +02:00
|
|
|
)
|
|
|
|
|
settings[old] = settings[new]
|
|
|
|
|
|
2023-11-12 19:43:26 +03:00
|
|
|
# Warn if removed WRITE_SELECTED is present
|
|
|
|
|
if "WRITE_SELECTED" in settings:
|
|
|
|
|
logger.warning(
|
|
|
|
|
"WRITE_SELECTED is present in settings but this functionality was removed. "
|
|
|
|
|
"It will have no effect."
|
|
|
|
|
)
|
|
|
|
|
|
2018-08-07 17:35:16 +02:00
|
|
|
return settings
|
|
|
|
|
|
|
|
|
|
|
2023-12-17 13:56:33 +01:00
|
|
|
def configure_settings(settings: Settings) -> Settings:
|
2014-04-14 16:18:07 -04:00
|
|
|
"""Provide optimizations, error checking, and warnings for the given
|
2013-03-10 20:11:36 -07:00
|
|
|
settings.
|
2014-04-14 16:18:07 -04:00
|
|
|
Also, specify the log messages to be ignored.
|
2012-10-16 01:35:35 +02:00
|
|
|
"""
|
2023-10-29 22:18:29 +01:00
|
|
|
if "PATH" not in settings or not os.path.isdir(settings["PATH"]):
|
|
|
|
|
raise Exception(
|
|
|
|
|
"You need to specify a path containing the content"
|
|
|
|
|
" (see pelican --help for more information)"
|
|
|
|
|
)
|
2012-10-16 01:35:35 +02:00
|
|
|
|
2014-04-14 16:18:07 -04:00
|
|
|
# specify the log messages to be ignored
|
2023-10-29 22:18:29 +01:00
|
|
|
log_filter = settings.get("LOG_FILTER", DEFAULT_CONFIG["LOG_FILTER"])
|
2015-06-16 09:25:09 +02:00
|
|
|
LimitFilter._ignore.update(set(log_filter))
|
2014-04-01 20:44:09 +02:00
|
|
|
|
2013-03-10 20:11:36 -07:00
|
|
|
# lookup the theme in "pelican/themes" if the given one doesn't exist
|
2023-10-29 22:18:29 +01:00
|
|
|
if not os.path.isdir(settings["THEME"]):
|
2013-01-04 14:46:17 -05:00
|
|
|
theme_path = os.path.join(
|
2023-10-29 22:18:29 +01:00
|
|
|
os.path.dirname(os.path.abspath(__file__)), "themes", settings["THEME"]
|
|
|
|
|
)
|
2012-10-16 01:35:35 +02:00
|
|
|
if os.path.exists(theme_path):
|
2023-10-29 22:18:29 +01:00
|
|
|
settings["THEME"] = theme_path
|
2012-10-16 01:35:35 +02:00
|
|
|
else:
|
2024-06-01 16:00:17 -05:00
|
|
|
raise Exception("Could not find the theme {}".format(settings["THEME"]))
|
2011-07-02 15:15:21 -05:00
|
|
|
|
2013-03-24 14:01:54 -04:00
|
|
|
# standardize strings to lowercase strings
|
2023-10-29 22:18:29 +01:00
|
|
|
for key in ["DEFAULT_LANG"]:
|
2013-03-24 14:01:54 -04:00
|
|
|
if key in settings:
|
|
|
|
|
settings[key] = settings[key].lower()
|
|
|
|
|
|
2016-08-29 11:19:29 -07:00
|
|
|
# set defaults for Jinja environment
|
|
|
|
|
settings = get_jinja_environment(settings)
|
|
|
|
|
|
2013-03-24 14:01:54 -04:00
|
|
|
# standardize strings to lists
|
2023-10-29 22:18:29 +01:00
|
|
|
for key in ["LOCALE"]:
|
2019-11-05 23:17:19 -08:00
|
|
|
if key in settings and isinstance(settings[key], str):
|
2013-03-24 14:01:54 -04:00
|
|
|
settings[key] = [settings[key]]
|
|
|
|
|
|
|
|
|
|
# check settings that must be a particular type
|
|
|
|
|
for key, types in [
|
2023-10-29 22:18:29 +01:00
|
|
|
("OUTPUT_SOURCES_EXTENSION", str),
|
|
|
|
|
("FILENAME_METADATA", str),
|
2015-06-16 09:25:09 +02:00
|
|
|
]:
|
2013-03-24 14:01:54 -04:00
|
|
|
if key in settings and not isinstance(settings[key], types):
|
|
|
|
|
value = settings.pop(key)
|
2015-06-16 09:25:09 +02:00
|
|
|
logger.warn(
|
2024-05-30 13:21:12 -05:00
|
|
|
"Detected misconfigured %s (%s), falling back to the default (%s)",
|
2023-10-29 22:18:29 +01:00
|
|
|
key,
|
|
|
|
|
value,
|
|
|
|
|
DEFAULT_CONFIG[key],
|
|
|
|
|
)
|
2011-05-19 17:28:45 +01:00
|
|
|
|
|
|
|
|
# try to set the different locales, fallback on the default.
|
2023-10-29 22:18:29 +01:00
|
|
|
locales = settings.get("LOCALE", DEFAULT_CONFIG["LOCALE"])
|
2011-05-31 12:44:40 +02:00
|
|
|
|
2011-05-19 18:10:21 +01:00
|
|
|
for locale_ in locales:
|
2011-05-19 17:28:45 +01:00
|
|
|
try:
|
2013-01-11 02:57:43 +01:00
|
|
|
locale.setlocale(locale.LC_ALL, str(locale_))
|
2012-08-29 12:17:59 -07:00
|
|
|
break # break if it is successful
|
2011-05-19 17:28:45 +01:00
|
|
|
except locale.Error:
|
|
|
|
|
pass
|
2011-05-19 18:10:21 +01:00
|
|
|
else:
|
2016-10-22 15:35:01 -06:00
|
|
|
logger.warning(
|
|
|
|
|
"Locale could not be set. Check the LOCALE setting, ensuring it "
|
2023-10-29 22:18:29 +01:00
|
|
|
"is valid and available on your system."
|
|
|
|
|
)
|
2011-05-19 17:28:45 +01:00
|
|
|
|
2023-10-29 22:18:29 +01:00
|
|
|
if "SITEURL" in settings:
|
2012-03-23 07:16:23 -07:00
|
|
|
# If SITEURL has a trailing slash, remove it and provide a warning
|
2023-10-29 22:18:29 +01:00
|
|
|
siteurl = settings["SITEURL"]
|
|
|
|
|
if siteurl.endswith("/"):
|
|
|
|
|
settings["SITEURL"] = siteurl[:-1]
|
2013-04-13 16:36:05 -04:00
|
|
|
logger.warning("Removed extraneous trailing slash from SITEURL.")
|
2013-03-03 20:12:31 -08:00
|
|
|
# If SITEURL is defined but FEED_DOMAIN isn't,
|
|
|
|
|
# set FEED_DOMAIN to SITEURL
|
2023-10-29 22:18:29 +01:00
|
|
|
if "FEED_DOMAIN" not in settings:
|
|
|
|
|
settings["FEED_DOMAIN"] = settings["SITEURL"]
|
2012-03-22 07:58:04 -07:00
|
|
|
|
2014-04-20 14:34:52 +02:00
|
|
|
# check content caching layer and warn of incompatibilities
|
2023-10-29 22:18:29 +01:00
|
|
|
if (
|
|
|
|
|
settings.get("CACHE_CONTENT", False)
|
|
|
|
|
and settings.get("CONTENT_CACHING_LAYER", "") == "generator"
|
|
|
|
|
and not settings.get("WITH_FUTURE_DATES", True)
|
|
|
|
|
):
|
2019-02-06 10:22:57 -04:00
|
|
|
logger.warning(
|
|
|
|
|
"WITH_FUTURE_DATES conflicts with CONTENT_CACHING_LAYER "
|
2023-10-29 22:18:29 +01:00
|
|
|
"set to 'generator', use 'reader' layer instead"
|
|
|
|
|
)
|
2014-04-20 14:34:52 +02:00
|
|
|
|
2012-03-22 07:58:04 -07:00
|
|
|
# Warn if feeds are generated with both SITEURL & FEED_DOMAIN undefined
|
2013-08-04 17:02:58 +02:00
|
|
|
feed_keys = [
|
2023-10-29 22:18:29 +01:00
|
|
|
"FEED_ATOM",
|
|
|
|
|
"FEED_RSS",
|
|
|
|
|
"FEED_ALL_ATOM",
|
|
|
|
|
"FEED_ALL_RSS",
|
|
|
|
|
"CATEGORY_FEED_ATOM",
|
|
|
|
|
"CATEGORY_FEED_RSS",
|
|
|
|
|
"AUTHOR_FEED_ATOM",
|
|
|
|
|
"AUTHOR_FEED_RSS",
|
|
|
|
|
"TAG_FEED_ATOM",
|
|
|
|
|
"TAG_FEED_RSS",
|
|
|
|
|
"TRANSLATION_FEED_ATOM",
|
|
|
|
|
"TRANSLATION_FEED_RSS",
|
2013-08-04 17:02:58 +02:00
|
|
|
]
|
2012-10-25 16:50:27 +02:00
|
|
|
|
2012-11-07 20:52:59 +01:00
|
|
|
if any(settings.get(k) for k in feed_keys):
|
2023-10-29 22:18:29 +01:00
|
|
|
if not settings.get("SITEURL"):
|
|
|
|
|
logger.warning(
|
2024-05-30 13:21:12 -05:00
|
|
|
"Feeds generated without SITEURL set properly may not be valid"
|
2023-10-29 22:18:29 +01:00
|
|
|
)
|
2012-03-22 07:58:04 -07:00
|
|
|
|
2023-10-29 22:18:29 +01:00
|
|
|
if "TIMEZONE" not in settings:
|
2013-04-13 16:36:05 -04:00
|
|
|
logger.warning(
|
2023-10-29 22:18:29 +01:00
|
|
|
"No timezone information specified in the settings. Assuming"
|
|
|
|
|
" your timezone is UTC for feed generation. Check "
|
|
|
|
|
"https://docs.getpelican.com/en/latest/settings.html#TIMEZONE "
|
|
|
|
|
"for more information"
|
|
|
|
|
)
|
2011-08-18 13:58:04 +02:00
|
|
|
|
2013-07-29 08:10:28 -04:00
|
|
|
# fix up pagination rules
|
|
|
|
|
from pelican.paginator import PaginationRule
|
2023-10-29 22:18:29 +01:00
|
|
|
|
2013-07-29 08:10:28 -04:00
|
|
|
pagination_rules = [
|
2023-10-29 22:18:29 +01:00
|
|
|
PaginationRule(*r)
|
|
|
|
|
for r in settings.get(
|
|
|
|
|
"PAGINATION_PATTERNS",
|
|
|
|
|
DEFAULT_CONFIG["PAGINATION_PATTERNS"],
|
2013-08-03 14:04:58 -07:00
|
|
|
)
|
2013-07-29 08:10:28 -04:00
|
|
|
]
|
2023-10-29 22:18:29 +01:00
|
|
|
settings["PAGINATION_PATTERNS"] = sorted(
|
2013-07-29 08:10:28 -04:00
|
|
|
pagination_rules,
|
|
|
|
|
key=lambda r: r[0],
|
|
|
|
|
)
|
|
|
|
|
|
2013-03-23 19:56:45 -07:00
|
|
|
# Save people from accidentally setting a string rather than a list
|
|
|
|
|
path_keys = (
|
2023-10-29 22:18:29 +01:00
|
|
|
"ARTICLE_EXCLUDES",
|
|
|
|
|
"DEFAULT_METADATA",
|
|
|
|
|
"DIRECT_TEMPLATES",
|
|
|
|
|
"THEME_TEMPLATES_OVERRIDES",
|
|
|
|
|
"FILES_TO_COPY",
|
|
|
|
|
"IGNORE_FILES",
|
|
|
|
|
"PAGINATED_DIRECT_TEMPLATES",
|
|
|
|
|
"PLUGINS",
|
|
|
|
|
"STATIC_EXCLUDES",
|
|
|
|
|
"STATIC_PATHS",
|
|
|
|
|
"THEME_STATIC_PATHS",
|
|
|
|
|
"ARTICLE_PATHS",
|
|
|
|
|
"PAGE_PATHS",
|
2013-08-04 17:02:58 +02:00
|
|
|
)
|
2013-01-12 19:08:24 +00:00
|
|
|
for PATH_KEY in filter(lambda k: k in settings, path_keys):
|
2019-11-05 23:17:19 -08:00
|
|
|
if isinstance(settings[PATH_KEY], str):
|
2023-10-29 22:18:29 +01:00
|
|
|
logger.warning(
|
|
|
|
|
"Detected misconfiguration with %s setting "
|
|
|
|
|
"(must be a list), falling back to the default",
|
|
|
|
|
PATH_KEY,
|
|
|
|
|
)
|
2014-04-21 11:36:17 +02:00
|
|
|
settings[PATH_KEY] = DEFAULT_CONFIG[PATH_KEY]
|
2013-01-12 19:08:24 +00:00
|
|
|
|
2014-05-14 14:30:21 +02:00
|
|
|
# Add {PAGE,ARTICLE}_PATHS to {ARTICLE,PAGE}_EXCLUDES
|
2023-10-29 22:18:29 +01:00
|
|
|
mutually_exclusive = ("ARTICLE", "PAGE")
|
2014-05-14 14:30:21 +02:00
|
|
|
for type_1, type_2 in [mutually_exclusive, mutually_exclusive[::-1]]:
|
|
|
|
|
try:
|
2023-10-29 22:18:29 +01:00
|
|
|
includes = settings[type_1 + "_PATHS"]
|
|
|
|
|
excludes = settings[type_2 + "_EXCLUDES"]
|
2014-05-14 14:30:21 +02:00
|
|
|
for path in includes:
|
|
|
|
|
if path not in excludes:
|
|
|
|
|
excludes.append(path)
|
|
|
|
|
except KeyError:
|
2023-10-29 22:18:29 +01:00
|
|
|
continue # setting not specified, nothing to do
|
2013-01-12 19:08:24 +00:00
|
|
|
|
2012-03-22 07:58:04 -07:00
|
|
|
return settings
|