import os from flask import Flask, render_template, url_for, send_from_directory, request, redirect import frontmatter import markdown from prefix import PrefixMiddleware from dotenv import load_dotenv from time import strftime, localtime import glob import subprocess load_dotenv() prefix = os.environ.get('URL_PREFIX', '') port = os.environ.get('PORT', 3000) debug = os.environ.get('DEBUG', False) update_script = os.environ.get('UPDATE', 'update.sh' ) # --- # Functions # --- def list_files(folder, remove_ext=False): ''' Read all the functions in a folder ''' names = [] for entry in os.scandir(folder): # add to the list only proper files if entry.is_file(follow_symlinks=False): # remove the extension from the filename n = entry.name if remove_ext: n = os.path.splitext(entry.name)[0] names.append(n) return names def txt_list(): ''' Generate list of writings ''' files = sorted(filter(os.path.isfile, glob.glob('txt/[!.]*.md')), key=lambda file: os.path.getmtime(file), reverse=True) writings = [] for file in files: with open(file) as f: meta, content = frontmatter.parse(f.read()) meta['slug'] = os.path.splitext(os.path.basename(file))[0] meta['last_edit'] = strftime('%d.%m.%Y', localtime(os.path.getmtime(file))) writings.append(meta) return writings def render_list(): subprocess.run(update_script, shell=True) with open('list.html', 'w+') as f: f.write(render_template('home.html', writings=txt_list())) # --- # Create Flask App # --- app = Flask(__name__) app.wsgi_app = PrefixMiddleware(app.wsgi_app, prefix=prefix) # --- # Routes # --- @app.route('/') def home(): return send_from_directory(app.root_path,'list.html') @app.route('/txt/') def txt(slug): try: with open(f'txt/{slug}.md') as f: meta, content = frontmatter.parse(f.read()) text = {**meta} text['content']=markdown.markdown(content) return render_template('text.html', text=text) except FileNotFoundError: return 'File not found!' @app.route('/api/update', methods=['GET', 'POST']) def update(): render_list() if request.method == 'POST': render_list() return redirect(url_for('home')) # --- # Run the app # --- app.run(port=port, debug=debug)