-
Notifications
You must be signed in to change notification settings - Fork 4
/
base.py
71 lines (53 loc) · 1.96 KB
/
base.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import copy
import logging
import os
import re
import shutil
from os.path import exists
from jinja2 import FileSystemLoader, Environment
logger = logging.getLogger('base')
# filters
def dateformat(value, format='%b %d, %Y'):
return value.strftime(format)
def prependsiteroot(path, root):
if path.startswith('http://') or path.startswith('https://'):
return path
else:
return '{}/{}'.format(root, path)
class StaticSiteGenerator(object):
env = Environment(loader=FileSystemLoader('./templates/'))
output_dir = os.path.join(os.path.dirname(__file__), 'output')
site_root = '.'
def __init__(self, deploy=False):
self.def_cntx = dict(SITE_ROOT=self.site_root)
logger.info('deploy: %s', deploy)
if exists(StaticSiteGenerator.output_dir):
shutil.rmtree(StaticSiteGenerator.output_dir)
os.mkdir(StaticSiteGenerator.output_dir)
# register custom filters
self.env.filters['dateformat'] = dateformat
self.env.filters['prependsiteroot'] = lambda path: prependsiteroot(path, self.site_root)
def render(self, temp, cntx):
x = copy.copy(cntx)
x.update(self.def_cntx)
return temp.render(x)
def write(self, content, filename):
with open(filename, 'wb') as f:
f.write(content)
def write_utf8(self, content, filename):
try:
out = content.encode('utf-8')
except Exception as e:
logging.error(e)
raise
logging.debug("writing at {}: {}".format(filename, out))
self.write(out, filename)
def render_and_write(self, template, cntx, path):
self.write_utf8(self.render(template, cntx), path)
def default_context(self):
return copy.copy(self.def_cntx)
def calc_output_fullpath(self, fn):
return os.path.join(self.output_dir, fn)
def sanitize_filename(self, fn):
s = re.sub('\s', '-', fn)
return re.sub('[^0-9a-zA-Z-]', '', s)