Handle inline quotes

main
Bob Mottram 2025-12-02 13:02:26 +00:00
parent 9ad73fd6bb
commit f068628770
4 changed files with 50 additions and 4 deletions

View File

@ -189,6 +189,27 @@ def html_replace_email_quote(content: str) -> str:
return _remove_quotes_within_quotes(new_content)
def html_replace_inline_quotes(content: str) -> str:
"""Replaces inline quotes within content with quotation marks
"""
if '<p class="quote-inline">' not in content:
return content
sections = content.split('<p class="quote-inline">')
ctr = 0
new_content = ''
for section in sections:
if ctr == 0:
new_content = section
ctr += 1
continue
if '</p>' in section:
new_content += '<p>"' + section.replace('</p>', '"</p>', 1)
else:
new_content += section
ctr += 1
return new_content
def html_replace_quote_marks(content: str) -> str:
"""Replaces quotes with html formatting
"hello" becomes <q>hello</q>
@ -1384,6 +1405,7 @@ def add_html_tags(base_dir: str, http_prefix: str,
by matching against known following accounts
"""
if content.startswith('<p>'):
content = html_replace_inline_quotes(content)
content = html_replace_email_quote(content)
return html_replace_quote_marks(content)
max_word_length = 40
@ -1529,6 +1551,7 @@ def add_html_tags(base_dir: str, http_prefix: str,
content = remove_long_words(content, max_word_length, long_words_list)
content = limit_repeated_words(content, 6)
content = html_replace_email_quote(content)
content = html_replace_inline_quotes(content)
content = html_replace_quote_marks(content)
# undo replacements

View File

@ -31,6 +31,7 @@ from utils import acct_dir
from utils import local_actor_url
from utils import get_actor_from_post
from content import html_replace_quote_marks
from content import html_replace_inline_quotes
SPEAKER_REMOVE_CHARS = ('.\n', '. ', ',', ';', '?', '!')
@ -418,7 +419,8 @@ def speakable_text(http_prefix: str,
# replace some emoji before removing html
if ' <3' in content:
content = content.replace(' <3', ' ' + translate['heart'])
content = remove_html(html_replace_quote_marks(content))
content = remove_html(html_replace_inline_quotes(content))
content = html_replace_quote_marks(content)
detected_links: list[str] = []
content = speaker_replace_links(http_prefix,
nickname, domain, domain_full,
@ -459,7 +461,8 @@ def _post_to_speaker_json(base_dir: str, http_prefix: str,
# replace some emoji before removing html
if ' <3' in content:
content = content.replace(' <3', ' ' + translate['heart'])
content = remove_html(html_replace_quote_marks(content))
content = remove_html(html_replace_inline_quotes(content))
content = html_replace_quote_marks(content)
content = speaker_replace_links(http_prefix,
nickname, domain, domain_full,
content, translate, detected_links)

View File

@ -171,6 +171,7 @@ from content import limit_repeated_words
from content import switch_words
from content import extract_text_fields_in_post
from content import html_replace_email_quote
from content import html_replace_inline_quotes
from content import html_replace_quote_marks
from content import dangerous_css
from content import add_web_links
@ -4673,7 +4674,7 @@ def _test_danger_markup():
assert not dangerous_markup(content, allow_local_network_access, [])
def _run_html_replace_quote_marks():
def _test_html_replace_quote_marks():
print('html_replace_quote_marks')
test_str = 'The "cat" "sat" on the mat'
result = html_replace_quote_marks(test_str)
@ -4692,6 +4693,22 @@ def _run_html_replace_quote_marks():
assert result == '“hello” <a href="somesite.html">“test” html</a>'
def _test_html_replace_inline_quotes():
print('html_replace_inline_quotes')
test_str = 'The <p class="quote-inline">cat</p> ' + \
'<p class="quote-inline">sat</p> on the mat'
result = html_replace_inline_quotes(test_str)
assert result == 'The <p>"cat"</p> <p>"sat"</p> on the mat'
test_str = 'The cat sat on the mat'
result = html_replace_inline_quotes(test_str)
assert result == 'The cat sat on the mat'
test_str = '<p class="quote-inline">hello</p>'
result = html_replace_inline_quotes(test_str)
assert result == '<p>"hello"</p>'
def _test_json_post_allows_comment():
print('test_json_post_allows_comments')
post_json_object = {
@ -9662,7 +9679,8 @@ def run_all_tests():
_test_valid_content_warning()
_test_remove_id_ending()
_test_json_post_allows_comment()
_run_html_replace_quote_marks()
_test_html_replace_inline_quotes()
_test_html_replace_quote_marks()
_test_danger_css(base_dir)
_test_danger_markup()
_test_strip_html()

View File

@ -94,6 +94,7 @@ from content import create_edits_html
from content import bold_reading_string
from content import limit_repeated_words
from content import replace_emoji_from_tags
from content import html_replace_inline_quotes
from content import html_replace_quote_marks
from content import html_replace_email_quote
from content import remove_text_formatting
@ -3132,6 +3133,7 @@ def individual_post_as_html(signing_priv_key_pem: str,
object_content = \
switch_words(base_dir, nickname, domain, object_content)
object_content = html_replace_email_quote(object_content)
object_content = html_replace_inline_quotes(object_content)
object_content = html_replace_quote_marks(object_content)
object_content = \
format_mixed_right_to_left(object_content, system_language)