diff options
author | David Luevano Alvarado <david@luevano.xyz> | 2021-06-05 03:13:59 -0600 |
---|---|---|
committer | David Luevano Alvarado <david@luevano.xyz> | 2021-06-05 03:13:59 -0600 |
commit | 045eb5986ea11174b2ee39dc8476b365d734d37d (patch) | |
tree | 35b3d63df25bae33857fe3614501155940f24236 /src/pyssg/builder.py | |
parent | 81bf1f33c34bd37ebcef4dc8f76d881248a22832 (diff) |
refactor code and add image_url parsingv0.5.3
Diffstat (limited to 'src/pyssg/builder.py')
-rw-r--r-- | src/pyssg/builder.py | 134 |
1 files changed, 49 insertions, 85 deletions
diff --git a/src/pyssg/builder.py b/src/pyssg/builder.py index b6bd371..84494da 100644 --- a/src/pyssg/builder.py +++ b/src/pyssg/builder.py @@ -1,10 +1,9 @@ import os import shutil +from copy import deepcopy from operator import itemgetter from jinja2 import Environment, Template from markdown import Markdown -from importlib.metadata import version -from datetime import datetime, timezone from .configuration import Configuration from .database import Database @@ -13,24 +12,11 @@ from .page import Page from .discovery import get_file_list, get_dir_structure -VERSION = version('pyssg') -# specific format for rss -DFORMAT = '%a, %d %b %Y %H:%M:%S GMT' -RUN_DATE = datetime.now(tz=timezone.utc).strftime(DFORMAT) - - -class HTMLBuilder: +class Builder: def __init__(self, config: Configuration, env: Environment, db: Database, md: Markdown): - self.src: str = config.src - self.dst: str = config.dst - self.title: str = config.title - self.base_url: str = config.base_url - self.base_static_url: str = config.base_static_url - self.force: bool = config.force - self.config: Configuration = config self.env: Environment = env self.db: Database = db @@ -43,32 +29,39 @@ class HTMLBuilder: self.all_pages: list[Page] = None self.updated_pages: list[Page] = None self.all_tags: list[str] = None + self.common_vars: dict = None def build(self) -> None: - self.dirs = get_dir_structure(self.src, ['templates']) - self.md_files = get_file_list(self.src, ['.md'], ['templates']) - self.html_files = get_file_list(self.src, ['.html'], ['templates']) + self.dirs = get_dir_structure(self.config.src, ['templates']) + self.md_files = get_file_list(self.config.src, ['.md'], ['templates']) + self.html_files = get_file_list(self.config.src, ['.html'], ['templates']) self.__create_dir_structure() self.__copy_html_files() - parser: MDParser = MDParser(self.src, + parser: MDParser = MDParser(self.config.src, self.md_files, + self.config, self.db, self.md) - parser.parse(self.config) + parser.parse() - # just to be able to extract all pages out of this class + # just so i don't have to pass these vars to all the functions self.all_pages = parser.all_pages self.updated_pages = parser.updated_pages self.all_tags = parser.all_tags - # create the article index - self.__create_article_index() - # check if all pages should be created - self.__create_articles() - self.__create_tags() + # dict for the keyword args to pass to the template renderer + self.common_vars = dict(config=self.config, + all_pages=self.all_pages, + all_tags=self.all_tags) + + self.__render_articles() + self.__render_tags() + self.__render_template('index.html', 'index.html', **self.common_vars) + self.__render_template('rss.xml', 'rss.xml', **self.common_vars) + self.__render_template('sitemap.xml', 'sitemap.xml', **self.common_vars) def __create_dir_structure(self) -> None: @@ -76,7 +69,7 @@ class HTMLBuilder: # for the dir structure, # doesn't matter if the dir already exists try: - os.makedirs(os.path.join(self.dst, d)) + os.makedirs(os.path.join(self.config.dst, d)) except FileExistsError: pass @@ -86,59 +79,33 @@ class HTMLBuilder: dst_file: str = None for f in self.html_files: - src_file = os.path.join(self.src, f) - dst_file = os.path.join(self.dst, f) + src_file = os.path.join(self.config.src, f) + dst_file = os.path.join(self.config.dst, f) # only copy files if they have been modified (or are new) - if self.db.update(src_file, remove=f'{self.src}/'): + if self.db.update(src_file, remove=f'{self.config.src}/'): shutil.copy2(src_file, dst_file) - def __create_article_index(self) -> None: - template: Template = self.env.get_template("index.html") - content: str = template.render(site_title=self.title, - site_base_url=self.base_url, - site_base_static_url=self.base_static_url, - pyssg_version=VERSION, - run_date=RUN_DATE, - all_pages=self.all_pages, - all_tags=self.all_tags) - - with open(os.path.join(self.dst, 'index.html'), 'w') as f: - f.write(content) - - - def __create_articles(self) -> None: + def __render_articles(self) -> None: + article_vars: dict = deepcopy(self.common_vars) # check if only updated should be created - if self.force: + if self.config.force: for p in self.all_pages: - self.__create_article(p) + article_vars['page'] = p + self.__render_template("page.html", + p.name.replace('.md','.html'), + **article_vars) else: for p in self.updated_pages: - self.__create_article(p) + article_vars['page'] = p + self.__render_template("page.html", + p.name.replace('.md','.html'), + **article_vars) - def __create_article(self, page: Page) -> None: - # prepare html file name - f_name: str = page.name - f_name = f_name.replace('.md', '.html') - - template: Template = self.env.get_template("page.html") - content: str = template.render(site_title=self.title, - site_base_url=self.base_url, - site_base_static_url=self.base_static_url, - pyssg_version=VERSION, - run_date=RUN_DATE, - all_pages=self.all_pages, - all_tags=self.all_tags, - page=page) - - - with open(os.path.join(self.dst, f_name), 'w') as f: - f.write(content) - - - def __create_tags(self) -> None: + def __render_tags(self) -> None: + tag_vars: dict = deepcopy(self.common_vars) for t in self.all_tags: # get a list of all pages that have current tag tag_pages: list[Page] = [] @@ -147,26 +114,23 @@ class HTMLBuilder: p.tags)): tag_pages.append(p) + tag_vars['tag'] = t + tag_vars['tag_pages'] = tag_pages + # build tag page - self.__create_tag(t, tag_pages) + self.__render_template('tag.html', + f'tag/@{t[0]}.html', + **tag_vars) # clean list of pages with current tag tag_pages = [] - def __create_tag(self, tag: tuple[str], - pages: list[Page]) -> None: - - template: Template = self.env.get_template("tag.html") - content: str = template.render(site_title=self.title, - site_base_url=self.base_url, - site_base_static_url=self.base_static_url, - pyssg_version=VERSION, - run_date=RUN_DATE, - all_pages=self.all_pages, - all_tags=self.all_tags, - tag=tag, - tag_pages=pages) + def __render_template(self, template_name: str, + file_name: str, + **template_vars) -> None: + template: Template = self.env.get_template(template_name) + content: str = template.render(**template_vars) - with open(os.path.join(self.dst, f'tag/@{tag[0]}.html'), 'w') as f: + with open(os.path.join(self.config.dst, file_name), 'w') as f: f.write(content) |