summaryrefslogtreecommitdiff
path: root/builder
diff options
context:
space:
mode:
Diffstat (limited to 'builder')
-rw-r--r--builder/builder.py37
-rw-r--r--builder/parser.py46
-rw-r--r--builder/s3.py6
3 files changed, 76 insertions, 13 deletions
diff --git a/builder/builder.py b/builder/builder.py
index deb9eb68..0e404b88 100644
--- a/builder/builder.py
+++ b/builder/builder.py
@@ -29,21 +29,25 @@ def build_page(fn, research_posts):
output_path = public_path + metadata['url']
output_fn = os.path.join(output_path, "index.html")
+ is_research = False
+
if 'research/' in fn:
+ is_research = True
template = env.get_template("research.html")
else:
template = env.get_template("page.html")
- if 'datasets' in fn:
- s3_path = "{}/{}/{}{}".format(os.getenv('S3_ENDPOINT'), os.getenv('S3_BUCKET'), s3_datasets_path, metadata['path'])
- if 'index.md' in fn:
- s3.sync_directory(dirname, s3_datasets_path, metadata)
+ if 'datasets/' in fn:
+ s3_dir = s3_datasets_path
else:
- s3_path = "{}/{}/{}{}".format(os.getenv('S3_ENDPOINT'), os.getenv('S3_BUCKET'), s3_site_path, metadata['path'])
- if 'index.md' in fn and metadata['url'] != '/':
- s3.sync_directory(dirname, s3_site_path, metadata)
+ s3_dir = s3_site_path
+
+ s3_path = s3.make_s3_path(s3_dir, metadata['path'])
+
+ if 'index.md' in fn:
+ s3.sync_directory(dirname, s3_dir, metadata)
- content = parser.parse_markdown(sections, s3_path)
+ content = parser.parse_markdown(sections, s3_path, skip_h1=is_research)
html = template.render(
metadata=metadata,
@@ -58,10 +62,27 @@ def build_page(fn, research_posts):
print("______")
+def build_research_index(research_posts):
+ metadata, sections = parser.read_metadata('../site/content/research/index.md')
+ template = env.get_template("page.html")
+ s3_path = s3.make_s3_path(s3_site_path, metadata['path'])
+ content = parser.parse_markdown(sections, s3_path, skip_h1=False)
+ content += parser.parse_research_index(research_posts)
+ html = template.render(
+ metadata=metadata,
+ content=content,
+ research_posts=research_posts,
+ latest_research_post=research_posts[-1],
+ )
+ output_fn = public_path + '/research/index.html'
+ with open(output_fn, "w") as file:
+ file.write(html)
+
def build_site():
research_posts = parser.read_research_post_index()
for fn in glob.iglob(os.path.join(content_path, "**/*.md"), recursive=True):
build_page(fn, research_posts)
+ build_research_index(research_posts)
if __name__ == '__main__':
build_site()
diff --git a/builder/parser.py b/builder/parser.py
index 529d21fa..da3044a0 100644
--- a/builder/parser.py
+++ b/builder/parser.py
@@ -2,6 +2,8 @@ import os
import re
import glob
import mistune
+
+import s3
from paths import *
renderer = mistune.Renderer(escape=False)
@@ -12,7 +14,6 @@ def fix_images(lines, s3_path):
block = "\n\n".join(lines)
for line in block.split("\n"):
if "![" in line:
- print(line)
line = line.replace('![', '')
alt_text, tail = line.split('](', 1)
url, tail = tail.split(')', 1)
@@ -35,13 +36,26 @@ def format_section(lines, s3_path, type=''):
return "<section>" + markdown(lines) + "</section>"
return ""
-def parse_markdown(sections, s3_path):
+def format_metadata(section):
+ meta = []
+ for line in section.split('\n'):
+ key, value = line[2:].split(': ', 1)
+ meta.append("<div><div class='gray'>{}</div><div>{}</div></div>".format(key, value))
+ return "<section><div class='meta'>{}</div></section>".format(''.join(meta))
+
+def parse_markdown(sections, s3_path, skip_h1=False):
groups = []
current_group = []
+ seen_metadata = False
for section in sections:
- if section.startswith('# '):
+ if skip_h1 and section.startswith('# '):
continue
- if '![wide:' in section:
+ elif section.startswith('+ ') and not seen_metadata:
+ groups.append(format_section(current_group, s3_path))
+ groups.append(format_metadata(section))
+ current_group = []
+ seen_metadata = True
+ elif '![wide:' in section:
groups.append(format_section(current_group, s3_path))
groups.append(format_section([section], s3_path, type='wide'))
current_group = []
@@ -55,6 +69,23 @@ def parse_markdown(sections, s3_path):
content = "".join(groups)
return content
+def parse_research_index(research_posts):
+ content = "<div class='research_index'>"
+ for post in research_posts:
+ s3_path = s3.make_s3_path(s3_site_path, post['path'])
+ if 'image' in post:
+ post_image = s3_path + post['image']
+ else:
+ post_image = 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=='
+ row = "<a href='{}'><section class='wide'><img src='{}' alt='Research post' /><section><h1>{}</h1><h2>{}</h2></section></section></a>".format(
+ post['path'],
+ post_image,
+ post['title'],
+ post['tagline'])
+ content += row
+ content += '</div>'
+ return content
+
def read_metadata(fn):
with open(fn, "r") as file:
data = file.read()
@@ -74,6 +105,8 @@ default_metadata = {
'published': '2018-12-31',
'updated': '2018-12-31',
'authors': 'Adam Harvey',
+ 'sync': 'true',
+ 'tagline': '',
}
def parse_metadata_section(metadata, section):
@@ -117,12 +150,15 @@ def parse_metadata(fn, sections):
if metadata['status'] == 'published|draft|private':
metadata['status'] = 'published'
+
+ metadata['sync'] = metadata['sync'] != 'false'
+
metadata['author_html'] = '<br>'.join(metadata['authors'].split(','))
return metadata, valid_sections
def read_research_post_index():
posts = []
- for fn in sorted(glob.glob(os.path.join(content_path, 'research/**/index.md'), recursive=True)):
+ for fn in sorted(glob.glob('../site/content/research/*/index.md')):
metadata, valid_sections = read_metadata(fn)
if metadata is None or metadata['status'] == 'private' or metadata['status'] == 'draft':
continue
diff --git a/builder/s3.py b/builder/s3.py
index f3dcce48..41ecdf61 100644
--- a/builder/s3.py
+++ b/builder/s3.py
@@ -18,6 +18,9 @@ def sync_directory(base_fn, s3_path, metadata):
for fn in glob.glob(os.path.join(base_fn, 'assets/*')):
fns[os.path.basename(fn)] = True
+ if not metadata['sync']:
+ return
+
remote_path = s3_path + metadata['url']
directory = s3_client.list_objects(Bucket=os.getenv('S3_BUCKET'), Prefix=remote_path)
@@ -53,3 +56,6 @@ def sync_directory(base_fn, s3_path, metadata):
os.getenv('S3_BUCKET'),
s3_fn,
ExtraArgs={ 'ACL': 'public-read' })
+
+def make_s3_path(s3_dir, metadata_path):
+ return "{}/{}/{}{}".format(os.getenv('S3_ENDPOINT'), os.getenv('S3_BUCKET'), s3_dir, metadata_path)