Set FEED_MAX_ITEMS = None to include all posts in the Atom feed. Before: blog.json had only 100 posts (Pelican default limit) After: blog.json has all 188 published posts This ensures blog.json contains the complete blog archive for AI agent consumption and the russell.on.unsandbox.com deployment.
132 lines
3.4 KiB
Python
132 lines
3.4 KiB
Python
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*- #
|
|
from __future__ import unicode_literals
|
|
|
|
from os import environ
|
|
|
|
DEFAULTS = {
|
|
"AUTHOR": "Russell Ballestrini",
|
|
"SITENAME": "Russell Ballestrini",
|
|
"SITEURL": "http://127.0.0.1:8000",
|
|
#'THEME' : 'pelican-themes/svbhack',
|
|
"THEME": "pelican-themes/pelican-svbhack",
|
|
"GOOGLE_ANALYTICS": "",
|
|
"PLAUSIBLE_ANALYTICS": "",
|
|
"REMARKBOX": None,
|
|
"LINKPEEK_APIKEY": None,
|
|
"LINKPEEK_SECRET": None,
|
|
}
|
|
|
|
|
|
def get_environ_or_default(key):
|
|
return environ.get(key, DEFAULTS[key])
|
|
|
|
|
|
AUTHOR = get_environ_or_default("AUTHOR")
|
|
SITENAME = get_environ_or_default("SITENAME")
|
|
SITEURL = get_environ_or_default("SITEURL")
|
|
|
|
THEME = get_environ_or_default("THEME")
|
|
|
|
GOOGLE_ANALYTICS = get_environ_or_default("GOOGLE_ANALYTICS")
|
|
PLAUSIBLE_ANALYTICS = get_environ_or_default("PLAUSIBLE_ANALYTICS")
|
|
|
|
REMARKBOX = get_environ_or_default("REMARKBOX")
|
|
|
|
LINKPEEK_APIKEY = get_environ_or_default("LINKPEEK_APIKEY")
|
|
LINKPEEK_SECRET = get_environ_or_default("LINKPEEK_SECRET")
|
|
|
|
# Theme specific
|
|
USER_LOGO_URL = (
|
|
"https://russell.ballestrini.net/uploads/sly-red-fox.jpg"
|
|
)
|
|
# USER_LOGO_URL = (
|
|
# "https://russell.ballestrini.net/uploads/profile/russell-ballestrini-2020.jpg"
|
|
# )
|
|
TAGLINE = '<a href="/about" class="tagline">Grows Products & Services</a>'
|
|
|
|
PATH = "content"
|
|
|
|
STATIC_PATHS = ["uploads"]
|
|
|
|
TIMEZONE = "America/New_York"
|
|
|
|
DEFAULT_LANG = "en"
|
|
|
|
# Atom all feed.
|
|
FEED_ALL_ATOM = "feeds/all.atom.xml"
|
|
# Include all posts in feed (no limit) for blog.json generation
|
|
FEED_MAX_ITEMS = None
|
|
|
|
# Feed generation is usually not desired when developing
|
|
CATEGORY_FEED_ATOM = None
|
|
TRANSLATION_FEED_ATOM = None
|
|
AUTHOR_FEED_ATOM = None
|
|
AUTHOR_FEED_RSS = None
|
|
|
|
# Blogroll
|
|
LINKS = (
|
|
# ('Remarkbox', 'http://remarkbox.com/'),
|
|
# ('LinkPeek', 'https://linkpeek.com/'),
|
|
)
|
|
|
|
# Social widget
|
|
SOCIAL = (
|
|
("@russellbal", "https://twitter.com/russellbal"),
|
|
("github", "https://github.com/russellballestrini"),
|
|
("bitbucket", "https://bitbucket.org/russellballestrini"),
|
|
)
|
|
|
|
DEFAULT_PAGINATION = False
|
|
|
|
# Uncomment following line if you want document-relative URLs when developing
|
|
# RELATIVE_URLS = True
|
|
|
|
DISPLAY_PAGES_ON_MENU = False
|
|
|
|
# teach pelican to use directory/index.html files
|
|
ARTICLE_URL = "{slug}/"
|
|
PAGE_URL = "{slug}/"
|
|
CATEGORY_URL = "category/{slug}/"
|
|
TAG_URL = "tags/{slug}/"
|
|
AUTHOR_URL = "author/{slug}/"
|
|
|
|
RANDOM = "random.html"
|
|
|
|
# Adjust save location.
|
|
ARTICLE_SAVE_AS = "{slug}/index.html"
|
|
PAGE_SAVE_AS = "{slug}/index.html"
|
|
CATEGORY_SAVE_AS = "category/{slug}/index.html"
|
|
TAG_SAVE_AS = "tags/{slug}/index.html"
|
|
AUTHOR_SAVE_AS = "author/{slug}/index.html"
|
|
|
|
# Enable raw source files in output directory alongside index.html
|
|
# This copies the raw .rst files to the output
|
|
OUTPUT_SOURCES = True
|
|
OUTPUT_SOURCES_EXTENSION = '.rst'
|
|
|
|
# Setup filters and plugins.
|
|
|
|
PLUGIN_PATHS = ["pelican-plugins", "lib"]
|
|
PLUGINS = ["random_article", "strip_toc_summary"]
|
|
|
|
# register filters.
|
|
import re
|
|
|
|
def extract_first_image(content):
|
|
"""Extract first image URL from HTML content."""
|
|
match = re.search(r'(?:src|href|data)=["\']([^"\']+\.(?:jpg|jpeg|png|gif|webp|svg))["\']', content, re.IGNORECASE)
|
|
return match.group(1) if match else None
|
|
|
|
JINJA_FILTERS = {'extract_first_image': extract_first_image}
|
|
|
|
# register linkpeek docutils directive.
|
|
import sys
|
|
|
|
sys.path.append("lib")
|
|
import rst_linkpeek
|
|
|
|
linkpeek = rst_linkpeek.LinkPeek
|
|
linkpeek.apikey = LINKPEEK_APIKEY
|
|
linkpeek.secret = LINKPEEK_SECRET
|
|
linkpeek.register()
|