ciclostile/src/ciclostile/__init__.py

77 lines
2.1 KiB
Python

#!/usr/bin/env python3
import os
import markdown
import jinja2
def parse(mdtext, parser=None):
if parser is None:
parser = markdown.Markdown(extensions=['meta'], output_format='html5')
html = parser.convert(mdtext)
# get markdown metadata
data = {key: parser.Meta[key][0] for key in parser.Meta.keys()}
data.update({
'content': html,
})
return data
def parse_file(filepath, parser=None):
with open(filepath) as fh:
return parse(fh.read(), parser=parser)
def index(folder):
data = {'pages': []}
parser = markdown.Markdown(extensions=['meta'], output_format='html5')
for dirpath, _, files in os.walk(folder):
valid_files = (os.path.join(dirpath, f)
for f in files
if f.endswith('.md'))
for fpath in valid_files:
data['pages'].append(parse_file(fpath, parser=parser))
return data
def compile(template, data):
t = jinja2.Template(template)
return t.render(**data)
def compile_all(root_path):
print('Compiling', root_path)
md_path = os.path.join(root_path, 'markdown')
files = [f
for f in os.listdir(md_path)
if f.endswith('.md')]
data = {'pages': {}}
for fname in files:
full_path = os.path.join(md_path, fname)
name, _ = os.path.splitext(fname)
data['pages'][name] = parse_file(full_path)
template_path = os.path.join(root_path, 'templates')
templates = {}
for file_name in os.listdir(template_path):
name, ext = os.path.splitext(file_name)
if ext == '.html':
templates[name] = os.path.join(template_path, file_name)
target_path = os.path.join(root_path, 'target')
for page_name, page in data['pages'].items():
t_name = page.get('template', 'default')
with open(templates[t_name]) as tf:
t = jinja2.Template(tf.read())
out_path = os.path.join(target_path, page_name + '.html')
out = t.render(**data['pages'][page_name])
with open(out_path, 'w') as f:
f.write(out)