From 4a1bfdd53073898cb92d836493c58b62136b0c26 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Tue, 27 Jun 2023 09:01:09 +0000 Subject: [PATCH] docs: Render images (and other uploaded files) Signed-off-by: Michael Tremer --- src/backend/wiki.py | 19 ++++++++++++------ src/web/__init__.py | 2 +- src/web/docs.py | 49 +++++++++++++++++++++++++++++++++++++++++++++ src/web/wiki.py | 49 --------------------------------------------- 4 files changed, 63 insertions(+), 56 deletions(-) diff --git a/src/backend/wiki.py b/src/backend/wiki.py index c392d1a0..95849ee1 100644 --- a/src/backend/wiki.py +++ b/src/backend/wiki.py @@ -614,11 +614,16 @@ class WikiRenderer(misc.Object): def _render_image(self, m): alt_text, url, caption = m.groups() + html = """ +
+ %s +
%s
+
+ """ + # Skip any absolute and external URLs if url.startswith("/") or url.startswith("https://") or url.startswith("http://"): - return """
%s -
%s
- """ % (url, alt_text, caption or "") + return html % (url, alt_text, caption or "") # Try to split query string url, delimiter, qs = url.partition("?") @@ -638,9 +643,11 @@ class WikiRenderer(misc.Object): if not "s" in args: args["s"] = "920" - return """
%s -
%s
- """ % (url, urllib.parse.urlencode(args), caption, caption or "") + # Append arguments to the URL + if args: + url = "%s?%s" % (url, urllib.parse.urlencode(args)) + + return html % (url, caption, caption or "") def render(self, text): logging.debug("Rendering %s" % self.path) diff --git a/src/web/__init__.py b/src/web/__init__.py index 5e95bc93..91a8cdc2 100644 --- a/src/web/__init__.py +++ b/src/web/__init__.py @@ -139,6 +139,7 @@ class Application(tornado.web.Application): (r"/blog/([0-9a-z\-\._]+)/publish", blog.PublishHandler), # Docs + (r"/docs((?:[A-Za-z0-9\-_\/]+)?(?:.*)\.(?:\w+))$", docs.FileHandler), (r"/docs([A-Za-z0-9\-_\/]+)?", docs.PageHandler), # Downloads @@ -353,7 +354,6 @@ class Application(tornado.web.Application): # Media (r"([A-Za-z0-9\-_\/]+)?/_files", wiki.FilesHandler), - (r"((?!/static)(?:[A-Za-z0-9\-_\/]+)?(?:.*)\.(?:\w+))$", wiki.FileHandler), # Serve any static files (r"/static/(.*)", tornado.web.StaticFileHandler, { "path" : self.settings.get("static_path") }), diff --git a/src/web/docs.py b/src/web/docs.py index 4f20b5d9..01e168c8 100644 --- a/src/web/docs.py +++ b/src/web/docs.py @@ -89,6 +89,55 @@ class PageHandler(base.BaseHandler): self.render("docs/page.html", page=page, latest_revision=latest_revision) +class FileHandler(base.BaseHandler): + @property + def action(self): + return self.get_argument("action", None) + + def get(self, path): + # Check permissions + if not self.backend.wiki.check_acl(path, self.current_user): + raise tornado.web.HTTPError(403, "Access to %s not allowed for %s" % (path, self.current_user)) + + # Check if we are asked to render a certain revision + revision = self.get_argument("revision", None) + + # Fetch the file + file = self.backend.wiki.get_file_by_path(path, revision=revision) + if not file: + raise tornado.web.HTTPError(404, "Could not find %s" % path) + + # Render detail page + if self.action == "detail": + page = None + + for breadcrumb, title in self.backend.wiki.make_breadcrumbs(path): + page = self.backend.wiki.get_page(breadcrumb) + if page: + break + + self.render("wiki/files/detail.html", page=page, file=file) + return + + size = self.get_argument_int("s", None) + + # Check if image should be resized + if size and file.is_bitmap_image(): + blob = file.get_thumbnail(size) + else: + blob = file.blob + + # Set headers + self.set_header("Content-Type", file.mimetype or "application/octet-stream") + self.set_header("Content-Length", len(blob)) + + # Set expires + self.set_expires(3600) + + # Deliver content + self.finish(blob) + + class HeaderModule(ui_modules.UIModule): @property def page(self): diff --git a/src/web/wiki.py b/src/web/wiki.py index 674ebba0..d9ba122a 100644 --- a/src/web/wiki.py +++ b/src/web/wiki.py @@ -211,55 +211,6 @@ class FilesHandler(base.BaseHandler): self.render("wiki/files/index.html", path=path, files=files) -class FileHandler(base.BaseHandler): - @property - def action(self): - return self.get_argument("action", None) - - def get(self, path): - # Check permissions - if not self.backend.wiki.check_acl(path, self.current_user): - raise tornado.web.HTTPError(403, "Access to %s not allowed for %s" % (path, self.current_user)) - - # Check if we are asked to render a certain revision - revision = self.get_argument("revision", None) - - # Fetch the file - file = self.backend.wiki.get_file_by_path(path, revision=revision) - if not file: - raise tornado.web.HTTPError(404, "Could not find %s" % path) - - # Render detail page - if self.action == "detail": - page = None - - for breadcrumb, title in self.backend.wiki.make_breadcrumbs(path): - page = self.backend.wiki.get_page(breadcrumb) - if page: - break - - self.render("wiki/files/detail.html", page=page, file=file) - return - - size = self.get_argument_int("s", None) - - # Check if image should be resized - if size and file.is_bitmap_image(): - blob = file.get_thumbnail(size) - else: - blob = file.blob - - # Set headers - self.set_header("Content-Type", file.mimetype or "application/octet-stream") - self.set_header("Content-Length", len(blob)) - - # Set expires - self.set_expires(3600) - - # Deliver content - self.finish(blob) - - class PageHandler(base.BaseHandler): @property def action(self): -- 2.39.2