111 lines
3.5 KiB
Python
111 lines
3.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
|
|
|
|
|
|
def import_resume():
|
|
|
|
# Use a sentinel value for the loop.
|
|
max_date = '0000-00-00'
|
|
|
|
# Loop through the folders in the resume repo to find the most recent one.
|
|
for resume_folder in os.listdir('build/resume'):
|
|
|
|
# Skip folders that are not in YYYY-MM-DD format.
|
|
try:
|
|
datetime.strptime(resume_folder,'%Y-%m-%d')
|
|
except Exception:
|
|
continue
|
|
|
|
# Keep track of the most recent date.
|
|
if resume_folder > max_date:
|
|
max_date = resume_folder
|
|
|
|
# Copy the resume into the /dist directory.
|
|
run(f'cp build/resume/{max_date}/shepich_resume.pdf dist/shepich_resume.pdf')
|
|
|
|
|
|
def format_blog_tags(tags: list[str], template = 'templates/components/blog_tag.html') -> list[str]:
|
|
'''Generates HTML blog tag components from a list of tag names.'''
|
|
return [
|
|
format_html_template(template, tag_name = t) for t in tags
|
|
]
|
|
|
|
if __name__ == '__main__':
|
|
pass |