Source code for nefelibata.builders.index
import logging
from pathlib import Path
from typing import Optional
from jinja2 import Environment
from jinja2 import FileSystemLoader
from nefelibata import __version__
from nefelibata.builders import Builder
from nefelibata.builders import Scope
from nefelibata.builders.utils import hash_n
from nefelibata.builders.utils import random_color
from nefelibata.post import get_posts
_logger = logging.getLogger(__name__)
[docs]class IndexBuilder(Builder):
scopes = [Scope.SITE]
[docs] def process_site(self, force: bool = True) -> None:
"""Generate index and archives.
"""
_logger.info("Creating index")
env = Environment(
loader=FileSystemLoader(
str(self.root / "templates" / self.config["theme"]),
),
)
template = env.get_template("index.html")
posts = get_posts(self.root)
posts.sort(key=lambda x: x.date, reverse=True)
show = self.config.get("posts-to-show", 10)
# first page; these will be updated
page = 1
name: Optional[str] = "index.html"
previous: Optional[str] = None
while name:
page_posts, posts = posts[:show], posts[show:]
# link to next page
next = f"archive{page}.html" if posts else None
html = template.render(
__version__=__version__,
config=self.config,
language=self.config["language"],
posts=page_posts,
breadcrumbs=[("Recent Posts", None)],
previous=previous,
next=next,
hash_n=hash_n,
random_color=random_color,
)
file_path = self.root / "build" / name
with open(file_path, "w") as fp:
fp.write(html)
page += 1
previous, name = name, next