jimsite/main.py

79 lines
2.5 KiB
Python

import os
import subprocess
import markdown
import yaml
from datetime import datetime
def filepath_or_string(s: str) -> str:
'''Loads the contents of a string if it is a filepath, otherwise returns the string.'''
if os.path.isfile(s):
with open(s, 'r') as f:
return f.read()
else:
return s
def load_markdown(md: str) -> tuple[dict, str]:
'''Loads a Markdown file into a (metadata: dict, content: str) pair.'''
# Load the file contents if a filepath is specified, and strip document delimiters ('---').
md = filepath_or_string(md).strip().strip('---').strip()
# If there is no `---` delimiter, then the article has no metadata.
if '---' not in md.strip('---'):
return {}, md
# Split the metadata from the contents.
[raw_metadata, raw_article] = md.split('---')
# Use YAML to parse the metadata.
metadata = yaml.safe_load(raw_metadata)
# Convert the contents to a HTML string.
content = markdown.markdown(raw_article)
return metadata, content
def format_html_template(template: str, **kwargs) -> str:
'''Interpolates variables specified as keyword arguments
into the given HTML template.'''
# Load the template if a filepath is given.
template = filepath_or_string(template)
# Interpolate the kwargs into the HTML template.
html = template.format(**kwargs)
# Return the formatted HTML.
return html
REPOS = [
'ssh://gitea/jim/resume.git',
'ssh://gitea/jim/dogma-jimfinium.git'
]
run = lambda cmd: subprocess.run(cmd.split(' '), stdout = subprocess.PIPE, stderr = subprocess.PIPE)
def update_git_repos(repos: list) -> None:
'''Pulls updates to repos in the build directory, or clones them if they don't exist.'''
for repo in repos:
local_path = 'build/'+repo.split('/')[-1].strip('.git')
print(local_path)
if os.path.exists(f'{local_path}/.git'):
run(f'git -C {local_path} pull origin')
else:
run(f'git clone {repo} {local_path}')
def load_partials() -> dict:
"""Loads partial templates from the templates/partials directory."""
partials = {}
for filename in os.listdir('templates/partials'):
with open(f'templates/partials/{filename}') as partial_file:
partial_template = partial_file.read()
partials[f'partials__{os.path.splitext(filename)[0]}'] = format_html_template(
partial_template,
current_year = datetime.now().year
)
return partials