feat: collapse mentions (#1034)
This commit is contained in:
parent
d39ea9a6de
commit
36ae8be40a
6 changed files with 145 additions and 15 deletions
|
@ -2,11 +2,11 @@
|
|||
* @vitest-environment jsdom
|
||||
*/
|
||||
/* eslint-disable vue/one-component-per-file */
|
||||
import type { mastodon } from 'masto'
|
||||
import { describe, expect, it, vi } from 'vitest'
|
||||
import { renderToString } from 'vue/server-renderer'
|
||||
import { format } from 'prettier'
|
||||
import { contentToVNode } from '~/composables/content-render'
|
||||
import type { ContentParseOptions } from '~~/composables/content-parse'
|
||||
|
||||
describe('content-rich', () => {
|
||||
it('empty', async () => {
|
||||
|
@ -26,7 +26,9 @@ describe('content-rich', () => {
|
|||
})
|
||||
|
||||
it('group mention', async () => {
|
||||
const { formatted } = await render('<p><span class="h-card"><a href="https://lemmy.ml/c/pilipinas" class="u-url mention" rel="nofollow noopener noreferrer" target="_blank">@<span>pilipinas</span></a></span></p>', undefined, [{ id: '', username: 'pilipinas', url: 'https://lemmy.ml/c/pilipinas', acct: 'pilipinas@lemmy.ml' }])
|
||||
const { formatted } = await render('<p><span class="h-card"><a href="https://lemmy.ml/c/pilipinas" class="u-url mention" rel="nofollow noopener noreferrer" target="_blank">@<span>pilipinas</span></a></span></p>', {
|
||||
mentions: [{ id: '', username: 'pilipinas', url: 'https://lemmy.ml/c/pilipinas', acct: 'pilipinas@lemmy.ml' }],
|
||||
})
|
||||
expect(formatted).toMatchSnapshot('html')
|
||||
})
|
||||
|
||||
|
@ -42,11 +44,13 @@ describe('content-rich', () => {
|
|||
|
||||
it('custom emoji', async () => {
|
||||
const { formatted } = await render('Daniel Roe :nuxt:', {
|
||||
nuxt: {
|
||||
shortcode: 'nuxt',
|
||||
url: 'https://media.mas.to/masto-public/cache/custom_emojis/images/000/288/667/original/c96ba3cb0e0e1eac.png',
|
||||
staticUrl: 'https://media.mas.to/masto-public/cache/custom_emojis/images/000/288/667/static/c96ba3cb0e0e1eac.png',
|
||||
visibleInPicker: true,
|
||||
emojis: {
|
||||
nuxt: {
|
||||
shortcode: 'nuxt',
|
||||
url: 'https://media.mas.to/masto-public/cache/custom_emojis/images/000/288/667/original/c96ba3cb0e0e1eac.png',
|
||||
staticUrl: 'https://media.mas.to/masto-public/cache/custom_emojis/images/000/288/667/static/c96ba3cb0e0e1eac.png',
|
||||
visibleInPicker: true,
|
||||
},
|
||||
},
|
||||
})
|
||||
expect(formatted).toMatchSnapshot()
|
||||
|
@ -72,10 +76,65 @@ describe('content-rich', () => {
|
|||
const { formatted } = await render('<p>```<br /><br />```<br /></p>')
|
||||
expect(formatted).toMatchSnapshot()
|
||||
})
|
||||
|
||||
it('collapse metions', async () => {
|
||||
const { formatted } = await render('<p><span class="h-card"><a href="https://m.webtoo.ls/@elk" class="u-url mention" rel="nofollow noopener noreferrer" target="_blank">@<span>elk</span></a></span> <span class="h-card"><a href="https://m.webtoo.ls/@elk" class="u-url mention" rel="nofollow noopener noreferrer" target="_blank">@<span>elk</span></a></span> content <span class="h-card"><a href="https://m.webtoo.ls/@antfu" class="u-url mention" rel="nofollow noopener noreferrer" target="_blank">@<span>antfu</span></a></span> <span class="h-card"><a href="https://mastodon.roe.dev/@daniel" class="u-url mention" rel="nofollow noopener noreferrer" target="_blank">@<span>daniel</span></a></span> <span class="h-card"><a href="https://m.webtoo.ls/@sxzz" class="u-url mention" rel="nofollow noopener noreferrer" target="_blank">@<span>sxzz</span></a></span> <span class="h-card"><a href="https://m.webtoo.ls/@patak" class="u-url mention" rel="nofollow noopener noreferrer" target="_blank">@<span>patak</span></a></span> content</p>', {
|
||||
collapseMentionLink: true,
|
||||
})
|
||||
expect(formatted).toMatchInlineSnapshot(`
|
||||
"<p>
|
||||
<mention-group
|
||||
><span class=\\"h-card\\"
|
||||
><a
|
||||
class=\\"u-url mention\\"
|
||||
rel=\\"nofollow noopener noreferrer\\"
|
||||
to=\\"/m.webtoo.ls/@elk\\"
|
||||
></a
|
||||
></span>
|
||||
<span class=\\"h-card\\"
|
||||
><a
|
||||
class=\\"u-url mention\\"
|
||||
rel=\\"nofollow noopener noreferrer\\"
|
||||
to=\\"/m.webtoo.ls/@elk\\"
|
||||
></a></span></mention-group
|
||||
>content
|
||||
<span class=\\"h-card\\"
|
||||
><a
|
||||
class=\\"u-url mention\\"
|
||||
rel=\\"nofollow noopener noreferrer\\"
|
||||
to=\\"/m.webtoo.ls/@antfu\\"
|
||||
></a
|
||||
></span>
|
||||
<span class=\\"h-card\\"
|
||||
><a
|
||||
class=\\"u-url mention\\"
|
||||
rel=\\"nofollow noopener noreferrer\\"
|
||||
to=\\"/mastodon.roe.dev/@daniel\\"
|
||||
></a
|
||||
></span>
|
||||
<span class=\\"h-card\\"
|
||||
><a
|
||||
class=\\"u-url mention\\"
|
||||
rel=\\"nofollow noopener noreferrer\\"
|
||||
to=\\"/m.webtoo.ls/@sxzz\\"
|
||||
></a
|
||||
></span>
|
||||
<span class=\\"h-card\\"
|
||||
><a
|
||||
class=\\"u-url mention\\"
|
||||
rel=\\"nofollow noopener noreferrer\\"
|
||||
to=\\"/m.webtoo.ls/@patak\\"
|
||||
></a
|
||||
></span>
|
||||
content
|
||||
</p>
|
||||
"
|
||||
`)
|
||||
})
|
||||
})
|
||||
|
||||
async function render(content: string, emojis?: Record<string, mastodon.v1.CustomEmoji>, mentions?: mastodon.v1.StatusMention[]) {
|
||||
const vnode = contentToVNode(content, { emojis, mentions })
|
||||
async function render(content: string, options?: ContentParseOptions) {
|
||||
const vnode = contentToVNode(content, options)
|
||||
const html = (await renderToString(vnode))
|
||||
.replace(/<!--[\[\]]-->/g, '')
|
||||
let formatted = ''
|
||||
|
@ -129,6 +188,16 @@ vi.mock('~/components/content/ContentCode.vue', () => {
|
|||
}
|
||||
})
|
||||
|
||||
vi.mock('~/components/content/ContentMentionGroup.vue', () => {
|
||||
return {
|
||||
default: defineComponent({
|
||||
setup(props, { slots }) {
|
||||
return () => h('mention-group', null, { default: () => slots?.default?.() })
|
||||
},
|
||||
}),
|
||||
}
|
||||
})
|
||||
|
||||
vi.mock('~/components/account/AccountHoverWrapper.vue', () => {
|
||||
return {
|
||||
default: defineComponent({
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue