all repos — py-vite @ 7e889b37bc1a5b7f4b5d7630892cdaba87f1e297

the original vite, written in python

vite/make.py (view raw)

  1#!/usr/bin/env python3
  2
  3import os
  4import sys
  5import jinja2
  6import time
  7import argparse
  8import http.server
  9import socketserver
 10
 11from markdown2 import markdown_path
 12from huepy import *
 13from distutils.dir_util import copy_tree
 14
 15# jinja2
 16def jinja_render(html_text, TEMPL_FILE):
 17    template_loader = jinja2.FileSystemLoader('./')
 18    env = jinja2.Environment(loader=template_loader)
 19    template = env.get_template(TEMPL_FILE)
 20    output = template.render(title=config.title,
 21                             author=config.author,
 22                             header=config.header,
 23                             footer=config.footer,
 24                             body=html_text)
 25    return output
 26
 27
 28def markdown_render(filename):
 29    html_text = markdown_path(PAGES_PATH + filename)
 30    return html_text
 31
 32
 33def html_gen():
 34    for page in os.listdir(PAGES_PATH):
 35        html_text = markdown_render(page)
 36        html_file= os.path.splitext(os.path.join(BUILD_PATH, page))[0]
 37        if not os.path.exists(html_file):
 38            os.mkdir(html_file)
 39        output = jinja_render(html_text, TEMPL_FILE)
 40        with open(os.path.join(html_file, 'index.html'), 'w') as f:
 41            f.write(output)
 42            print(run('Rendered %s.' % (page)))
 43
 44
 45def server():
 46    handler = http.server.SimpleHTTPRequestHandler
 47    os.chdir(BUILD_PATH)
 48    try:
 49        with socketserver.TCPServer(('', PORT), handler) as httpd:
 50            print(run(f'Serving the {italic("build")} directory at http://localhost:{PORT}'))
 51            print(white('Ctrl+C') + ' to stop.')
 52            httpd.serve_forever()
 53    except KeyboardInterrupt:
 54        print(info('Stopping server.'))
 55        httpd.socket.close()
 56        sys.exit(1)
 57
 58
 59def main():
 60    if args.serve:
 61        server()
 62    else:
 63        start = time.process_time()
 64        TEMPL_FILE = TEMPL_PATH + config.template
 65        if not os.listdir(PAGES_PATH):
 66            print(info(italic('pages') + ' directory is empty. Nothing to build.'))
 67            sys.exit(1)
 68        else:
 69            try:
 70                html_gen()
 71                if not os.path.exists(os.path.join(BUILD_PATH, 'static')):
 72                    os.mkdir(os.path.join(BUILD_PATH, 'static'))
 73                copy_tree('static', os.path.join(BUILD_PATH, 'static'))
 74                print(good('Done in %0.5fs.' % (time.process_time() - start)))
 75            except jinja2.exceptions.TemplateNotFound:
 76                print(bad('Error: specified template not found: %s' % TEMPL_FILE))
 77
 78
 79if __name__ == "__main__":
 80    desc = green('Script to build and serve Vite projects.')
 81    usage = lightblue('make.py') + ' [serve]'
 82    help_txt = 'Serve pages from the ' + italic('build') + ' directory.'
 83    parser = argparse.ArgumentParser(description=desc, usage=usage)
 84    parser.add_argument('serve', nargs='*', help=help_txt)
 85    
 86    args = parser.parse_args()
 87    
 88    # import config file
 89    try:
 90        sys.path.append(os.getcwd())
 91        import config
 92    except ModuleNotFoundError:
 93        print(bad('Error: config.py not found.'))
 94        print(que('Are you sure you\'re in a project directory?'))
 95        parser.print_help()
 96        sys.exit(1)
 97
 98    # constants
 99    PAGES_PATH = 'pages/'
100    BUILD_PATH = 'build/'
101    TEMPL_PATH = 'templates/'
102    TEMPL_FILE = TEMPL_PATH + config.template
103    PORT = 1911
104
105    main()