summaryrefslogtreecommitdiff
path: root/src/pyssg/builder.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/pyssg/builder.py')
-rw-r--r--src/pyssg/builder.py134
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)