super().__init__(*args, **kwargs)
self.secret = secret or token_urlsafe(64)
self.hub = Hub(self.secret)
- self.sr = StaticResource(self.secret, hubapp, self.hub.master_ws_uri)
+ self.sr = StaticResource(self.secret, hubapp)
self.browser = browser
self.hub.add_routes(self)
self.sr.add_routes(self)
+ self.hub.update_context_vars(self.sr.context_vars)
self.add_error_handler(Exception, self.print_exception)
async def print_exception(self, req, resp, ex, params):
+from io import BytesIO
import json
import mimetypes
import os
class StaticFile:
template_ext = ".tpl"
+ template_filters = {
+ b"tojson": lambda value: json.dumps(value)
+ }
def __init__(self, path):
self.path = path
with open(self.path, "rb") as fh:
return fh.read()
- def get(self):
- if self.path.stat().st_mtime != self.mtime:
- self.content = self.load_content()
- return self.content
-
- def render(self, context_vars):
- content = self.get()
+ def get(self, context_vars):
+ content = self.load_content() if self.path.stat().st_mtime != self.mtime else self.content
if self.path.suffix == self.template_ext:
- for k, v in context_vars.items():
- content = content.replace(b"{{ %s }}" % k.encode(), v.encode())
+ content = self.render(content, context_vars)
+ self.content = content
return content
+ def render(self, content, context_vars):
+ bio = BytesIO()
+ pos = 0
+ while True:
+ new_pos = content.find(b"{{", pos)
+ if new_pos < 0:
+ break
+ bio.write(content[pos:new_pos])
+ end_pos = content.find(b"}}", new_pos)
+ assert end_pos > 0
+ full_tag = content[new_pos + 2:end_pos].split(b"|", 1)
+ value = context_vars[full_tag[0].strip().decode()]
+ if len(full_tag) == 2:
+ value = self.template_filters[full_tag[1].strip()](value)
+ bio.write(value.encode())
+ pos = end_pos + 2
+ bio.write(content[pos:])
+ return bio.getvalue()
+
def __str__(self):
return f"<StaticFile at \"{os.sep.join(self.path.parts[-2:])}\" [{self.mime_type}]>"
class StaticResource:
- def __init__(self, secret, current_hubapp, master_ws_uri):
+ def __init__(self, secret, current_hubapp):
mimetypes.init()
- hub_js_path = Path(__file__).parent / "hub.js"
- self.static_files = {
- "/hub.js": StaticFile(hub_js_path),
- }
- self.context_vars = {
- "master_ws_uri": json.dumps(master_ws_uri),
- }
+ self.static_files = {}
+ self.context_vars = {}
self.master_uri = ""
self.setup(secret, current_hubapp)
if path == "/":
path = index_uri
res = self.static_files[path]
- resp.data = res.render(self.context_vars)
+ resp.data = res.get(self.context_vars)
resp.content_type = res.mime_type
def add_routes(self, app):