From: Michael Tremer Date: Wed, 20 Dec 2023 13:34:39 +0000 (+0000) Subject: wiki: Store all linked files in the database X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2ab2c7535e7eb944b55f9906788657a6253bdbe4;p=ipfire.org.git wiki: Store all linked files in the database Signed-off-by: Michael Tremer --- diff --git a/src/backend/wiki.py b/src/backend/wiki.py index 2e49980d..949cd495 100644 --- a/src/backend/wiki.py +++ b/src/backend/wiki.py @@ -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)