From c18d84c3fb5a34cceb6d1dac506fac5ebc739b20 Mon Sep 17 00:00:00 2001 From: lwark Date: Wed, 17 Sep 2025 10:03:23 -0500 Subject: [PATCH] Link preview working. --- src/wiki/forms.py | 6 +++ src/wiki/models/article.py | 11 ++++++ src/wiki/static/wiki/js/previewlink.js | 53 ++++++++++++++++++++++++++ src/wiki/templates/wiki/article.html | 5 +-- src/wiki/templates/wiki/base_site.html | 6 +++ src/wiki/templates/wiki/view.html | 2 +- src/wiki_main/settings.py | 2 + 7 files changed, 81 insertions(+), 4 deletions(-) create mode 100644 src/wiki/static/wiki/js/previewlink.js diff --git a/src/wiki/forms.py b/src/wiki/forms.py index 1b1cb58..92cdb67 100644 --- a/src/wiki/forms.py +++ b/src/wiki/forms.py @@ -234,6 +234,9 @@ class EditForm(forms.Form, SpamProtectionMixin): title = forms.CharField( label=_("Title"), ) + # preview_text = forms.CharField( + # label=_("Preview Text"), + # ) content = forms.CharField( label=_("Contents"), required=False ) # @UndefinedVariable @@ -390,6 +393,9 @@ class CreateForm(forms.Form, SpamProtectionMixin): ), max_length=models.URLPath.SLUG_MAX_LENGTH, ) + # preview_text = forms.CharField( + # label=_("Preview Text"), + # ) content = forms.CharField( label=_("Contents"), required=False, widget=getEditor().get_widget() ) # @UndefinedVariable diff --git a/src/wiki/models/article.py b/src/wiki/models/article.py index a1018cd..9ba6b1b 100644 --- a/src/wiki/models/article.py +++ b/src/wiki/models/article.py @@ -415,6 +415,17 @@ class ArticleRevision(BaseRevisionMixin, models.Model): ), ) + # preview_text = models.CharField( + # max_length=1024, + # verbose_name=_("preview text"), + # null=False, + # blank=False, + # default="", + # help_text=( + # "Please fill out the preview text." + # ) + # ) + # TODO: # Allow a revision to redirect to another *article*. This # way, we can have redirects and still maintain old content. diff --git a/src/wiki/static/wiki/js/previewlink.js b/src/wiki/static/wiki/js/previewlink.js new file mode 100644 index 0000000..810c141 --- /dev/null +++ b/src/wiki/static/wiki/js/previewlink.js @@ -0,0 +1,53 @@ +/** + * Creates a link preview of a specific div from the target URL when a link is hovered. + * @param {string} linkSelector - CSS selector for the links to preview. + * @param {string} divSelector - CSS selector for the div to extract from the target page. + */ + +function setupLinkPreview(linkSelector, divSelector) { + const preview = document.createElement('div'); + preview.style.position = 'absolute'; + preview.style.border = '1px solid #ccc'; + preview.style.width = '400px'; + preview.style.height = '300px'; + preview.style.overflow = 'auto'; + preview.style.zIndex = '9999'; + preview.style.display = 'none'; + preview.style.backgroundColor = '#fff'; + preview.style.boxShadow = '0 0 10px rgba(0,0,0,0.2)'; + preview.style.padding = '10px'; + document.body.appendChild(preview); + const links = document.querySelectorAll(linkSelector); + links.forEach(link => { + link.addEventListener('mouseover', async (e) => { + try { + const response = await fetch(link.href); + const html = await response.text(); + const parser = new DOMParser(); + const doc = parser.parseFromString(html, 'text/html'); + const targetDiv = doc.querySelector(divSelector); + if (targetDiv) { + preview.innerHTML = targetDiv.innerHTML; + preview.style.display = 'block'; + preview.style.left = `${e.pageX + 10}px`; + preview.style.top = `${e.pageY + 10}px`; + } else { + preview.innerHTML = '

Target div not found.

'; + preview.style.display = 'block'; + } + } catch (error) { + preview.innerHTML = '

Failed to load preview.

'; + preview.style.display = 'block'; + } + }); + + link.addEventListener('mouseout', () => { + preview.style.display = 'none'; + preview.innerHTML = ''; + }); + }); +} + +// Example usage: +// Call this function after the DOM is loaded. +// setupLinkPreview('a.external-link', '#target-div'); diff --git a/src/wiki/templates/wiki/article.html b/src/wiki/templates/wiki/article.html index f6614b8..10f7e54 100644 --- a/src/wiki/templates/wiki/article.html +++ b/src/wiki/templates/wiki/article.html @@ -1,6 +1,5 @@ {% extends "wiki/base.html" %} -{% load wiki_tags i18n sekizai_tags %} - +{% load wiki_tags i18n sekizai_tags static %} {% block wiki_pagetitle %}{{ article.current_revision.title }}{% endblock %} @@ -9,7 +8,7 @@ {% endblock %} {% block wiki_contents %} - +