]> git.ipfire.org Git - ipfire.org.git/commitdiff
wiki: Store all linked files in the database
authorMichael Tremer <michael.tremer@ipfire.org>
Wed, 20 Dec 2023 13:34:39 +0000 (13:34 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 20 Dec 2023 13:34:39 +0000 (13:34 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/backend/wiki.py

index 2e49980dbd5e31411ee4c5094664919423935a1c..949cd49508cb69f2c0516b647a0c47ad4e110342 100644 (file)
@@ -105,6 +105,9 @@ class Wiki(misc.Object):
                page = self._get_page("INSERT INTO wiki(page, author_uid, markdown, changes, address) \
                        VALUES(%s, %s, %s, %s, %s) RETURNING *", page, author.uid, content or None, changes, address)
 
+               # Store any linked files
+               page._store_linked_files()
+
                # Send email to all watchers
                page._send_watcher_emails(excludes=[author])
 
@@ -354,11 +357,17 @@ class Page(misc.Object):
 
                return renderer.html
 
+       # Linked Files
+
        @property
-       def images(self):
+       def files(self):
                renderer = self.backend.wiki.render(self.page, self.markdown)
 
-               return renderer.images
+               return renderer.files
+
+       def _store_linked_files(self):
+               self.db.executemany("INSERT INTO wiki_linked_files(page_id, path) \
+                       VALUES(%s, %s)", ((self.id, file) for file in self.files))
 
        @property
        def timestamp(self):
@@ -607,7 +616,7 @@ class WikiRenderer(misc.Object):
                # Markdown Renderer
                self.renderer = markdown.Markdown(
                        extensions=[
-                               ImageExtractorExtension(),
+                               LinkedFilesExtractorExtension(),
                                PrettyLinksExtension(),
                                "codehilite",
                                "fenced_code",
@@ -732,13 +741,13 @@ class WikiRenderer(misc.Object):
                return text
 
        @lazy_property
-       def images(self):
+       def files(self):
                """
-                       A list of all images that have been part of the rendered markup
+                       A list of all linked files that have been part of the rendered markup
                """
-               images = []
+               files = []
 
-               for url in self.renderer.images:
+               for url in self.renderer.files:
                        # Skip external images
                        if url.startswith("https://") or url.startswith("http://"):
                                continue
@@ -746,9 +755,9 @@ class WikiRenderer(misc.Object):
                        # Make the URL absolute
                        url = self.backend.wiki.make_path(self.path, url)
 
-                       images.append(url)
+                       files.append(url)
 
-               return images
+               return files
 
 
 class PrettyLinksExtension(markdown.extensions.Extension):
@@ -776,20 +785,20 @@ class CVELinksPreprocessor(markdown.preprocessors.Preprocessor):
                        yield self.regex.sub(r"[CVE-\1](https://cve.mitre.org/cgi-bin/cvename.cgi?name=\1)", line)
 
 
-class ImageExtractor(markdown.treeprocessors.Treeprocessor):
+class LinkedFilesExtractor(markdown.treeprocessors.Treeprocessor):
        """
-               Finds all images
+               Finds all Linked Files
        """
        def run(self, root):
-               self.md.images = []
+               self.md.files = []
 
                # Find all images and store the URLs
                for image in root.findall(".//img"):
                        src = image.get("src")
 
-                       self.md.images.append(src)
+                       self.md.files.append(src)
 
 
-class ImageExtractorExtension(markdown.extensions.Extension):
+class LinkedFilesExtractorExtension(markdown.extensions.Extension):
     def extendMarkdown(self, md):
-        md.treeprocessors.register(ImageExtractor(md), "image-extractor", 10)
+        md.treeprocessors.register(LinkedFilesExtractor(md), "linked-files-extractor", 10)