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 |
#!/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 *
desc = green('Script to build and serve Vite projects.')
usage = lightblue('make.py') + ' [serve]'
help_txt = 'Serve pages from the ' + italic('build') + ' directory.'
parser = argparse.ArgumentParser(description=desc, usage=usage)
parser.add_argument('serve', nargs='*', help=help_txt)
args = parser.parse_args()
# 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?'))
parser.print_help()
sys.exit(1)
# constants
PAGES_PATH = 'pages/'
BUILD_PATH = 'build/'
TEMPL_PATH = 'templates/'
TEMPL_FILE = TEMPL_PATH + config.template
PORT = 1911
# 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)
print(os.getcwd())
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.'))
http.server_close()
sys.exit(1)
def main():
if args.serve:
server()
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()
print(good('Done in %0.5fs.' % (time.process_time() - start)))
except jinja2.exceptions.TemplateNotFound:
print(bad('Error: specified template not found: %s' % (TEMPL_FILE)))
if __name__ == "__main__":
main()
|