From a9d67bd9982533c3e42a9e8dcb61cbffc0e14945 Mon Sep 17 00:00:00 2001 From: Jordan Robinson Date: Wed, 17 Sep 2025 22:01:41 +0100 Subject: [PATCH] add new setting for auto markdown link formatting on paste in the editor --- ...18_user_markdown_link_paste_on_and_more.py | 23 ++++++++++++++ main/models.py | 5 ++++ main/templates/assets/markdown-paste-link.js | 30 +++++++++++++++++++ main/templates/main/page_form.html | 4 ++- main/templates/main/post_form.html | 4 ++- main/tests/test_users.py | 21 +++++++++++++ main/views/general.py | 1 + 7 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 main/migrations/0118_user_markdown_link_paste_on_and_more.py create mode 100644 main/templates/assets/markdown-paste-link.js diff --git a/main/migrations/0118_user_markdown_link_paste_on_and_more.py b/main/migrations/0118_user_markdown_link_paste_on_and_more.py new file mode 100644 index 0000000000000000000000000000000000000000..208bd18605b2e9c4fc9716f5f9fc9d7442a356e9 --- /dev/null +++ b/main/migrations/0118_user_markdown_link_paste_on_and_more.py @@ -0,0 +1,23 @@ +# Generated by Django 5.2.5 on 2025-09-17 20:58 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('main', '0117_alter_reallysimplelicensing_license_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='user', + name='markdown_link_paste_on', + field=models.BooleanField(default=False, help_text='Enable/disable automatic markdown link formatting on paste.', verbose_name='Auto Markdown link formatting'), + ), + migrations.AlterField( + model_name='user', + name='subscribe_note', + field=models.CharField(blank=True, default='Subscribe via [RSS](/rss/) / [Atom](/atom/) / [via Email](/newsletter/).', help_text='Default: Subscribe via [RSS](/rss/) / [Atom](/atom/) / [via Email](/newsletter/).', max_length=350, null=True), + ), + ] diff --git a/main/models.py b/main/models.py index c6acf3a3667d4c9802877d69738ab48d3d6b7b09..b2603f0e8118007d428139ec592bfead25292e05 100644 --- a/main/models.py +++ b/main/models.py @@ -156,6 +156,11 @@ class User(AbstractUser): verbose_name="Webring next URL", help_text="URL for your webring's next website.", ) + markdown_link_paste_on = models.BooleanField( + default=False, + help_text="Enable/disable automatic markdown link formatting on paste.", + verbose_name="Auto Markdown link formatting", + ) # billing stripe_customer_id = models.CharField(max_length=100, blank=True, null=True) diff --git a/main/templates/assets/markdown-paste-link.js b/main/templates/assets/markdown-paste-link.js new file mode 100644 index 0000000000000000000000000000000000000000..cb6f75ee5777eaf6e5317fc071323db6b916bcfe --- /dev/null +++ b/main/templates/assets/markdown-paste-link.js @@ -0,0 +1,30 @@ +// get body element, used for paste into it +var bodyElem = document.querySelector('textarea[name="body"]'); + +function formatOnPaste(event) { + const clipboardData = event.clipboardData || window.clipboardData; + const pastedData = clipboardData.getData('text'); + + const bodyElem = document.querySelector('textarea[name="body"]'); + + const start = bodyElem.selectionStart; + const end = bodyElem.selectionEnd; + + if (start !== end) { + event.preventDefault(); // Stop the default paste + + const selectedText = bodyElem.value.substring(start, end); + const before = bodyElem.value.substring(0, start); + const after = bodyElem.value.substring(end); + + const markdownLink = `[${selectedText}](${pastedData})`; + + bodyElem.value = before + markdownLink + after; + + // Move cursor after inserted markdown + const newCursorPosition = before.length + markdownLink.length; + bodyElem.setSelectionRange(newCursorPosition, newCursorPosition); + } +} + +bodyElem.addEventListener('paste', formatOnPaste); \ No newline at end of file diff --git a/main/templates/main/page_form.html b/main/templates/main/page_form.html index 0eba5d845cdc98756d44e7167abb34da43546092..fd4b76518d2f5d4960e439a51fb780cdaca66444 100644 --- a/main/templates/main/page_form.html +++ b/main/templates/main/page_form.html @@ -64,7 +64,9 @@ {% endblock scripts %} diff --git a/main/templates/main/post_form.html b/main/templates/main/post_form.html index f1e4601f3459f446f45597665eb434d7c9dbbd5d..ed463f4752864626e60d3fbc0848b0e16c51161e 100644 --- a/main/templates/main/post_form.html +++ b/main/templates/main/post_form.html @@ -82,7 +82,9 @@