feat(html-parser): support collapsible blockquotes

This commit is contained in:
alina 🌸 2024-06-01 16:12:33 +03:00
parent 9fd2aa85f2
commit 3cc193a8fa
Signed by: teidesu
SSH key fingerprint: SHA256:uNeCpw6aTSU4aIObXLvHfLkDa82HWH9EiOj9AXOIRpI
2 changed files with 21 additions and 3 deletions

View file

@ -64,6 +64,14 @@ describe('HtmlMessageEntityParser', () => {
) )
}) })
it('should handle collapsible blockquotes', () => {
test(
'plain blockquote plain',
[createEntity('messageEntityBlockquote', 6, 10, { collapsed: true })],
'plain <blockquote collapsible>blockquote</blockquote> plain',
)
})
it('should handle links and text mentions', () => { it('should handle links and text mentions', () => {
test( test(
'plain https://google.com google @durov Pavel Durov mail@mail.ru plain', 'plain https://google.com google @durov Pavel Durov mail@mail.ru plain',
@ -253,13 +261,21 @@ describe('HtmlMessageEntityParser', () => {
[ [
createEntity('messageEntityCode', 6, 4), createEntity('messageEntityCode', 6, 4),
createEntity('messageEntityPre', 11, 3, { language: '' }), createEntity('messageEntityPre', 11, 3, { language: '' }),
createEntity('messageEntityBlockquote', 15, 10), createEntity('messageEntityBlockquote', 15, 10, { collapsed: false }),
createEntity('messageEntitySpoiler', 26, 7), createEntity('messageEntitySpoiler', 26, 7),
], ],
'plain code pre blockquote spoiler plain', 'plain code pre blockquote spoiler plain',
) )
}) })
it('should handle collapsible blockquotes', () => {
test(
htm`plain <blockquote collapsible>blockquote</blockquote> plain`,
[createEntity('messageEntityBlockquote', 6, 10, { collapsed: true })],
'plain blockquote plain',
)
})
it('should handle links and text mentions', () => { it('should handle links and text mentions', () => {
test( test(
htm`plain https://google.com <a href="https://google.com">google</a> @durov <a href="tg://user?id=36265675">Pavel Durov</a> plain`, htm`plain https://google.com <a href="https://google.com">google</a> @durov <a href="tg://user?id=36265675">Pavel Durov</a> plain`,

View file

@ -105,6 +105,7 @@ function parse(
_: 'messageEntityBlockquote', _: 'messageEntityBlockquote',
offset: plainText.length, offset: plainText.length,
length: 0, length: 0,
collapsed: 'collapsible' in attribs,
} }
break break
case 'code': case 'code':
@ -372,7 +373,6 @@ function _unparse(
case 'messageEntityUnderline': case 'messageEntityUnderline':
case 'messageEntityStrike': case 'messageEntityStrike':
case 'messageEntityCode': case 'messageEntityCode':
case 'messageEntityBlockquote':
case 'messageEntitySpoiler': case 'messageEntitySpoiler':
{ {
const tag = ( const tag = (
@ -382,13 +382,15 @@ function _unparse(
messageEntityUnderline: 'u', messageEntityUnderline: 'u',
messageEntityStrike: 's', messageEntityStrike: 's',
messageEntityCode: 'code', messageEntityCode: 'code',
messageEntityBlockquote: 'blockquote',
messageEntitySpoiler: 'spoiler', messageEntitySpoiler: 'spoiler',
} as const } as const
)[type] )[type]
html.push(`<${tag}>${entityText}</${tag}>`) html.push(`<${tag}>${entityText}</${tag}>`)
} }
break break
case 'messageEntityBlockquote':
html.push(`<blockquote${entity.collapsed ? ' collapsible' : ''}>${entityText}</blockquote>`)
break
case 'messageEntityPre': case 'messageEntityPre':
html.push( html.push(
`<pre${entity.language ? ` language="${entity.language}"` : ''}>${ `<pre${entity.language ? ` language="${entity.language}"` : ''}>${