#!/usr/bin/env python # -*- coding: utf-8 -*- from __future__ import print_function import os import signal import shutil import shlex import SimpleHTTPServer import BaseHTTPServer import httplib import panfry.cli from panfry.templater import Templater from panfry.document import Document class StoppableHttpRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler): """http request handler with QUIT stopping the server""" def do_QUIT(self): """send 200 OK response, and set server.stop to True""" self.send_response(200) self.end_headers() self.server.stop = True class StoppableHttpServer(BaseHTTPServer.HTTPServer): """http server that reacts to self.stop flag""" def serve_forever(self): """Handle one request at a time until stopped.""" self.stop = False while not self.stop: self.handle_request() def get_env(): env = panfry.cli.init_argparser().parse_args() env.pub_path = os.path.abspath(env.pub_path) if env.cmd in ['gen']: if not os.path.isdir(env.doc_path): print("%s directory not found. Aborting..." % env.doc_path) exit(1) if not env.templates_path: env.templates_path = os.path.join(env.doc_path, 'templates') if not os.path.isdir(env.templates_path): print("No templates path found. Aborting...") exit(1) if env.pandoc_options: env.pandoc_options = list(shlex.split(env.pandoc_options)) return env def gen(env): document = Document(env.doc_path) document.set_templater(Templater(env.templates_path)) document.set_pandoc_options(env.pandoc_options) if env.simple_toc: document.set_simple_toc if env.clean and os.path.exists(env.pub_path): print("Cleanup, removing %s..." % env.pub_path) shutil.rmtree(env.pub_path) if not os.path.exists(env.pub_path): os.mkdir(env.pub_path) if env.assets: print("Publishing assets only...", end=' ') document.publish_assets(env.pub_path) print("done.") exit(0) print("\nUsing pandoc options:") for opt in env.pandoc_options: print(" --%s" % opt) print() ###### Create PDF pdffile = document.publish_pdf(env.pub_path) print("Wrote PDF: %s" % pdffile) ###### Create epub epubfile = document.publish_epub(env.pub_path) print("Wrote epub: %s" % epubfile) ###### Create HTML document.publish_html(env.pub_path) exit(0) def serve(env): os.chdir(env.pub_path) def signal_handler(signal, frame): print('You pressed Ctrl+C!') def stop_server(port): """send QUIT request to http server running on localhost:""" conn = httplib.HTTPConnection("localhost:%d" % env.port) conn.request("QUIT", "/") conn.getresponse() exit(0) signal.signal(signal.SIGINT, signal_handler) Handler = StoppableHttpRequestHandler httpd = StoppableHttpServer(("", int(env.port)), Handler) print("serving at port: %s" % int(env.port)) httpd.serve_forever() signal.pause() def main(): CMD = dict(gen=gen, serve=serve) env = get_env() CMD[env.cmd](env) if __name__ == "__main__": main()