#!/usr/bin/python3
import difflib
+import hashlib
import logging
import os.path
import re
def _render_image(self, m):
alt_text, url, caption = m.groups()
+ # Compute a hash over the URL
+ h = hashlib.new("md5")
+ h.update(url.encode())
+ id = h.hexdigest()
+
html = """
<div class="columns is-centered">
<div class="column is-8">
- <figure class="image">
- <img src="/docs%s" alt="%s">
- <figcaption class="figure-caption">%s</figcaption>
+ <figure class="image modal-trigger" data-target="%(id)s">
+ <img src="/docs%(url)s" alt="%(caption)s">
+
+ <figcaption class="figure-caption">%(caption)s</figcaption>
</figure>
+
+ <div class="modal is-large" id="%(id)s">
+ <div class="modal-background"></div>
+
+ <div class="modal-content">
+ <p class="image">
+ <img src="/docs%(plain_url)s?s=1920" alt="%(caption)s"
+ loading="lazy">
+ </p>
+ </div>
+
+ <button class="modal-close is-large" aria-label="close"></button>
+ </div>
</div>
</div>
"""
# Skip any absolute and external URLs
if url.startswith("/") or url.startswith("https://") or url.startswith("http://"):
- return html % (url, alt_text, caption or "")
+ return html % {
+ "caption" : caption or "",
+ "id" : id,
+ "plain_url" : url,
+ "url" : url,
+ }
# Try to split query string
url, delimiter, qs = url.partition("?")
args = urllib.parse.parse_qs(qs)
# Build absolute path
- url = self.backend.wiki.make_path(self.path, url)
+ plain_url = url = self.backend.wiki.make_path(self.path, url)
# Find image
file = self.backend.wiki.get_file_by_path(url)
if args:
url = "%s?%s" % (url, urllib.parse.urlencode(args))
- return html % (url, caption, caption or "")
+ return html % {
+ "caption" : caption or "",
+ "id" : id,
+ "plain_url" : plain_url,
+ "url" : url,
+ }
def render(self, text):
logging.debug("Rendering %s" % self.path)
if (event.key === 'Esc' || event.key === 'Escape') {\r
closeDropdowns();\r
}\r
-});
\ No newline at end of file
+});\r
+\r
+// Modals\r
+document.addEventListener("DOMContentLoaded", () => {\r
+ function openModal($el) {\r
+ $el.classList.add("is-active");\r
+ }\r
+\r
+ function closeModal($el) {\r
+ $el.classList.remove("is-active");\r
+ }\r
+\r
+ function closeAllModals() {\r
+ (document.querySelectorAll(".modal") || []).forEach(($modal) => {\r
+ closeModal($modal);\r
+ });\r
+ }\r
+\r
+ // Add a click event on buttons to open a specific modal\r
+ (document.querySelectorAll(".modal-trigger") || []).forEach(($trigger) => {\r
+ const modal = $trigger.dataset.target;\r
+ const $target = document.getElementById(modal);\r
+\r
+ $trigger.addEventListener("click", () => {\r
+ openModal($target);\r
+ });\r
+ });\r
+\r
+ // Add a click event on various child elements to close the parent modal\r
+ (document.querySelectorAll(".modal-background, .modal-close, .modal-card-head .delete, .modal-card-foot .button") || []).forEach(($close) => {\r
+ const $target = $close.closest(".modal");\r
+\r
+ $close.addEventListener("click", (e) => {\r
+ closeModal($target);\r
+ });\r
+ });\r
+\r
+ // Add a keyboard event to close all modals\r
+ document.addEventListener("keydown", (event) => {\r
+ if (event.code === "Escape") {\r
+ closeAllModals();\r
+ }\r
+ });\r
+});\r