forked from unit/ciclostile
6 changed files with 134 additions and 55 deletions
@ -0,0 +1,47 @@ |
|||
import os |
|||
import markdown |
|||
import jinja2 |
|||
|
|||
|
|||
def read_markdown(page_name, markdown_path): |
|||
md_file = os.path.join(markdown_path, page_name + '.md') |
|||
|
|||
with open(md_file) as f: |
|||
md_text = f.read() |
|||
|
|||
return md_text |
|||
|
|||
|
|||
def render_from_text(md_text, template_path): |
|||
md = markdown.Markdown(extensions=['meta'], output_format='html5') |
|||
html = md.convert(md_text) |
|||
|
|||
# get markdown metadata |
|||
data = {key: md.Meta[key][0] for key in md.Meta.keys()} |
|||
|
|||
data.update({ |
|||
'content': html, |
|||
# 'page_name': page_name, # Needed? |
|||
}) |
|||
|
|||
template_name = data.get('template', 'default') |
|||
template_file = os.path.join(template_path, template_name + '.html') |
|||
|
|||
with open(template_file) as f: |
|||
template = f.read() |
|||
|
|||
page = jinja2.Template(template).render(**data) |
|||
return page |
|||
|
|||
|
|||
def render(page_name, markdown_path, template_path): |
|||
md_text = read_markdown(page_name, markdown_path) |
|||
page = render_from_text(md_text, template_path) |
|||
return page |
|||
|
|||
|
|||
def save(md_text, page_name, markdown_path): |
|||
md_file = os.path.join(markdown_path, page_name + '.md') |
|||
|
|||
with open(md_file, 'w') as f: |
|||
f.write(md_text) |
@ -0,0 +1,49 @@ |
|||
#!/usr/bin/env python3 |
|||
import os |
|||
from flask import Flask, send_from_directory, render_template, request,\ |
|||
redirect |
|||
import ciclostile |
|||
|
|||
working_dir = os.getcwd() |
|||
|
|||
target_path, template_path, markdown_path = [ |
|||
os.path.join(working_dir, folder_name) |
|||
for folder_name in ['target', 'templates', 'markdown'] |
|||
] |
|||
|
|||
app = Flask(__name__) |
|||
|
|||
|
|||
@app.route('/assets/<path:path>') |
|||
def assets(path): |
|||
assets_path = os.path.join(target_path, 'assets') |
|||
return send_from_directory(assets_path, path) |
|||
|
|||
|
|||
@app.route('/<string:page_name>') |
|||
@app.route('/<string:page_name>.html') |
|||
def page(page_name): |
|||
return ciclostile.render(page_name, markdown_path, template_path) |
|||
|
|||
|
|||
@app.route('/<string:page_name>/edit') |
|||
def edit(page_name): |
|||
md_text = ciclostile.read_markdown(page_name, markdown_path) |
|||
return render_template('edit.html', **locals()) |
|||
|
|||
|
|||
@app.route('/edit', methods=['POST']) |
|||
def edit_actions(): |
|||
page_name = request.form['page_name'] |
|||
md_text = request.form['md_text'] |
|||
|
|||
if request.form['action'] == 'preview': |
|||
return ciclostile.render_from_text(md_text, template_path) |
|||
|
|||
if request.form['action'] == 'save': |
|||
ciclostile.save(md_text, page_name, markdown_path) |
|||
return page(page_name) |
|||
|
|||
|
|||
if __name__ == '__main__': |
|||
app.run() |
@ -0,0 +1,20 @@ |
|||
<!DOCTYPE html> |
|||
<html> |
|||
<head> |
|||
<meta charset="utf-8"> |
|||
<title>{{ page_name }}: edit</title> |
|||
</head> |
|||
|
|||
<body> |
|||
<h1>{{ page_name }}: edit</h1> |
|||
<textarea name="md_text" form="mdform">{{ md_text }}</textarea> |
|||
|
|||
<form action="/edit" id="mdform" method="POST" target="preview_iframe"> |
|||
<input type="hidden" name="page_name" value="{{ page_name }}"> |
|||
<input type="submit" name="action" value="preview"> |
|||
<input type="submit" name="action" value="save"> |
|||
</form> |
|||
|
|||
<iframe name="preview_iframe" src="/{{ page_name }}"></iframe> |
|||
</body> |
|||
</html> |
Loading…
Reference in new issue