vite/make.py (view raw)
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 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
#!/usr/bin/env python3 import os import sys import jinja2 import time import argparse import http.server import socketserver from markdown2 import markdown_path from huepy import * from distutils.dir_util import copy_tree # import config file try: sys.path.append(os.getcwd()) import config except ModuleNotFoundError: print(bad('Error: config.py not found.')) print(que('Are you sure you\'re in a project directory?')) sys.exit(1) # constants PAGES_PATH = 'pages/' BUILD_PATH = 'build/' TEMPL_PATH = 'templates/' TEMPL_FILE = TEMPL_PATH + config.template PORT = 1911 # argument parsing def parser(): desc = green('A simple and minimal static site generator.') usage = lightblue('vite') + ' [build | serve]' serve_help = 'Serve pages from the ' + italic('build') + ' directory.' build_help = 'Build pages from the ' + italic('pages') + ' directory.' parser = argparse.ArgumentParser(description=desc, usage=usage) parser.add_argument('serve', nargs='*', help=serve_help) parser.add_argument('build', nargs='*', help=build_help) return parser # jinja2 def jinja_render(html_text, TEMPL_FILE): template_loader = jinja2.FileSystemLoader('./') env = jinja2.Environment(loader=template_loader) template = env.get_template(TEMPL_FILE) output = template.render(title=config.title, author=config.author, header=config.header, footer=config.footer, body=html_text) return output def markdown_render(filename): html_text = markdown_path(PAGES_PATH + filename) return html_text def html_gen(): for page in os.listdir(PAGES_PATH): html_text = markdown_render(page) html_file= os.path.splitext(os.path.join(BUILD_PATH, page))[0] if not os.path.exists(html_file): os.mkdir(html_file) output = jinja_render(html_text, TEMPL_FILE) with open(os.path.join(html_file, 'index.html'), 'w') as f: f.write(output) print(run('Rendered %s.' % (page))) def server(): handler = http.server.SimpleHTTPRequestHandler os.chdir(BUILD_PATH) try: with socketserver.TCPServer(('', PORT), handler) as httpd: print(run(f'Serving the {italic("build")} directory at http://localhost:{PORT}')) print(white('Ctrl+C') + ' to stop.') httpd.serve_forever() except KeyboardInterrupt: print(info('Stopping server.')) httpd.socket.close() sys.exit(1) def main(): args = parser().parse_args() if args.serve: server() elif args.build: start = time.process_time() TEMPL_FILE = TEMPL_PATH + config.template if not os.listdir(PAGES_PATH): print(info(italic('pages') + ' directory is empty. Nothing to build.')) sys.exit(1) else: try: html_gen() if not os.path.exists(os.path.join(BUILD_PATH, 'static')): os.mkdir(os.path.join(BUILD_PATH, 'static')) copy_tree('static', os.path.join(BUILD_PATH, 'static')) print(good('Done in %0.5fs.' % (time.process_time() - start))) except jinja2.exceptions.TemplateNotFound: print(bad('Error: specified template not found: %s' % TEMPL_FILE)) else: parser().print_help() sys.exit(1) if __name__ == "__main__": main() |