]> git.ipfire.org Git - ipfire.org.git/commitdiff
wiki: Embed the current version of an image
authorMichael Tremer <michael.tremer@ipfire.org>
Wed, 20 Dec 2023 15:29:11 +0000 (15:29 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 20 Dec 2023 15:29:11 +0000 (15:29 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/backend/wiki.py

index 8d7601355e5019789b4760ae05d855e09c7861e2..117b72cd2392e5d0adc66b6bc3ed9fdb675d2679 100644 (file)
@@ -363,8 +363,8 @@ class Wiki(misc.Object):
                        """, path, filename, author.uid, address, mimetype, blob.id, len(data),
                )
 
-       def render(self, path, text):
-               return WikiRenderer(self.backend, path, text)
+       def render(self, path, text, **kwargs):
+               return WikiRenderer(self.backend, path, text, **kwargs)
 
 
 class Page(misc.Object):
@@ -456,7 +456,7 @@ class Page(misc.Object):
 
                        lines.append(line)
 
-               renderer = self.backend.wiki.render(self.page, "\n".join(lines))
+               renderer = self.backend.wiki.render(self.page, "\n".join(lines), revision=self.timestamp)
 
                return renderer.html
 
@@ -464,7 +464,7 @@ class Page(misc.Object):
 
        @property
        def files(self):
-               renderer = self.backend.wiki.render(self.page, self.markdown)
+               renderer = self.backend.wiki.render(self.page, self.markdown, revision=self.timestamp)
 
                return renderer.files
 
@@ -631,6 +631,8 @@ class File(misc.Object):
        def created_at(self):
                return self.data.created_at
 
+       timestamp = created_at
+
        def delete(self, author=None):
                if not self.can_be_deleted():
                        raise RuntimeError("Cannot delete %s" % self)
@@ -748,10 +750,13 @@ class WikiRenderer(misc.Object):
        # Images
        _images = re.compile(r"<img alt(?:=\"(.*?)\")? src=\"(.*?)\" (?:title=\"(.*?)\" )?/>")
 
-       def init(self, path, text):
+       def init(self, path, text, revision=None):
                self.path = path
                self.text = text
 
+               # Optionally, the revision of the rendered page
+               self.revision = revision
+
                # Markdown Renderer
                self.renderer = markdown.Markdown(
                        extensions=[
@@ -828,7 +833,7 @@ class WikiRenderer(misc.Object):
                """
 
                # Skip any absolute and external URLs
-               if url.startswith("/") or url.startswith("https://") or url.startswith("http://"):
+               if url.startswith("https://") or url.startswith("http://"):
                        return html % {
                                "caption"   : caption or "",
                                "id"        : id,
@@ -843,10 +848,10 @@ class WikiRenderer(misc.Object):
                args = urllib.parse.parse_qs(qs)
 
                # Build absolute path
-               plain_url = url = self.backend.wiki.make_path(self.path, url)
+               url = self.backend.wiki.make_path(self.path, url)
 
                # Find image
-               file = self.backend.wiki.get_file_by_path(url)
+               file = self.backend.wiki.get_file_by_path(url, revision=self.revision)
                if not file or not file.is_image():
                        return "<!-- Could not find image %s in %s -->" % (url, self.path)
 
@@ -854,15 +859,15 @@ class WikiRenderer(misc.Object):
                if "s" in args:
                        del args["s"]
 
-               # Append arguments to the URL
-               if args:
-                       url = "%s?%s" % (url, urllib.parse.urlencode(args))
+               # Link the image that has been the current version at the time of the page edit
+               if file:
+                       args["revision"] = file.timestamp
 
                return html % {
                        "caption"   : caption or "",
                        "id"        : id,
-                       "plain_url" : plain_url,
                        "url"       : url,
+                       "args"      : urllib.parse.urlencode(args),
                }
 
        def _render(self):