summaryrefslogtreecommitdiff
path: root/panfry/main.py
blob: 40c2b15701829283b16a0b793a5c84cc7a383a3a (plain)
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
116
117
118
119
120
121
122
123
124
125
#!/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:<port>"""
            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()