-
-
Save agusmakmun/ce4c0e980b11c24db69b7dc5637b286c to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
# -*- coding: utf-8 -*- | |
import mimetypes, sys | |
import datetime | |
from os import curdir, sep | |
from os.path import splitext | |
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer | |
import codecs | |
try: | |
from jinja2 import Template, Environment, FileSystemLoader, nodes | |
from jinja2.ext import Extension | |
except ImportError: | |
print "Jinja template engine is not installed. Fix this with `pip install jinja2`" | |
exit(1) | |
DEBUG = True | |
TEMPLATE_DEBUG = True | |
jinja_env = Environment(extensions=[]) | |
def do_indent_tabs(s, width=1, indentfirst=False, usetabs=False): | |
""" | |
Yoinked from Jinja2 source. thx babes. | |
""" | |
tab = u'\t' | |
if usetabs == False: | |
tab = ' ' | |
indention = tab * width | |
rv = (u'\n' + indention).join(s.splitlines()) | |
if indentfirst: | |
rv = indention + rv | |
return rv | |
jinja_globals = {} | |
jinja_env.loader = FileSystemLoader('.') | |
jinja_env.filters['indent'] = do_indent_tabs | |
server_port = 8080 | |
# Could come in handy. | |
jinja_globals["current_year"] = datetime.datetime.now().year | |
jinja_globals["current_datestamp"] = datetime.datetime.now() | |
jinja_env.globals.update(jinja_globals) | |
class JinjaHandler(BaseHTTPRequestHandler): | |
def do_GET(self): | |
try: | |
path = self.path | |
if path.endswith('/'): | |
path += 'index.html' | |
path = _path = path.strip('/') | |
_path = list(path.rpartition('/')) # I LOVE YOU RPARTITION | |
save_as_file = False | |
if (_path[2].endswith('.html') or _path[2].endswith('.xml')) and not _path[2].startswith('_'): | |
_path[2] = '_' + _path[2] | |
save_as_file = True | |
_path = ''.join(_path) | |
# Open the _source file | |
source_file = codecs.open(curdir + sep + _path, "r") | |
self.send_response(200) | |
self.send_header('Content-type', mimetypes.guess_type(path)[0]) | |
self.end_headers() | |
jinja_env.globals.update({"path":path}) | |
if( save_as_file ): | |
template = jinja_env.from_string(source_file.read().decode('utf8')).render().encode('utf-8') | |
# Non-ASCII decoration. FIGHT ME. | |
# template += ("\n\n" | |
# "<!-- ┌──────────────────────────────────────────────────────┐ -->\n" | |
# "<!-- │ Rendered with serve.py on %s │ -->\n" | |
# "<!-- └──────────────────────────────────────────────────────┘ -->\n") % datetime.datetime.now() | |
self.wfile.write( template ) | |
destination_file = open( curdir + sep + path, 'w' ) | |
destination_file.write(template) | |
destination_file.close() | |
else: | |
self.wfile.write(source_file.read()) | |
source_file.close() | |
return | |
except IOError, e: | |
import traceback, os.path | |
top = traceback.extract_stack()[-1] | |
self.wfile.write( | |
"<code>Error: %s<br>Details: %s</code>" % | |
( | |
type(e).__name__, | |
# os.path.basename(top[0]), | |
# str(top[1]), | |
e | |
) | |
) | |
return | |
# self.send_error(404,'File Not Found: %s' % self.path) | |
if __name__ == '__main__': | |
if (len(sys.argv) > 1): | |
try: | |
sys.argv[1] = int( sys.argv[1] ) | |
server_port = sys.argv[1] | |
except: | |
print "Invalid port number:", sys.argv[1] | |
exit(1) | |
try: | |
httpd = HTTPServer(('',server_port), JinjaHandler) | |
print 'Server started on port %d, press Ctrl-C to stop' % server_port | |
httpd.serve_forever() | |
except KeyboardInterrupt: | |
print "\nShutting down..." | |
httpd.socket.close() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment