"""
Defines Presentation specific objects
"""
import mistune
import os
import threading
import time
import lookatme.contrib
from lookatme.parser import Parser
import lookatme.themes
import lookatme.tui
from lookatme.utils import dict_deep_update
[docs]class Presentation(object):
"""Defines a presentation
"""
def __init__(self, input_stream, theme, style_override=None, live_reload=False):
"""Creates a new Presentation
:param stream input_stream: An input stream from which to read the
slide data
"""
self.input_filename = None
if hasattr(input_stream, "name"):
self.input_filename = input_stream.name
self.style_override = style_override
self.live_reload = live_reload
self.theme_mod = __import__("lookatme.themes." + theme, fromlist=[theme])
if self.live_reload:
self.reload_thread = threading.Thread(target=self.reload_watcher)
self.reload_thread.daemon = True
self.reload_thread.start()
self.reload(data=input_stream.read())
[docs] def reload_watcher(self):
"""Watch for changes to the input filename, automatically reloading
when the modified time has changed.
"""
if self.input_filename is None:
return
last_mod_time = os.path.getmtime(self.input_filename)
while True:
try:
curr_mod_time = os.path.getmtime(self.input_filename)
if curr_mod_time != last_mod_time:
self.tui.reload()
self.tui.loop.draw_screen()
last_mod_time = curr_mod_time
except Exception:
pass
finally:
time.sleep(0.25)
[docs] def reload(self, data=None):
"""Reload this presentation
:param str data: The data to render for this slide deck (optional)
"""
if data is None:
with open(self.input_filename, "r") as f:
data = f.read()
parser = Parser()
self.meta, self.slides = parser.parse(data)
lookatme.contrib.load_contribs(self.meta.get("extensions", []))
self.styles = lookatme.themes.ensure_defaults(self.theme_mod)
dict_deep_update(self.styles, self.meta.get("styles", {}))
# now apply any command-line style overrides
if self.style_override is not None:
self.styles["style"] = self.style_override
lookatme.config.STYLE = self.styles
[docs] def run(self, start_slide=0):
"""Run the presentation!
"""
self.tui = lookatme.tui.create_tui(self, start_slide=start_slide)
self.tui.run()