From 2fdff679f551a72ce484d79fc522c3fd564cba7f Mon Sep 17 00:00:00 2001 From: Marcus Date: Wed, 24 Dec 2025 20:43:35 -0600 Subject: [PATCH] Mastodon Comments Activate. I'll need to actually post about my blog to mastodon to use it but I'll start soon I think. --- content/posts/urchin.md | 34 ++++ layouts/_default/single.html | 2 + layouts/partials/mastodon-comments.html | 77 ++++++++ layouts/shortcodes/imdbposter.html | 20 +- scripts/import_letterboxd.py | 239 +++++++++++++++++++++--- static/css/mastodon-comments.css | 213 +++++++++++++++++++++ static/images/posters/urchin.jpg | Bin 0 -> 63765 bytes static/js/mastodon-comments.js | 141 ++++++++++++++ static/js/purify.min.js | 3 + 9 files changed, 692 insertions(+), 37 deletions(-) create mode 100644 content/posts/urchin.md create mode 100644 layouts/partials/mastodon-comments.html create mode 100644 static/css/mastodon-comments.css create mode 100644 static/images/posters/urchin.jpg create mode 100644 static/js/mastodon-comments.js create mode 100644 static/js/purify.min.js diff --git a/content/posts/urchin.md b/content/posts/urchin.md new file mode 100644 index 0000000..34e258b --- /dev/null +++ b/content/posts/urchin.md @@ -0,0 +1,34 @@ +--- +title: 'Urchin' +date: 2025-12-25T01:53:05Z +draft: true +series: "Frank's Couch" +summary: "" +imdb: "tt35715953" +poster: "/images/posters/urchin.jpg" +tags: + - gucci + - ghost theater + - marcel + - amc-south + - amc-lakeline + - anticipated + - no-expectations + - had pizza +--- +{{< imdbposter >}} + +| Date watched | December 14, 2025 | +|---------------------|-------------------| +| Show Time | | +| Theater | | +| Theater Number | | +| Pizza | | +| Tickets | | +| Letterboxd Rating | ***** (5.0) | +| Crew | | + +{{< /imdbposter >}} + +Write your review here... + diff --git a/layouts/_default/single.html b/layouts/_default/single.html index c64780a..3ded598 100644 --- a/layouts/_default/single.html +++ b/layouts/_default/single.html @@ -9,6 +9,8 @@ {{ if or (.Site.Params.remark42) (.Site.Config.Services.Disqus.Shortname) }} {{ partial "post/comments.html" . }} {{ end }} + {{/* Mastodon comments - shows if mastodon_id is set in front matter */}} + {{ partial "mastodon-comments.html" . }} {{- if .Site.Params.goatcounter }} {{ partial "analytics.html" . -}} {{- end}} diff --git a/layouts/partials/mastodon-comments.html b/layouts/partials/mastodon-comments.html new file mode 100644 index 0000000..5f14889 --- /dev/null +++ b/layouts/partials/mastodon-comments.html @@ -0,0 +1,77 @@ +{{/* + Mastodon Comments Partial + + Displays comments from a Mastodon post. Requires mastodon_id in front matter. + Comment count is fetched at build time; full comments load on button click. + + Inspired by: https://andreas.scherbaum.la/post/2024-05-23_client-side-comments-with-mastodon-on-a-static-hugo-website/ + And the vibes of: I Saw the TV Glow +*/}} + +{{- $host := "tilde.zone" -}} +{{- $username := "mnw" -}} + +{{- if .Params.mastodon_id -}} +{{- $id := .Params.mastodon_id -}} + +{{/* Fetch comment count at build time */}} +{{- $count := 0 -}} +{{- $apiUrl := printf "https://%s/api/v1/statuses/%s/context" $host $id -}} +{{- with resources.GetRemote $apiUrl -}} + {{- if .Err -}} + {{/* API error - show 0 */}} + {{- else -}} + {{- $data := .Content | transform.Unmarshal -}} + {{- if $data.descendants -}} + {{- $count = len $data.descendants -}} + {{- end -}} + {{- end -}} +{{- end -}} + +{{/* Build blocklist from front matter */}} +{{- $blocked := slice -}} +{{- if .Params.mastodon_blocked -}} + {{- $blocked = .Params.mastodon_blocked -}} +{{- end -}} + +
+
/* ================================================== */
+/*                     COMMENTS                       */
+/*         via the fediverse / tilde.zone             */
+/* ================================================== */
+ + + +

+ ++ TRANSMISSION RECEIVED ++
+ Reply to this post on Mastodon to join the discussion. +

+ +
+ +
+ +

+ // comments loaded from {{ $host }} when you click the button +

