Source code for nefelibata.cli.build

# -*- coding: utf-8 -*-
import logging
from pathlib import Path
from typing import Optional

from nefelibata.announcers import get_announcers
from nefelibata.assistants import get_assistants
from nefelibata.builders import get_builders
from nefelibata.builders import Scope
from nefelibata.post import get_posts
from nefelibata.post import Post
from nefelibata.utils import get_config

__author__ = "Beto Dealmeida"
__copyright__ = "Beto Dealmeida"
__license__ = "mit"

_logger = logging.getLogger(__name__)


[docs]def run( root: Path, post: Optional[Post] = None, force: bool = False, collect_replies: bool = True, ) -> None: """Build weblog from Markdown posts and social media interactions. """ _logger.info("Building weblog") config = get_config(root) _logger.debug(config) build = root / "build" if not build.exists(): _logger.info("Creating build/ directory") build.mkdir() _logger.info("Syncing resources") resources = ["css", "js", "img"] for resource in resources: resource_directory = root / "templates" / config["theme"] / resource target = build / resource if resource_directory.exists() and not target.exists(): target.symlink_to(resource_directory, target_is_directory=True) _logger.info("Processing posts") post_builders = get_builders(root, config, Scope.POST) post_assistants = get_assistants(root, config, Scope.POST) announcers = get_announcers(root, config) posts = [post] if post else get_posts(root) for post in posts: # freeze currently configured announcers, so that if a new announcer is # added in the future old posts are not announced if "announce-on" not in post.parsed and config["announce-on"]: post.parsed["announce-on"] = ", ".join(config["announce-on"]) post.save() # collect replies so we can use them when building the post if collect_replies: for announcer in announcers: if announcer.match(post): announcer.update_replies(post) for builder in post_builders: builder.process_post(post, force) for assistant in post_assistants: assistant.process_post(post, force) # symlink build -> posts post_directory = post.file_path.parent relative_directory = post_directory.relative_to(root / "posts") target = root / "build" / relative_directory if post_directory.exists() and not target.exists(): target.symlink_to(post_directory, target_is_directory=True) site_builders = get_builders(root, config, Scope.SITE) site_assistants = get_assistants(root, config, Scope.SITE) for builder in site_builders: builder.process_site(force) for assistant in site_assistants: assistant.process_site(force)