-
-
Notifications
You must be signed in to change notification settings - Fork 2.4k
/
serve.py
87 lines (66 loc) · 2.38 KB
/
serve.py
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
import logging
import shutil
import tempfile
from mkdocs.build import build
from mkdocs.config import load_config
log = logging.getLogger(__name__)
def _livereload(host, port, config, builder, site_dir):
# We are importing here for anyone that has issues with livereload. Even if
# this fails, the --no-livereload alternative should still work.
from livereload import Server
server = Server()
# Watch the documentation files, the config file and the theme files.
server.watch(config['docs_dir'], builder)
server.watch(config['config_file_path'], builder)
for d in config['theme_dir']:
server.watch(d, builder)
server.serve(root=site_dir, host=host, port=int(port), restart_delay=0)
def _static_server(host, port, site_dir):
# Importing here to seperate the code paths from the --livereload
# alternative.
from tornado import ioloop
from tornado import web
application = web.Application([
(r"/(.*)", web.StaticFileHandler, {
"path": site_dir,
"default_filename": "index.html"
}),
])
application.listen(port=port, address=host)
log.info('Running at: http://%s:%s/', host, port)
log.info('Hold ctrl+c to quit.')
try:
ioloop.IOLoop.instance().start()
except KeyboardInterrupt:
log.info('Stopping server...')
def serve(config_file=None, dev_addr=None, strict=None, theme=None,
livereload=True):
"""
Start the MkDocs development server
By default it will serve the documentation on http://localhost:8000/ and
it will rebuild the documentation and refresh the page automatically
whenever a file is edited.
"""
# Create a temporary build directory, and set some options to serve it
tempdir = tempfile.mkdtemp()
def builder():
log.info("Rebuilding documentation...")
config = load_config(
config_file=config_file,
dev_addr=dev_addr,
strict=strict,
theme=theme,
)
config['site_dir'] = tempdir
build(config, live_server=True)
return config
# Perform the initial build
config = builder()
host, port = config['dev_addr'].split(':', 1)
try:
if livereload:
_livereload(host, port, config, builder, tempdir)
else:
_static_server(host, port, tempdir)
finally:
shutil.rmtree(tempdir)