+
+ + + + + + +{{- end -}} diff --git a/layouts/shortcodes/imdbposter.html b/layouts/shortcodes/imdbposter.html index b4a647c..30fae84 100644 --- a/layouts/shortcodes/imdbposter.html +++ b/layouts/shortcodes/imdbposter.html @@ -28,20 +28,16 @@ {{- end -}} {{- if or $year $runtime $director -}}
- {{- if or $year $runtime -}} -
- {{- if $year -}}{{ $year }}{{- end -}} - {{- if and $year $runtime -}} · {{- end -}} - {{- if $runtime -}}{{ $runtime }} min{{- end -}} -
- {{- end -}} {{- if $director -}}
- Directed by {{- if reflect.IsSlice $director -}} - {{ delimit $director ", " }} - {{- else -}} - {{ $director }} - {{- end -}} + Directed by {{ if reflect.IsSlice $director }}{{ delimit $director ", " }}{{ else }}{{ $director }}{{ end }} +
+ {{- end -}} + {{- if or $year $runtime -}} +
+ {{- if $year }}{{ $year }}{{ end -}} + {{- if and $year $runtime }} · {{ end -}} + {{- if $runtime }}{{ $runtime }} min{{ end -}}
{{- end -}}
diff --git a/scripts/import_letterboxd.py b/scripts/import_letterboxd.py index ddbf3da..b5a813d 100755 --- a/scripts/import_letterboxd.py +++ b/scripts/import_letterboxd.py @@ -6,13 +6,18 @@ Usage: python scripts/import_letterboxd.py # Interactive mode - pick from recent python scripts/import_letterboxd.py --latest # Import most recent entry python scripts/import_letterboxd.py --list # Just list recent entries + python scripts/import_letterboxd.py --theater # Skip to theater questions + python scripts/import_letterboxd.py --home # Skip to home video questions + +The script will prompt for viewing details (theater vs home) and pre-fill +the front matter table accordingly. """ import argparse import os import re import sys -from datetime import datetime +from datetime import datetime, timezone from pathlib import Path from urllib.parse import urlparse import xml.etree.ElementTree as ET @@ -129,7 +134,124 @@ def rating_to_stars(rating): return f"{stars} ({rating})" -def create_draft_post(movie, tmdb_details, poster_url): +def prompt_viewing_details(): + """Prompt user for viewing location details.""" + print("\nWhere did you watch this?") + print(" 1. Theater") + print(" 2. Home") + + while True: + choice = input("Enter 1 or 2: ").strip() + if choice == "1": + return prompt_theater_details() + elif choice == "2": + return prompt_home_details() + else: + print("Please enter 1 or 2") + + +def prompt_theater_details(): + """Prompt for theater-specific details.""" + print("\nWhich theater?") + theaters = [ + ("1", "Gucci", "gucci"), + ("2", "Ghost Theater", "ghost-theater"), + ("3", "Marcel", "marcel"), + ("4", "AMC South", "amc-south"), + ("5", "AMC Lakeline", "amc-lakeline"), + ("6", "Other", None), + ] + for num, name, _ in theaters: + print(f" {num}. {name}") + + theater_name = "" + theater_tag = None + while True: + choice = input("Enter number: ").strip() + for num, name, tag in theaters: + if choice == num: + if name == "Other": + theater_name = input("Theater name: ").strip() + else: + theater_name = name + theater_tag = tag + break + if theater_name: + break + print("Please enter a valid number") + + show_time = input("Show time (e.g. 7:30pm): ").strip() + theater_num = input("Theater number: ").strip() + pizza = input("Pizza? (Yes/No): ").strip() or "" + tickets = input("Tickets (e.g. 'At Box Office', 'A-List'): ").strip() + crew = input("Crew (e.g. 'Me, Coach T, Science Bro'): ").strip() + + return { + "type": "theater", + "theater": theater_name, + "theater_tag": theater_tag, + "show_time": show_time, + "theater_num": theater_num, + "pizza": pizza, + "tickets": tickets, + "crew": crew, + } + + +def prompt_home_details(): + """Prompt for home viewing details.""" + location = input("Location (e.g. 'Living Room', 'Woodrow Apt'): ").strip() or "Home" + show_time = input("Show time (optional, e.g. 'evening'): ").strip() + pizza = input("Pizza? (Yes/No): ").strip() or "No" + + # Media format + print("\nMedia format?") + media_options = [ + ("1", "Online"), + ("2", "BluRay"), + ("3", "DVD"), + ("4", "VHS"), + ] + for num, name in media_options: + print(f" {num}. {name}") + media = "Online" + media_choice = input("Enter number (default 1): ").strip() + for num, name in media_options: + if media_choice == num: + media = name + break + + # Screen type + print("\nScreen?") + screen_options = [ + ("1", "4k TV"), + ("2", "4k Computer"), + ("3", "1080p Computer"), + ("4", "Cell Phone"), + ("5", "Someone Elses TV"), + ] + for num, name in screen_options: + print(f" {num}. {name}") + screen = "4k TV" + screen_choice = input("Enter number (default 1): ").strip() + for num, name in screen_options: + if screen_choice == num: + screen = name + break + + return { + "type": "home", + "theater": "Home Video", + "theater_tag": "homevideo", + "show_time": show_time, + "theater_num": location, + "pizza": pizza, + "media": media, + "screen": screen, + } + + +def create_draft_post(movie, tmdb_details, poster_url, viewing_details=None): """Create a Hugo draft post for the movie.""" slug = slugify(movie["title"]) filename = f"{slug}.md" @@ -140,7 +262,7 @@ def create_draft_post(movie, tmdb_details, poster_url): return None # Format the date for Hugo - now = datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%SZ") + now = datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ") # Format watched date nicely watched = movie["watched_date"] @@ -156,6 +278,52 @@ def create_draft_post(movie, tmdb_details, poster_url): imdb_id = tmdb_details.get("imdb_id", "") rating_display = rating_to_stars(movie["rating"]) + # Use viewing details if provided, otherwise use empty defaults + if viewing_details: + show_time = viewing_details.get("show_time", "") + theater = viewing_details.get("theater", "") + theater_num = viewing_details.get("theater_num", "") + pizza = viewing_details.get("pizza", "") + is_home = viewing_details.get("type") == "home" + + # Build tags based on viewing type + tags = [] + if viewing_details.get("theater_tag"): + tags.append(viewing_details["theater_tag"]) + tags.extend(["no-expectations"]) + if pizza.lower() == "yes": + tags.append("had pizza") + tags_yaml = "\n".join(f" - {tag}" for tag in tags) + + # Different last two rows for home vs theater + if is_home: + row5_label = "Media" + row5_value = viewing_details.get("media", "") + row7_label = "Screen" + row7_value = viewing_details.get("screen", "") + else: + row5_label = "Tickets" + row5_value = viewing_details.get("tickets", "") + row7_label = "Crew" + row7_value = viewing_details.get("crew", "") + else: + show_time = "" + theater = "" + theater_num = "" + pizza = "" + row5_label = "Tickets" + row5_value = "" + row7_label = "Crew" + row7_value = "" + tags_yaml = """ - gucci + - ghost-theater + - marcel + - amc-south + - amc-lakeline + - anticipated + - no-expectations + - had pizza""" + # Build the frontmatter and content content = f'''--- title: '{movie["title"]}' @@ -166,26 +334,25 @@ summary: "" imdb: "{imdb_id}" poster: "{poster_url or ''}" tags: - - gucci - - ghost theater - - marcel - - amc-south - - amc-lakeline - - anticipated - - no-expectations - - had pizza +{tags_yaml} +# Mastodon comments: After posting about this on Mastodon, add the post ID below. +# Get the ID from the end of the toot URL, e.g. https://tilde.zone/@mnw/123456789 +# mastodon_id: "" +# To block a reply from showing, add its full URL to this list: +# mastodon_blocked: +# - "https://tilde.zone/@someone/123456789" --- {{{{< imdbposter >}}}} -| Date watched | {watched_display} | +| Date watched | {watched_display:<17} | |---------------------|-------------------| -| Show Time | | -| Theater | | -| Theater Number | | -| Pizza | | -| Tickets | | -| Letterboxd Rating | {rating_display} | -| Crew | | +| Show Time | {show_time:<17} | +| Theater | {theater:<17} | +| Theater Number | {theater_num:<17} | +| Pizza | {pizza:<17} | +| {row5_label:<19} | {row5_value:<17} | +| Letterboxd Rating | {rating_display:<17} | +| {row7_label:<19} | {row7_value:<17} | {{{{< /imdbposter >}}}} @@ -209,12 +376,25 @@ def display_movies(movies, limit=10): print() -def import_movie(movie): - """Import a single movie: fetch details, download poster, create post.""" +def import_movie(movie, viewing_mode=None): + """Import a single movie: fetch details, download poster, create post. + + Args: + movie: Movie data from Letterboxd RSS + viewing_mode: 'theater', 'home', or None (will prompt) + """ print(f"\nImporting: {movie['title']} ({movie['year']})") + # Get viewing details + if viewing_mode == "theater": + viewing_details = prompt_theater_details() + elif viewing_mode == "home": + viewing_details = prompt_home_details() + else: + viewing_details = prompt_viewing_details() + # Get TMDB details - print(" Fetching TMDB details...") + print("\n Fetching TMDB details...") tmdb = get_tmdb_details(movie["tmdb_id"]) # Download poster @@ -226,7 +406,7 @@ def import_movie(movie): # Create draft post print(" Creating draft post...") - filepath = create_draft_post(movie, tmdb, poster_url) + filepath = create_draft_post(movie, tmdb, poster_url, viewing_details) if filepath: print(f"\nDone! Edit your draft at: {filepath.relative_to(PROJECT_ROOT)}") @@ -241,8 +421,17 @@ def main(): parser.add_argument("--latest", action="store_true", help="Import most recent entry") parser.add_argument("--list", action="store_true", help="Just list recent entries") parser.add_argument("--count", type=int, default=10, help="Number of entries to show") + parser.add_argument("--theater", action="store_true", help="Skip viewing prompt, go straight to theater questions") + parser.add_argument("--home", action="store_true", help="Skip viewing prompt, go straight to home questions") args = parser.parse_args() + # Determine viewing mode from flags + viewing_mode = None + if args.theater: + viewing_mode = "theater" + elif args.home: + viewing_mode = "home" + print("Fetching Letterboxd RSS feed...") try: root = fetch_rss() @@ -260,7 +449,7 @@ def main(): sys.exit(0) if args.latest: - import_movie(movies[0]) + import_movie(movies[0], viewing_mode) sys.exit(0) # Interactive mode @@ -272,7 +461,7 @@ def main(): sys.exit(0) idx = int(choice) - 1 if 0 <= idx < len(movies): - import_movie(movies[idx]) + import_movie(movies[idx], viewing_mode) else: print("Invalid selection") sys.exit(1) diff --git a/static/css/mastodon-comments.css b/static/css/mastodon-comments.css new file mode 100644 index 0000000..868e0c0 --- /dev/null +++ b/static/css/mastodon-comments.css @@ -0,0 +1,213 @@ +/** + * Mastodon Comments Stylesheet + * + * Teletype / Fax Machine / I Saw the TV Glow aesthetic + * Works with various Hugo themes + */ + +.mastodon-comments-section { + margin-top: 3rem; + padding-top: 2rem; + border-top: 2px dashed #888; + font-family: 'Courier New', Courier, monospace; +} + +.comments-header { + margin: 0 0 1.5rem 0; + padding: 0; + font-size: 0.85rem; + color: #888; + background: none; + border: none; + white-space: pre; + overflow-x: auto; +} + +.comments-intro { + font-size: 0.9rem; + margin-bottom: 1.5rem; + letter-spacing: 0.05em; +} + +.comments-intro a { + text-decoration: underline; +} + +.comments-note { + margin-top: 1rem; + color: #666; + font-size: 0.8rem; +} + +#mastodon-comments-list { + min-height: 50px; +} + +#load-comments-btn { + font-family: 'Courier New', Courier, monospace; + font-size: 1rem; + padding: 0.75rem 1.5rem; + background: transparent; + border: 2px solid currentColor; + cursor: pointer; + letter-spacing: 0.1em; + transition: all 0.2s ease; +} + +#load-comments-btn:hover { + background: #333; + color: #fff; +} + +.loading, +.no-comments, +.comments-received, +.comments-error { + padding: 1rem; + margin: 1rem 0; + background: #f5f5f5; + border-left: 4px solid #888; + font-size: 0.85rem; + white-space: pre-wrap; +} + +.comments-error { + border-left-color: #c00; + color: #900; +} + +.comments-received { + border-left-color: #080; + color: #060; +} + +/* Individual comment styling */ +.mastodon-comment { + margin: 1.5rem 0; + padding: 1rem; + background: #fafafa; + border: 1px solid #ddd; +} + +.mastodon-comment .comment-header pre { + margin: 0 0 0.75rem 0; + padding: 0; + font-size: 0.75rem; + color: #666; + background: none; + border: none; + white-space: pre; +} + +.mastodon-comment .comment-author { + display: flex; + align-items: center; + gap: 0.75rem; + margin-bottom: 0.75rem; +} + +.mastodon-comment .avatar { + width: 48px; + height: 48px; + border-radius: 4px; + border: 1px solid #ccc; +} + +.mastodon-comment .author-info { + display: flex; + flex-direction: column; +} + +.mastodon-comment .display-name { + font-weight: bold; + text-decoration: none; +} + +.mastodon-comment .display-name:hover { + text-decoration: underline; +} + +.mastodon-comment .handle { + font-size: 0.8rem; + color: #666; +} + +.mastodon-comment .emoji { + height: 18px; + width: 18px; + vertical-align: middle; +} + +.mastodon-comment .comment-content { + margin: 1rem 0; + line-height: 1.5; +} + +.mastodon-comment .comment-content p { + margin: 0.5rem 0; +} + +.mastodon-comment .comment-content a { + word-break: break-all; +} + +.mastodon-comment .comment-attachments { + margin: 1rem 0; +} + +.mastodon-comment .comment-attachments img, +.mastodon-comment .comment-attachments video { + max-width: 100%; + max-height: 300px; + border: 1px solid #ccc; +} + +.mastodon-comment .comment-meta { + font-size: 0.8rem; + color: #666; + margin-top: 0.75rem; + padding-top: 0.5rem; + border-top: 1px dashed #ccc; +} + +.mastodon-comment .comment-meta a { + text-decoration: none; + color: #666; +} + +.mastodon-comment .comment-meta a:hover { + text-decoration: underline; +} + +.mastodon-comment .replies { + color: #888; +} + +/* Dark mode support */ +@media (prefers-color-scheme: dark) { + .mastodon-comment { + background: #1a1a1a; + border-color: #444; + } + + .mastodon-comment .comment-header pre { + color: #888; + } + + .mastodon-comment .handle, + .mastodon-comment .comment-meta, + .mastodon-comment .comment-meta a { + color: #999; + } + + .loading, + .no-comments, + .comments-received { + background: #222; + } + + #load-comments-btn:hover { + background: #eee; + color: #000; + } +} diff --git a/static/images/posters/urchin.jpg b/static/images/posters/urchin.jpg new file mode 100644 index 0000000000000000000000000000000000000000..42484db5a031cfcadbc727bc0307a9676ae3e2e9 GIT binary patch literal 63765 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 NL4v5m6bk(_|Jl`&{7wJ> literal 0 HcmV?d00001 diff --git a/static/js/mastodon-comments.js b/static/js/mastodon-comments.js new file mode 100644 index 0000000..5c89312 --- /dev/null +++ b/static/js/mastodon-comments.js @@ -0,0 +1,141 @@ +/** + * Mastodon Comments Loader + * + * Fetches and displays replies to a Mastodon post. + * Uses DOMPurify for HTML sanitization. + * + * Inspired by Andreas Scherbaum's implementation. + * Aesthetic inspired by I Saw the TV Glow. + */ + +var commentsLoaded = false; + +function escapeHtml(unsafe) { + if (!unsafe) return ''; + return unsafe + .replace(/&/g, "&") + .replace(//g, ">") + .replace(/"/g, """) + .replace(/'/g, "'"); +} + +function formatDate(dateStr) { + var d = new Date(dateStr); + var year = d.getFullYear(); + var month = String(d.getMonth() + 1).padStart(2, '0'); + var day = String(d.getDate()).padStart(2, '0'); + var hours = String(d.getHours()).padStart(2, '0'); + var mins = String(d.getMinutes()).padStart(2, '0'); + return year + '-' + month + '-' + day + ' ' + hours + ':' + mins; +} + +function getUserHandle(account) { + var handle = '@' + account.acct; + if (account.acct.indexOf('@') === -1) { + var domain = new URL(account.url); + handle += '@' + domain.hostname; + } + return handle; +} + +function renderComment(toot, depth) { + // Skip blocked toots + if (blockedToots.includes(toot.url)) { + return ''; + } + + // Process display name with custom emojis + var displayName = escapeHtml(toot.account.display_name || toot.account.username); + toot.account.emojis.forEach(function(emoji) { + var emojiImg = ':' + emoji.shortcode + ':'; + displayName = displayName.replace(':' + emoji.shortcode + ':', emojiImg); + }); + + var indent = depth > 0 ? ' style="margin-left: ' + (depth * 20) + 'px; border-left: 2px dashed #666;"' : ''; + + var html = '
'; + html += '
'; + html += '
';
+  html += '/* ---------------------------------------- */\n';
+  html += '/* FROM: ' + getUserHandle(toot.account).padEnd(32) + ' */\n';
+  html += '/* DATE: ' + formatDate(toot.created_at).padEnd(32) + ' */\n';
+  html += '/* ---------------------------------------- */
'; + html += '
'; + + html += '
'; + html += ''; + html += '
'; + html += '' + displayName + ''; + html += '' + escapeHtml(getUserHandle(toot.account)) + ''; + html += '
'; + html += '
'; + + html += '
' + toot.content + '
'; + + // Media attachments + if (toot.media_attachments && toot.media_attachments.length > 0) { + html += '
'; + toot.media_attachments.forEach(function(attachment) { + if (attachment.type === 'image') { + html += '' + escapeHtml(attachment.description || 'attachment') + ''; + } else if (attachment.type === 'video' || attachment.type === 'gifv') { + html += ''; + } + }); + html += '
'; + } + + html += '
'; + html += '[VIEW ORIGINAL]'; + if (toot.replies_count > 0) { + html += ' [' + toot.replies_count + ' REPLIES]'; + } + html += '
'; + + html += '
'; + + return html; +} + +function renderComments(toots, parentId, depth) { + var html = ''; + var replies = toots + .filter(function(toot) { return toot.in_reply_to_id === parentId; }) + .sort(function(a, b) { return a.created_at.localeCompare(b.created_at); }); + + replies.forEach(function(toot) { + html += renderComment(toot, depth); + html += renderComments(toots, toot.id, depth + 1); + }); + + return html; +} + +function loadMastodonComments() { + if (commentsLoaded) return; + + var container = document.getElementById('mastodon-comments-list'); + container.innerHTML = '
\n++ ESTABLISHING CONNECTION TO ' + mastodonHost.toUpperCase() + ' ++\n++ PLEASE STAND BY ++\n
'; + + var apiUrl = 'https://' + mastodonHost + '/api/v1/statuses/' + mastodonId + '/context'; + + fetch(apiUrl) + .then(function(response) { + if (!response.ok) throw new Error('Network response was not ok'); + return response.json(); + }) + .then(function(data) { + if (data.descendants && data.descendants.length > 0) { + var html = '
\n++ TRANSMISSION COMPLETE ++\n++ ' + data.descendants.length + ' COMMENT(S) RECEIVED ++\n
'; + html += renderComments(data.descendants, mastodonId, 0); + container.innerHTML = DOMPurify.sanitize(html, { ADD_ATTR: ['target'] }); + } else { + container.innerHTML = '
\n++ NO COMMENTS RECEIVED ++\n++ BE THE FIRST TO RESPOND ++\n
'; + } + commentsLoaded = true; + }) + .catch(function(error) { + container.innerHTML = '
\n++ TRANSMISSION ERROR ++\n++ FAILED TO LOAD COMMENTS ++\n++ ERROR: ' + escapeHtml(error.message) + ' ++\n
'; + }); +} diff --git a/static/js/purify.min.js b/static/js/purify.min.js new file mode 100644 index 0000000..279d73a --- /dev/null +++ b/static/js/purify.min.js @@ -0,0 +1,3 @@ +/*! @license DOMPurify 3.3.1 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.3.1/LICENSE */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).DOMPurify=t()}(this,(function(){"use strict";const{entries:e,setPrototypeOf:t,isFrozen:n,getPrototypeOf:o,getOwnPropertyDescriptor:r}=Object;let{freeze:i,seal:a,create:l}=Object,{apply:c,construct:s}="undefined"!=typeof Reflect&&Reflect;i||(i=function(e){return e}),a||(a=function(e){return e}),c||(c=function(e,t){for(var n=arguments.length,o=new Array(n>2?n-2:0),r=2;r1?t-1:0),o=1;o1?n-1:0),r=1;r2&&void 0!==arguments[2]?arguments[2]:h;t&&t(e,null);let i=o.length;for(;i--;){let t=o[i];if("string"==typeof t){const e=r(t);e!==t&&(n(o)||(o[i]=e),t=e)}e[t]=!0}return e}function w(e){for(let t=0;t/gm),W=a(/\$\{[\w\W]*/gm),Y=a(/^data-[\-\w.\u00B7-\uFFFF]+$/),j=a(/^aria-[\-\w]+$/),X=a(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),q=a(/^(?:\w+script|data):/i),$=a(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),K=a(/^html$/i),V=a(/^[a-z][.\w]*(-[.\w]+)+$/i);var Z=Object.freeze({__proto__:null,ARIA_ATTR:j,ATTR_WHITESPACE:$,CUSTOM_ELEMENT:V,DATA_ATTR:Y,DOCTYPE_NAME:K,ERB_EXPR:G,IS_ALLOWED_URI:X,IS_SCRIPT_OR_DATA:q,MUSTACHE_EXPR:B,TMPLIT_EXPR:W});const J=1,Q=3,ee=7,te=8,ne=9,oe=function(){return"undefined"==typeof window?null:window};var re=function t(){let n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:oe();const o=e=>t(e);if(o.version="3.3.1",o.removed=[],!n||!n.document||n.document.nodeType!==ne||!n.Element)return o.isSupported=!1,o;let{document:r}=n;const a=r,c=a.currentScript,{DocumentFragment:s,HTMLTemplateElement:N,Node:D,Element:w,NodeFilter:B,NamedNodeMap:G=n.NamedNodeMap||n.MozNamedAttrMap,HTMLFormElement:W,DOMParser:Y,trustedTypes:j}=n,q=w.prototype,$=O(q,"cloneNode"),V=O(q,"remove"),re=O(q,"nextSibling"),ie=O(q,"childNodes"),ae=O(q,"parentNode");if("function"==typeof N){const e=r.createElement("template");e.content&&e.content.ownerDocument&&(r=e.content.ownerDocument)}let le,ce="";const{implementation:se,createNodeIterator:ue,createDocumentFragment:me,getElementsByTagName:pe}=r,{importNode:fe}=a;let de={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]};o.isSupported="function"==typeof e&&"function"==typeof ae&&se&&void 0!==se.createHTMLDocument;const{MUSTACHE_EXPR:he,ERB_EXPR:ge,TMPLIT_EXPR:Te,DATA_ATTR:ye,ARIA_ATTR:Ee,IS_SCRIPT_OR_DATA:Ae,ATTR_WHITESPACE:_e,CUSTOM_ELEMENT:be}=Z;let{IS_ALLOWED_URI:Se}=Z,Ne=null;const De=R({},[...v,...x,...L,...I,...U]);let Re=null;const we=R({},[...z,...P,...F,...H]);let Ce=Object.seal(l(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),Oe=null,ve=null;const xe=Object.seal(l(null,{tagCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeCheck:{writable:!0,configurable:!1,enumerable:!0,value:null}}));let Le=!0,ke=!0,Ie=!1,Me=!0,Ue=!1,ze=!0,Pe=!1,Fe=!1,He=!1,Be=!1,Ge=!1,We=!1,Ye=!0,je=!1,Xe=!0,qe=!1,$e={},Ke=null;const Ve=R({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]);let Ze=null;const Je=R({},["audio","video","img","source","image","track"]);let Qe=null;const et=R({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),tt="http://www.w3.org/1998/Math/MathML",nt="http://www.w3.org/2000/svg",ot="http://www.w3.org/1999/xhtml";let rt=ot,it=!1,at=null;const lt=R({},[tt,nt,ot],g);let ct=R({},["mi","mo","mn","ms","mtext"]),st=R({},["annotation-xml"]);const ut=R({},["title","style","font","a","script"]);let mt=null;const pt=["application/xhtml+xml","text/html"];let ft=null,dt=null;const ht=r.createElement("form"),gt=function(e){return e instanceof RegExp||e instanceof Function},Tt=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(!dt||dt!==e){if(e&&"object"==typeof e||(e={}),e=C(e),mt=-1===pt.indexOf(e.PARSER_MEDIA_TYPE)?"text/html":e.PARSER_MEDIA_TYPE,ft="application/xhtml+xml"===mt?g:h,Ne=_(e,"ALLOWED_TAGS")?R({},e.ALLOWED_TAGS,ft):De,Re=_(e,"ALLOWED_ATTR")?R({},e.ALLOWED_ATTR,ft):we,at=_(e,"ALLOWED_NAMESPACES")?R({},e.ALLOWED_NAMESPACES,g):lt,Qe=_(e,"ADD_URI_SAFE_ATTR")?R(C(et),e.ADD_URI_SAFE_ATTR,ft):et,Ze=_(e,"ADD_DATA_URI_TAGS")?R(C(Je),e.ADD_DATA_URI_TAGS,ft):Je,Ke=_(e,"FORBID_CONTENTS")?R({},e.FORBID_CONTENTS,ft):Ve,Oe=_(e,"FORBID_TAGS")?R({},e.FORBID_TAGS,ft):C({}),ve=_(e,"FORBID_ATTR")?R({},e.FORBID_ATTR,ft):C({}),$e=!!_(e,"USE_PROFILES")&&e.USE_PROFILES,Le=!1!==e.ALLOW_ARIA_ATTR,ke=!1!==e.ALLOW_DATA_ATTR,Ie=e.ALLOW_UNKNOWN_PROTOCOLS||!1,Me=!1!==e.ALLOW_SELF_CLOSE_IN_ATTR,Ue=e.SAFE_FOR_TEMPLATES||!1,ze=!1!==e.SAFE_FOR_XML,Pe=e.WHOLE_DOCUMENT||!1,Be=e.RETURN_DOM||!1,Ge=e.RETURN_DOM_FRAGMENT||!1,We=e.RETURN_TRUSTED_TYPE||!1,He=e.FORCE_BODY||!1,Ye=!1!==e.SANITIZE_DOM,je=e.SANITIZE_NAMED_PROPS||!1,Xe=!1!==e.KEEP_CONTENT,qe=e.IN_PLACE||!1,Se=e.ALLOWED_URI_REGEXP||X,rt=e.NAMESPACE||ot,ct=e.MATHML_TEXT_INTEGRATION_POINTS||ct,st=e.HTML_INTEGRATION_POINTS||st,Ce=e.CUSTOM_ELEMENT_HANDLING||{},e.CUSTOM_ELEMENT_HANDLING&>(e.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(Ce.tagNameCheck=e.CUSTOM_ELEMENT_HANDLING.tagNameCheck),e.CUSTOM_ELEMENT_HANDLING&>(e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(Ce.attributeNameCheck=e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),e.CUSTOM_ELEMENT_HANDLING&&"boolean"==typeof e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements&&(Ce.allowCustomizedBuiltInElements=e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),Ue&&(ke=!1),Ge&&(Be=!0),$e&&(Ne=R({},U),Re=[],!0===$e.html&&(R(Ne,v),R(Re,z)),!0===$e.svg&&(R(Ne,x),R(Re,P),R(Re,H)),!0===$e.svgFilters&&(R(Ne,L),R(Re,P),R(Re,H)),!0===$e.mathMl&&(R(Ne,I),R(Re,F),R(Re,H))),e.ADD_TAGS&&("function"==typeof e.ADD_TAGS?xe.tagCheck=e.ADD_TAGS:(Ne===De&&(Ne=C(Ne)),R(Ne,e.ADD_TAGS,ft))),e.ADD_ATTR&&("function"==typeof e.ADD_ATTR?xe.attributeCheck=e.ADD_ATTR:(Re===we&&(Re=C(Re)),R(Re,e.ADD_ATTR,ft))),e.ADD_URI_SAFE_ATTR&&R(Qe,e.ADD_URI_SAFE_ATTR,ft),e.FORBID_CONTENTS&&(Ke===Ve&&(Ke=C(Ke)),R(Ke,e.FORBID_CONTENTS,ft)),e.ADD_FORBID_CONTENTS&&(Ke===Ve&&(Ke=C(Ke)),R(Ke,e.ADD_FORBID_CONTENTS,ft)),Xe&&(Ne["#text"]=!0),Pe&&R(Ne,["html","head","body"]),Ne.table&&(R(Ne,["tbody"]),delete Oe.tbody),e.TRUSTED_TYPES_POLICY){if("function"!=typeof e.TRUSTED_TYPES_POLICY.createHTML)throw S('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if("function"!=typeof e.TRUSTED_TYPES_POLICY.createScriptURL)throw S('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');le=e.TRUSTED_TYPES_POLICY,ce=le.createHTML("")}else void 0===le&&(le=function(e,t){if("object"!=typeof e||"function"!=typeof e.createPolicy)return null;let n=null;const o="data-tt-policy-suffix";t&&t.hasAttribute(o)&&(n=t.getAttribute(o));const r="dompurify"+(n?"#"+n:"");try{return e.createPolicy(r,{createHTML:e=>e,createScriptURL:e=>e})}catch(e){return console.warn("TrustedTypes policy "+r+" could not be created."),null}}(j,c)),null!==le&&"string"==typeof ce&&(ce=le.createHTML(""));i&&i(e),dt=e}},yt=R({},[...x,...L,...k]),Et=R({},[...I,...M]),At=function(e){f(o.removed,{element:e});try{ae(e).removeChild(e)}catch(t){V(e)}},_t=function(e,t){try{f(o.removed,{attribute:t.getAttributeNode(e),from:t})}catch(e){f(o.removed,{attribute:null,from:t})}if(t.removeAttribute(e),"is"===e)if(Be||Ge)try{At(t)}catch(e){}else try{t.setAttribute(e,"")}catch(e){}},bt=function(e){let t=null,n=null;if(He)e=""+e;else{const t=T(e,/^[\r\n\t ]+/);n=t&&t[0]}"application/xhtml+xml"===mt&&rt===ot&&(e=''+e+"");const o=le?le.createHTML(e):e;if(rt===ot)try{t=(new Y).parseFromString(o,mt)}catch(e){}if(!t||!t.documentElement){t=se.createDocument(rt,"template",null);try{t.documentElement.innerHTML=it?ce:o}catch(e){}}const i=t.body||t.documentElement;return e&&n&&i.insertBefore(r.createTextNode(n),i.childNodes[0]||null),rt===ot?pe.call(t,Pe?"html":"body")[0]:Pe?t.documentElement:i},St=function(e){return ue.call(e.ownerDocument||e,e,B.SHOW_ELEMENT|B.SHOW_COMMENT|B.SHOW_TEXT|B.SHOW_PROCESSING_INSTRUCTION|B.SHOW_CDATA_SECTION,null)},Nt=function(e){return e instanceof W&&("string"!=typeof e.nodeName||"string"!=typeof e.textContent||"function"!=typeof e.removeChild||!(e.attributes instanceof G)||"function"!=typeof e.removeAttribute||"function"!=typeof e.setAttribute||"string"!=typeof e.namespaceURI||"function"!=typeof e.insertBefore||"function"!=typeof e.hasChildNodes)},Dt=function(e){return"function"==typeof D&&e instanceof D};function Rt(e,t,n){u(e,(e=>{e.call(o,t,n,dt)}))}const wt=function(e){let t=null;if(Rt(de.beforeSanitizeElements,e,null),Nt(e))return At(e),!0;const n=ft(e.nodeName);if(Rt(de.uponSanitizeElement,e,{tagName:n,allowedTags:Ne}),ze&&e.hasChildNodes()&&!Dt(e.firstElementChild)&&b(/<[/\w!]/g,e.innerHTML)&&b(/<[/\w!]/g,e.textContent))return At(e),!0;if(e.nodeType===ee)return At(e),!0;if(ze&&e.nodeType===te&&b(/<[/\w]/g,e.data))return At(e),!0;if(!(xe.tagCheck instanceof Function&&xe.tagCheck(n))&&(!Ne[n]||Oe[n])){if(!Oe[n]&&Ot(n)){if(Ce.tagNameCheck instanceof RegExp&&b(Ce.tagNameCheck,n))return!1;if(Ce.tagNameCheck instanceof Function&&Ce.tagNameCheck(n))return!1}if(Xe&&!Ke[n]){const t=ae(e)||e.parentNode,n=ie(e)||e.childNodes;if(n&&t){for(let o=n.length-1;o>=0;--o){const r=$(n[o],!0);r.__removalCount=(e.__removalCount||0)+1,t.insertBefore(r,re(e))}}}return At(e),!0}return e instanceof w&&!function(e){let t=ae(e);t&&t.tagName||(t={namespaceURI:rt,tagName:"template"});const n=h(e.tagName),o=h(t.tagName);return!!at[e.namespaceURI]&&(e.namespaceURI===nt?t.namespaceURI===ot?"svg"===n:t.namespaceURI===tt?"svg"===n&&("annotation-xml"===o||ct[o]):Boolean(yt[n]):e.namespaceURI===tt?t.namespaceURI===ot?"math"===n:t.namespaceURI===nt?"math"===n&&st[o]:Boolean(Et[n]):e.namespaceURI===ot?!(t.namespaceURI===nt&&!st[o])&&!(t.namespaceURI===tt&&!ct[o])&&!Et[n]&&(ut[n]||!yt[n]):!("application/xhtml+xml"!==mt||!at[e.namespaceURI]))}(e)?(At(e),!0):"noscript"!==n&&"noembed"!==n&&"noframes"!==n||!b(/<\/no(script|embed|frames)/i,e.innerHTML)?(Ue&&e.nodeType===Q&&(t=e.textContent,u([he,ge,Te],(e=>{t=y(t,e," ")})),e.textContent!==t&&(f(o.removed,{element:e.cloneNode()}),e.textContent=t)),Rt(de.afterSanitizeElements,e,null),!1):(At(e),!0)},Ct=function(e,t,n){if(Ye&&("id"===t||"name"===t)&&(n in r||n in ht))return!1;if(ke&&!ve[t]&&b(ye,t));else if(Le&&b(Ee,t));else if(xe.attributeCheck instanceof Function&&xe.attributeCheck(t,e));else if(!Re[t]||ve[t]){if(!(Ot(e)&&(Ce.tagNameCheck instanceof RegExp&&b(Ce.tagNameCheck,e)||Ce.tagNameCheck instanceof Function&&Ce.tagNameCheck(e))&&(Ce.attributeNameCheck instanceof RegExp&&b(Ce.attributeNameCheck,t)||Ce.attributeNameCheck instanceof Function&&Ce.attributeNameCheck(t,e))||"is"===t&&Ce.allowCustomizedBuiltInElements&&(Ce.tagNameCheck instanceof RegExp&&b(Ce.tagNameCheck,n)||Ce.tagNameCheck instanceof Function&&Ce.tagNameCheck(n))))return!1}else if(Qe[t]);else if(b(Se,y(n,_e,"")));else if("src"!==t&&"xlink:href"!==t&&"href"!==t||"script"===e||0!==E(n,"data:")||!Ze[e]){if(Ie&&!b(Ae,y(n,_e,"")));else if(n)return!1}else;return!0},Ot=function(e){return"annotation-xml"!==e&&T(e,be)},vt=function(e){Rt(de.beforeSanitizeAttributes,e,null);const{attributes:t}=e;if(!t||Nt(e))return;const n={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:Re,forceKeepAttr:void 0};let r=t.length;for(;r--;){const i=t[r],{name:a,namespaceURI:l,value:c}=i,s=ft(a),m=c;let f="value"===a?m:A(m);if(n.attrName=s,n.attrValue=f,n.keepAttr=!0,n.forceKeepAttr=void 0,Rt(de.uponSanitizeAttribute,e,n),f=n.attrValue,!je||"id"!==s&&"name"!==s||(_t(a,e),f="user-content-"+f),ze&&b(/((--!?|])>)|<\/(style|title|textarea)/i,f)){_t(a,e);continue}if("attributename"===s&&T(f,"href")){_t(a,e);continue}if(n.forceKeepAttr)continue;if(!n.keepAttr){_t(a,e);continue}if(!Me&&b(/\/>/i,f)){_t(a,e);continue}Ue&&u([he,ge,Te],(e=>{f=y(f,e," ")}));const d=ft(e.nodeName);if(Ct(d,s,f)){if(le&&"object"==typeof j&&"function"==typeof j.getAttributeType)if(l);else switch(j.getAttributeType(d,s)){case"TrustedHTML":f=le.createHTML(f);break;case"TrustedScriptURL":f=le.createScriptURL(f)}if(f!==m)try{l?e.setAttributeNS(l,a,f):e.setAttribute(a,f),Nt(e)?At(e):p(o.removed)}catch(t){_t(a,e)}}else _t(a,e)}Rt(de.afterSanitizeAttributes,e,null)},xt=function e(t){let n=null;const o=St(t);for(Rt(de.beforeSanitizeShadowDOM,t,null);n=o.nextNode();)Rt(de.uponSanitizeShadowNode,n,null),wt(n),vt(n),n.content instanceof s&&e(n.content);Rt(de.afterSanitizeShadowDOM,t,null)};return o.sanitize=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=null,r=null,i=null,l=null;if(it=!e,it&&(e="\x3c!--\x3e"),"string"!=typeof e&&!Dt(e)){if("function"!=typeof e.toString)throw S("toString is not a function");if("string"!=typeof(e=e.toString()))throw S("dirty is not a string, aborting")}if(!o.isSupported)return e;if(Fe||Tt(t),o.removed=[],"string"==typeof e&&(qe=!1),qe){if(e.nodeName){const t=ft(e.nodeName);if(!Ne[t]||Oe[t])throw S("root node is forbidden and cannot be sanitized in-place")}}else if(e instanceof D)n=bt("\x3c!----\x3e"),r=n.ownerDocument.importNode(e,!0),r.nodeType===J&&"BODY"===r.nodeName||"HTML"===r.nodeName?n=r:n.appendChild(r);else{if(!Be&&!Ue&&!Pe&&-1===e.indexOf("<"))return le&&We?le.createHTML(e):e;if(n=bt(e),!n)return Be?null:We?ce:""}n&&He&&At(n.firstChild);const c=St(qe?e:n);for(;i=c.nextNode();)wt(i),vt(i),i.content instanceof s&&xt(i.content);if(qe)return e;if(Be){if(Ge)for(l=me.call(n.ownerDocument);n.firstChild;)l.appendChild(n.firstChild);else l=n;return(Re.shadowroot||Re.shadowrootmode)&&(l=fe.call(a,l,!0)),l}let m=Pe?n.outerHTML:n.innerHTML;return Pe&&Ne["!doctype"]&&n.ownerDocument&&n.ownerDocument.doctype&&n.ownerDocument.doctype.name&&b(K,n.ownerDocument.doctype.name)&&(m="\n"+m),Ue&&u([he,ge,Te],(e=>{m=y(m,e," ")})),le&&We?le.createHTML(m):m},o.setConfig=function(){Tt(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}),Fe=!0},o.clearConfig=function(){dt=null,Fe=!1},o.isValidAttribute=function(e,t,n){dt||Tt({});const o=ft(e),r=ft(t);return Ct(o,r,n)},o.addHook=function(e,t){"function"==typeof t&&f(de[e],t)},o.removeHook=function(e,t){if(void 0!==t){const n=m(de[e],t);return-1===n?void 0:d(de[e],n,1)[0]}return p(de[e])},o.removeHooks=function(e){de[e]=[]},o.removeAllHooks=function(){de={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}},o}();return re})); +//# sourceMappingURL=purify.min.js.map