diff --git a/md2html/md2html.py b/md2html/md2html.py
index e58ca04..d771f2c 100644
--- a/md2html/md2html.py
+++ b/md2html/md2html.py
@@ -5,81 +5,37 @@ import hashlib
import sys
import threading
from http.server import ThreadingHTTPServer, BaseHTTPRequestHandler
-from os.path import basename, dirname, abspath
+from os.path import basename, dirname, abspath, join
from urllib.parse import urlparse
import markdown
-TEMPLATE = """
-
-
-
- {css}
-
-
-
-
-
- {content}
-
-
-
-"""
-def create_css_tag(url_list):
- result = ''
- for url in url_list:
- result += '' % url
- return result
+STATIC_CACHE = {}
+def load_from_cache(path):
+ global STATIC_CACHE
+ if path not in STATIC_CACHE:
+ with open(join(dirname(__file__), 'static') + path, 'r') as static_file:
+ STATIC_CACHE[path] = static_file.read()
+ return STATIC_CACHE[path]
-def compile_html(mdfile=None, extensions=None, raw=None, stylesheet=(), **kwargs):
+def compile_html(mdfile=None, extensions=None, raw=None, **kwargs):
html = None
with mdfile and open(mdfile, 'r') or sys.stdin as instream:
html = markdown.markdown(instream.read(), extensions=extensions, output_format='html5')
if raw:
doc = html
else:
- doc = TEMPLATE.format(content=html, css=create_css_tag(stylesheet))
+ css = ' ' % (
+ load_from_cache('/github-markdown.css'),
+ load_from_cache('/custom.css')
+ )
+ doc = load_from_cache('/template.html').format(content=html, script='', css=css)
return doc
class MarkdownHTTPServer(ThreadingHTTPServer):
- def __init__(self, mdfile, extensions=(), stylesheet=(), handler=BaseHTTPRequestHandler, interface="127.0.0.1", port=8080):
+ def __init__(self, mdfile, extensions=(), handler=BaseHTTPRequestHandler, interface="127.0.0.1", port=8080):
import inotify
import inotify.adapters
import signal
@@ -93,7 +49,6 @@ class MarkdownHTTPServer(ThreadingHTTPServer):
self.mdfile = mdfile
self.extensions = extensions
- self.stylesheet = stylesheet
self.condition_variable = threading.Condition()
self.hash = None
self.etag = None
@@ -134,6 +89,7 @@ class MarkdownHTTPServer(ThreadingHTTPServer):
class MarkdownRequestHandler(BaseHTTPRequestHandler):
+
status_map = {
200: "OK",
204: "No Content",
@@ -176,8 +132,13 @@ class MarkdownRequestHandler(BaseHTTPRequestHandler):
def do_GET(self):
path = urlparse(self.path)
if path.path == '/':
- self.answer(200, reply=TEMPLATE.format(content='', css=create_css_tag(self.server.stylesheet)),
+ self.answer(200, reply=load_from_cache('/template.html').format(content='',
+ script='',
+ css=''
+ ''),
content_type='text/html')
+ elif path.path in {'/github-markdown.css', '/custom.css', '/hot-reload.js'}:
+ self.answer(200, load_from_cache(path.path), content_type='text/css')
elif path.path == '/markdown':
self.markdown_answer()
elif path.path == '/reload':
@@ -219,9 +180,6 @@ def parse_args(args=None):
help='Specify http server port (defaults to 5000)')
parser.add_argument('-i', '--interface', default='',
help='Specify http server listen interface (defaults to localhost)')
- parser.add_argument('-s', '--stylesheet', nargs='+',
- default=['http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.0/css/bootstrap-combined.min.css'],
- help='Specify a list of stylesheet URLs to add to the html page')
except ImportError:
pass
return parser.parse_args(args)
@@ -236,7 +194,6 @@ def main(args=None):
if hasattr(args, 'watch') and args.watch:
server = MarkdownHTTPServer(args.mdfile,
extensions=args.extensions,
- stylesheet=args.stylesheet,
interface=args.interface,
port=args.port,
handler=MarkdownRequestHandler)
diff --git a/md2html/static/custom.css b/md2html/static/custom.css
new file mode 100644
index 0000000..7aded8f
--- /dev/null
+++ b/md2html/static/custom.css
@@ -0,0 +1,13 @@
+.markdown-body {
+ box-sizing: border-box;
+ min-width: 200px;
+ max-width: 980px;
+ margin: 0 auto;
+ padding: 45px;
+}
+
+@media (max-width: 767px) {
+ .markdown-body {
+ padding: 15px;
+ }
+}
\ No newline at end of file
diff --git a/md2html/static/hot-reload.js b/md2html/static/hot-reload.js
new file mode 100644
index 0000000..1aaae48
--- /dev/null
+++ b/md2html/static/hot-reload.js
@@ -0,0 +1,19 @@
+function req(first) {
+ var xmlhttp = new XMLHttpRequest();
+ xmlhttp.onload = function() {
+ if (xmlhttp.status == 200) {
+ document.querySelector("article.markdown-body").innerHTML = xmlhttp.responseText;
+ } else if(xmlhttp.status == 304) {
+ } else {
+ console.log(xmlhttp.status, xmlhttp.statusText);
+ }
+ req(false);
+ };
+ xmlhttp.onerror = function() {
+ console.log(xmlhttp.status, xmlhttp.statusText);
+ setTimeout(req, 1000, false);
+ };
+ xmlhttp.open("GET", first ? "/markdown" : "/reload", true);
+ xmlhttp.send();
+}
+req(true);
diff --git a/md2html/static/template.html b/md2html/static/template.html
new file mode 100644
index 0000000..14a8a99
--- /dev/null
+++ b/md2html/static/template.html
@@ -0,0 +1,13 @@
+
+
+
+
+ {css}
+
+
+ {script}
+
+ {content}
+
+
+
diff --git a/setup.py b/setup.py
index 75a6e89..91874ca 100644
--- a/setup.py
+++ b/setup.py
@@ -8,7 +8,7 @@ def read(fname):
config = {
'name': "md2html",
- 'version': "0.1",
+ 'version': "0.2",
'author': "Walter Oggioni",
'author_email': "oggioni.walter@gmail.com",
'description': ("Various development utility scripts"),
@@ -17,6 +17,9 @@ config = {
'keywords': "build",
'url': "https://github.com/oggio88/md2html",
'packages': ['md2html'],
+ 'package_data': {
+ '': ['*.html', '*.css', '*.js'],
+ },
'include_package_data': True,
'classifiers': [
'Development Status :: 3 - Alpha',