forked from mirrors/bookwyrm
Merge pull request #411 from mouse-reeve/markdown-refinement
Only parse mardown on outgoing activities
This commit is contained in:
commit
3f95f9257d
3 changed files with 26 additions and 24 deletions
|
@ -11,11 +11,10 @@ from django.core.files.base import ContentFile
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
from markdown import markdown
|
|
||||||
from bookwyrm import activitypub
|
from bookwyrm import activitypub
|
||||||
|
from bookwyrm.connectors import get_image
|
||||||
from bookwyrm.sanitize_html import InputHtmlParser
|
from bookwyrm.sanitize_html import InputHtmlParser
|
||||||
from bookwyrm.settings import DOMAIN
|
from bookwyrm.settings import DOMAIN
|
||||||
from bookwyrm.connectors import get_image
|
|
||||||
|
|
||||||
|
|
||||||
def validate_remote_id(value):
|
def validate_remote_id(value):
|
||||||
|
@ -401,16 +400,6 @@ class HtmlField(ActivitypubFieldMixin, models.TextField):
|
||||||
sanitizer.feed(value)
|
sanitizer.feed(value)
|
||||||
return sanitizer.get_output()
|
return sanitizer.get_output()
|
||||||
|
|
||||||
def to_python(self, value):# pylint: disable=no-self-use
|
|
||||||
''' process markdown before save '''
|
|
||||||
if not value:
|
|
||||||
return value
|
|
||||||
content = markdown(value)
|
|
||||||
# sanitize resulting html
|
|
||||||
sanitizer = InputHtmlParser()
|
|
||||||
sanitizer.feed(content)
|
|
||||||
return sanitizer.get_output()
|
|
||||||
|
|
||||||
class ArrayField(ActivitypubFieldMixin, DjangoArrayField):
|
class ArrayField(ActivitypubFieldMixin, DjangoArrayField):
|
||||||
''' activitypub-aware array field '''
|
''' activitypub-aware array field '''
|
||||||
def field_to_activity(self, value):
|
def field_to_activity(self, value):
|
||||||
|
|
|
@ -4,12 +4,14 @@ import re
|
||||||
from django.db import IntegrityError, transaction
|
from django.db import IntegrityError, transaction
|
||||||
from django.http import HttpResponseNotFound, JsonResponse
|
from django.http import HttpResponseNotFound, JsonResponse
|
||||||
from django.views.decorators.csrf import csrf_exempt
|
from django.views.decorators.csrf import csrf_exempt
|
||||||
|
from markdown import markdown
|
||||||
from requests import HTTPError
|
from requests import HTTPError
|
||||||
|
|
||||||
from bookwyrm import activitypub
|
from bookwyrm import activitypub
|
||||||
from bookwyrm import models
|
from bookwyrm import models
|
||||||
from bookwyrm.connectors import get_data, ConnectorException
|
from bookwyrm.connectors import get_data, ConnectorException
|
||||||
from bookwyrm.broadcast import broadcast
|
from bookwyrm.broadcast import broadcast
|
||||||
|
from bookwyrm.sanitize_html import InputHtmlParser
|
||||||
from bookwyrm.status import create_notification
|
from bookwyrm.status import create_notification
|
||||||
from bookwyrm.status import create_generated_note
|
from bookwyrm.status import create_generated_note
|
||||||
from bookwyrm.status import delete_status
|
from bookwyrm.status import delete_status
|
||||||
|
@ -241,20 +243,17 @@ def handle_status(user, form):
|
||||||
related_user=user,
|
related_user=user,
|
||||||
related_status=status
|
related_status=status
|
||||||
)
|
)
|
||||||
# add links
|
# add mentions
|
||||||
content = status.content
|
content = status.content
|
||||||
content = re.sub(
|
|
||||||
r'([^(href=")])(https?:\/\/([A-Za-z\.\-_\/]+' \
|
|
||||||
r'\.[A-Za-z]{2,}[A-Za-z\.\-_\/]+))',
|
|
||||||
r'\g<1><a href="\g<2>">\g<3></a>',
|
|
||||||
content)
|
|
||||||
for (username, url) in matches:
|
for (username, url) in matches:
|
||||||
content = re.sub(
|
content = re.sub(
|
||||||
r'%s([^@])' % username,
|
r'%s([^@])' % username,
|
||||||
r'<a href="%s">%s</a>\g<1>' % (url, username),
|
r'<a href="%s">%s</a>\g<1>' % (url, username),
|
||||||
content)
|
content)
|
||||||
|
if not isinstance(status, models.GeneratedNote):
|
||||||
status.content = content
|
status.content = to_markown(content)
|
||||||
|
if hasattr(status, 'quote'):
|
||||||
|
status.quote = to_markown(status.quote)
|
||||||
status.save()
|
status.save()
|
||||||
|
|
||||||
# notify reply parent or tagged users
|
# notify reply parent or tagged users
|
||||||
|
@ -273,6 +272,20 @@ def handle_status(user, form):
|
||||||
broadcast(user, remote_activity, software='other')
|
broadcast(user, remote_activity, software='other')
|
||||||
|
|
||||||
|
|
||||||
|
def to_markown(content):
|
||||||
|
''' catch links and convert to markdown '''
|
||||||
|
content = re.sub(
|
||||||
|
r'([^(href=")])(https?:\/\/([A-Za-z\.\-_\/]+' \
|
||||||
|
r'\.[A-Za-z]{2,}[A-Za-z\.\-_\/]+))',
|
||||||
|
r'\g<1><a href="\g<2>">\g<3></a>',
|
||||||
|
content)
|
||||||
|
content = markdown(content)
|
||||||
|
# sanitize resulting html
|
||||||
|
sanitizer = InputHtmlParser()
|
||||||
|
sanitizer.feed(content)
|
||||||
|
return sanitizer.get_output()
|
||||||
|
|
||||||
|
|
||||||
def handle_tag(user, tag):
|
def handle_tag(user, tag):
|
||||||
''' tag a book '''
|
''' tag a book '''
|
||||||
broadcast(user, tag.to_add_activity(user))
|
broadcast(user, tag.to_add_activity(user))
|
||||||
|
|
|
@ -262,8 +262,8 @@ class Incoming(TestCase):
|
||||||
status = models.Quotation.objects.get()
|
status = models.Quotation.objects.get()
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
status.remote_id, 'https://example.com/user/mouse/quotation/13')
|
status.remote_id, 'https://example.com/user/mouse/quotation/13')
|
||||||
self.assertEqual(status.quote, '<p>quote body</p>')
|
self.assertEqual(status.quote, 'quote body')
|
||||||
self.assertEqual(status.content, '<p>commentary</p>')
|
self.assertEqual(status.content, 'commentary')
|
||||||
self.assertEqual(status.user, self.local_user)
|
self.assertEqual(status.user, self.local_user)
|
||||||
self.assertEqual(models.Status.objects.count(), 2)
|
self.assertEqual(models.Status.objects.count(), 2)
|
||||||
|
|
||||||
|
@ -284,7 +284,7 @@ class Incoming(TestCase):
|
||||||
|
|
||||||
incoming.handle_create(activity)
|
incoming.handle_create(activity)
|
||||||
status = models.Status.objects.last()
|
status = models.Status.objects.last()
|
||||||
self.assertEqual(status.content, '<p>test content in note</p>')
|
self.assertEqual(status.content, 'test content in note')
|
||||||
self.assertEqual(status.mention_users.first(), self.local_user)
|
self.assertEqual(status.mention_users.first(), self.local_user)
|
||||||
self.assertTrue(
|
self.assertTrue(
|
||||||
models.Notification.objects.filter(user=self.local_user).exists())
|
models.Notification.objects.filter(user=self.local_user).exists())
|
||||||
|
@ -306,7 +306,7 @@ class Incoming(TestCase):
|
||||||
|
|
||||||
incoming.handle_create(activity)
|
incoming.handle_create(activity)
|
||||||
status = models.Status.objects.last()
|
status = models.Status.objects.last()
|
||||||
self.assertEqual(status.content, '<p>test content in note</p>')
|
self.assertEqual(status.content, 'test content in note')
|
||||||
self.assertEqual(status.reply_parent, self.status)
|
self.assertEqual(status.reply_parent, self.status)
|
||||||
self.assertTrue(
|
self.assertTrue(
|
||||||
models.Notification.objects.filter(user=self.local_user))
|
models.Notification.objects.filter(user=self.local_user))
|
||||||
|
|
Loading…
Reference in a new issue