diff --git a/contrib/frontends/django/nntpchan/nntpchan/frontend/templatetags/chanup.py b/contrib/frontends/django/nntpchan/nntpchan/frontend/templatetags/chanup.py
index 851a698..d0461ea 100644
--- a/contrib/frontends/django/nntpchan/nntpchan/frontend/templatetags/chanup.py
+++ b/contrib/frontends/django/nntpchan/nntpchan/frontend/templatetags/chanup.py
@@ -9,11 +9,12 @@ from nntpchan.frontend.models import Newsgroup, Post
import re
from urllib.parse import urlparse
+from html import unescape
register = template.Library()
re_postcite = re.compile('>> ?([0-9a-fA-F]+)')
-re_boardlink = re.compile('>>> ?([a-zA-Z0-9\.]+[a-zA-Z0-9])')
+re_boardlink = re.compile('>>> ?/([a-zA-Z0-9\.]+[a-zA-Z0-9])/')
re_redtext = re.compile('== ?(.+) ?==')
re_psytext = re.compile('@@ ?(.+) ?@@')
@@ -28,7 +29,7 @@ def greentext(text, esc):
return_text += '%s ' % esc ( line ) + '\n'
f = True
else:
- return_text += line + '\n'
+ return_text += esc(line) + '\n'
return return_text, f
def blocktext(text, esc, delim='', css='', tag='span'):
@@ -56,7 +57,7 @@ def postcite(text, esc):
filtered = False
for line in text.split('\n'):
for word in line.split(' '):
- match = re_postcite.match(word)
+ match = re_postcite.match(unescape(word))
if match:
posthash = match.groups()[0]
posts = Post.objects.filter(posthash__startswith=posthash)
@@ -78,7 +79,7 @@ def boardlink(text, esc):
filtered = False
for line in text.split('\n'):
for word in line.split(' '):
- match = re_boardlink.match(word)
+ match = re_boardlink.match(unescape(word))
if match:
name = match.groups()[0]
group = Newsgroup.objects.filter(name=name)
@@ -87,8 +88,6 @@ def boardlink(text, esc):
return_text += '%s ' % ( group[0].get_absolute_url(), esc(match.string ) )
else:
return_text += '%s ' % esc (match.string)
- elif filtered:
- return_text += word + ' '
else:
return_text += esc(word) + ' '
return_text += '\n'
@@ -112,36 +111,19 @@ def urlify(text, esc):
line_funcs = [
greentext,
redtext,
- postcite,
- boardlink,
urlify,
psytext,
codeblock,
+ postcite,
+ boardlink,
]
@register.filter(needs_autoescape=True, name='memepost')
def memepost(text, autoescape=True):
- if autoescape:
- esc = conditional_escape
- else:
- esc = lambda x : x
- return_text = text
-
- def doFilter(funcs, text, filter):
- """
- RECURSIVE FUNCTIONS ARE FUN :^DDDDDD
- """
- if len(funcs) == 1:
- t, filtered = funcs[0](text, lambda x : x)
- return t
- else:
- t, filtered = funcs[0](text, filter)
- if filtered:
- return doFilter(funcs[1:], t, lambda x : x)
- else:
- return doFilter(funcs[1:], t, filter)
-
- return mark_safe(doFilter(line_funcs, return_text, conditional_escape))
+ text, _ = line_funcs[0](text, conditional_escape)
+ for f in line_funcs[1:]:
+ text, _ = f(text, lambda x : x)
+ return mark_safe(text)
@register.filter(name='truncate')