Prioritise closing tags when sorting tags

This commit is contained in:
udf 2023-12-07 18:09:02 +02:00
parent 985d12e169
commit abeb8c4d8d
No known key found for this signature in database
GPG Key ID: E94E4702E3C6D729
4 changed files with 34 additions and 3 deletions

View File

@ -175,7 +175,7 @@ def unparse(text: str, entities: Iterable[TypeMessageEntity]) -> str:
if callable(delimiter): if callable(delimiter):
delimiter = delimiter(entity, text[s:e]) delimiter = delimiter(entity, text[s:e])
insert_at.append((s, i, delimiter[0])) insert_at.append((s, i, delimiter[0]))
insert_at.append((e, len(entities) - i, delimiter[1])) insert_at.append((e, -i, delimiter[1]))
insert_at.sort(key=lambda t: (t[0], t[1])) insert_at.sort(key=lambda t: (t[0], t[1]))
next_escape_bound = len(text) next_escape_bound = len(text)

View File

@ -170,7 +170,7 @@ def unparse(text, entities, delimiters=None, url_fmt=None):
delimiter = delimiters.get(type(entity), None) delimiter = delimiters.get(type(entity), None)
if delimiter: if delimiter:
insert_at.append((s, i, delimiter)) insert_at.append((s, i, delimiter))
insert_at.append((e, len(entities) - i, delimiter)) insert_at.append((e, -i, delimiter))
else: else:
url = None url = None
if isinstance(entity, MessageEntityTextUrl): if isinstance(entity, MessageEntityTextUrl):
@ -179,7 +179,7 @@ def unparse(text, entities, delimiters=None, url_fmt=None):
url = 'tg://user?id={}'.format(entity.user_id) url = 'tg://user?id={}'.format(entity.user_id)
if url: if url:
insert_at.append((s, i, '[')) insert_at.append((s, i, '['))
insert_at.append((e, len(entities) - i, ']({})'.format(url))) insert_at.append((e, -i, ']({})'.format(url)))
insert_at.sort(key=lambda t: (t[0], t[1])) insert_at.sort(key=lambda t: (t[0], t[1]))
while insert_at: while insert_at:

View File

@ -53,6 +53,22 @@ def test_entities_together():
assert text == original assert text == original
def test_nested_entities():
"""
Test that an entity nested inside another one behaves well.
"""
original = '<a href="https://example.com"><strong>Example</strong></a>'
original_entities = [MessageEntityTextUrl(0, 7, url='https://example.com'), MessageEntityBold(0, 7)]
stripped = 'Example'
text, entities = html.parse(original)
assert text == stripped
assert entities == original_entities
text = html.unparse(text, entities)
assert text == original
def test_offset_at_emoji(): def test_offset_at_emoji():
""" """
Tests that an entity starting at a emoji preserves the emoji. Tests that an entity starting at a emoji preserves the emoji.

View File

@ -53,6 +53,21 @@ def test_entities_together():
assert text == original assert text == original
def test_nested_entities():
"""
Test that an entity nested inside another one behaves well.
"""
original = '**[Example](https://example.com)**'
stripped = 'Example'
text, entities = markdown.parse(original)
assert text == stripped
assert entities == [MessageEntityBold(0, 7), MessageEntityTextUrl(0, 7, url='https://example.com')]
text = markdown.unparse(text, entities)
assert text == original
def test_offset_at_emoji(): def test_offset_at_emoji():
""" """
Tests that an entity starting at a emoji preserves the emoji. Tests that an entity starting at a emoji preserves the emoji.