##// END OF EJS Templates
Reverse hscrollbar min-height hack on OS X...
Reverse hscrollbar min-height hack on OS X OS X has optional behavior to only draw scrollbars during scroll, which causes problems for CodeMirror's scrollbars. CodeMirror's solution is to set a minimum size for their scrollbars, which is always present. The trade is that the container overlays most of the last line, swallowing click events when there is scrolling to do, even when no scrollbar is visible. This reverses the trade, recovering the click events at the expense of never showing the horizontal scrollbar on OS X when this option is enabled.

File last commit:

r16868:f4eb2b7c
r20298:2907e856
Show More
serve.py
112 lines | 4.1 KiB | text/x-python | PythonLexer
MinRK
add proxying tornado server in Serve post-processor
r12442 """PostProcessor for serving reveal.js HTML slideshows."""
Thomas Kluyver
Convert print statements to print function calls...
r13348 from __future__ import print_function
damianavila
Added serve option as a post processor.
r11773 #-----------------------------------------------------------------------------
#Copyright (c) 2013, the IPython Development Team.
#
#Distributed under the terms of the Modified BSD License.
#
#The full license is in the file COPYING.txt, distributed with this software.
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
# Imports
#-----------------------------------------------------------------------------
import os
damianavila
Added webbroser to auto open the slideshow.
r11804 import webbrowser
MinRK
add proxying tornado server in Serve post-processor
r12442 from tornado import web, ioloop, httpserver
from tornado.httpclient import AsyncHTTPClient
damianavila
Added serve option as a post processor.
r11773
MinRK
add proxying tornado server in Serve post-processor
r12442 from IPython.utils.traitlets import Bool, Unicode, Int
damianavila
Added serve option as a post processor.
r11773
from .base import PostProcessorBase
#-----------------------------------------------------------------------------
# Classes
#-----------------------------------------------------------------------------
MinRK
add proxying tornado server in Serve post-processor
r12442
class ProxyHandler(web.RequestHandler):
"""handler the proxies requests from a local prefix to a CDN"""
@web.asynchronous
def get(self, prefix, url):
"""proxy a request to a CDN"""
proxy_url = "/".join([self.settings['cdn'], url])
client = self.settings['client']
client.fetch(proxy_url, callback=self.finish_get)
def finish_get(self, response):
"""finish the request"""
# copy potentially relevant headers
for header in ["Content-Type", "Cache-Control", "Date", "Last-Modified", "Expires"]:
if header in response.headers:
self.set_header(header, response.headers[header])
self.finish(response.body)
damianavila
Added serve option as a post processor.
r11773 class ServePostProcessor(PostProcessorBase):
MinRK
add proxying tornado server in Serve post-processor
r12442 """Post processor designed to serve files
Proxies reveal.js requests to a CDN if no local reveal.js is present
"""
damianavila
Added serve option as a post processor.
r11773
damianavila
Made open_in_browser configurable.
r11807 open_in_browser = Bool(True, config=True,
MinRK
add proxying tornado server in Serve post-processor
r12442 help="""Should the browser be opened automatically?"""
)
damianavila
Updated reveal CDN and use the new data-fragment-index attribute to get composite fragments (several cells inside the same fragment).
r16868 reveal_cdn = Unicode("https://cdn.jsdelivr.net/reveal.js/2.6.2", config=True,
MinRK
add proxying tornado server in Serve post-processor
r12442 help="""URL for reveal.js CDN."""
)
reveal_prefix = Unicode("reveal.js", config=True, help="URL prefix for reveal.js")
ip = Unicode("127.0.0.1", config=True, help="The IP address to listen on.")
port = Int(8000, config=True, help="port for the server to listen on.")
damianavila
Added serve option as a post processor.
r11773
Paul Ivanov
rename call methods to transform and postprocess...
r12218 def postprocess(self, input):
MinRK
add proxying tornado server in Serve post-processor
r12442 """Serve the build directory with a webserver."""
dirname, filename = os.path.split(input)
handlers = [
(r"/(.+)", web.StaticFileHandler, {'path' : dirname}),
(r"/", web.RedirectHandler, {"url": "/%s" % filename})
]
if ('://' in self.reveal_prefix or self.reveal_prefix.startswith("//")):
# reveal specifically from CDN, nothing to do
pass
elif os.path.isdir(os.path.join(dirname, self.reveal_prefix)):
# reveal prefix exists
self.log.info("Serving local %s", self.reveal_prefix)
else:
self.log.info("Redirecting %s requests to %s", self.reveal_prefix, self.reveal_cdn)
handlers.insert(0, (r"/(%s)/(.*)" % self.reveal_prefix, ProxyHandler))
app = web.Application(handlers,
cdn=self.reveal_cdn,
client=AsyncHTTPClient(),
)
# hook up tornado logging to our logger
MinRK
don't require tornado 3 in `--post serve`...
r12821 try:
from tornado import log
log.app_log = self.log
except ImportError:
# old tornado (<= 3), ignore
pass
MinRK
add proxying tornado server in Serve post-processor
r12442
http_server = httpserver.HTTPServer(app)
http_server.listen(self.port, address=self.ip)
url = "http://%s:%i/%s" % (self.ip, self.port, filename)
Thomas Kluyver
Clean up converted code....
r13386 print("Serving your slides at %s" % url)
MinRK
add proxying tornado server in Serve post-processor
r12442 print("Use Control-C to stop this server")
if self.open_in_browser:
webbrowser.open(url, new=2)
damianavila
Capturing Keyboard interrupt.
r11775 try:
MinRK
add proxying tornado server in Serve post-processor
r12442 ioloop.IOLoop.instance().start()
damianavila
Capturing Keyboard interrupt.
r11775 except KeyboardInterrupt:
MinRK
add proxying tornado server in Serve post-processor
r12442 print("\nInterrupted")
def main(path):
"""allow running this module to serve the slides"""
server = ServePostProcessor()
server(path)
if __name__ == '__main__':
import sys
main(sys.argv[1])