import os import re import glob import mistune from paths import * renderer = mistune.Renderer(escape=False) markdown = mistune.Markdown(renderer=renderer) def fix_images(lines, s3_path): real_lines = [] 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) if ':' in alt_text: tail, alt_text = alt_text.split(':', 1) img_tag = "{}".format(s3_path + url, alt_text.replace("'", "")) if len(alt_text): line = "
{}
{}
".format(img_tag, alt_text) else: line = "
{}
".format(img_tag, alt_text) real_lines.append(line) return "\n".join(real_lines) def format_section(lines, s3_path, type=''): if len(lines): lines = fix_images(lines, s3_path) if type: return "
{}
".format(type, markdown(lines)) else: return "
" + markdown(lines) + "
" return "" def parse_markdown(sections, s3_path): groups = [] current_group = [] for section in sections: if section.startswith('# '): continue if '![wide:' in section: groups.append(format_section(current_group, s3_path)) groups.append(format_section([section], s3_path, type='wide')) current_group = [] elif '![' in section: groups.append(format_section(current_group, s3_path)) groups.append(format_section([section], s3_path, type='images')) current_group = [] else: current_group.append(section) groups.append(format_section(current_group, s3_path)) content = "".join(groups) return content def read_metadata(fn): with open(fn, "r") as file: data = file.read() data = data.replace("\n ", "\n") if "\n" in data: data = data.replace("\r", "") else: data = data.replace("\r", "\n") sections = data.split("\n\n") return parse_metadata(fn, sections) default_metadata = { 'status': 'published', 'title': 'Untitled Page', 'desc': '', 'slug': '', 'published': '2018-12-31', 'updated': '2018-12-31', 'authors': 'Adam Harvey', } def parse_metadata_section(metadata, section): for line in section.split("\n"): if ': ' not in line: continue key, value = line.split(': ', 1) metadata[key.lower()] = value def parse_metadata(fn, sections): found_meta = False metadata = {} valid_sections = [] for section in sections: if not found_meta and ': ' in section: found_meta = True parse_metadata_section(metadata, section) continue if '-----' in section: continue if found_meta: valid_sections.append(section) if 'title' not in metadata: print('warning: {} has no title'.format(fn)) for key in default_metadata: if key not in metadata: metadata[key] = default_metadata[key] basedir = os.path.dirname(fn.replace(content_path, '')) basename = os.path.basename(fn) if basedir == '/': metadata['path'] = '/' metadata['url'] = '/' elif basename == 'index.md': metadata['path'] = basedir + '/' metadata['url'] = metadata['path'] else: metadata['path'] = basedir + '/' metadata['url'] = metadata['path'] + basename.replace('.md', '') + '/' if metadata['status'] == 'published|draft|private': metadata['status'] = 'published' metadata['author_html'] = '
'.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)): metadata, valid_sections = read_metadata(fn) if metadata is None or metadata['status'] == 'private' or metadata['status'] == 'draft': continue posts.append(metadata) if not len(posts): posts.append({ 'title': 'Placeholder', 'slug': 'placeholder', 'date': 'Placeholder', 'url': '/', }) return posts