diff --git a/composables/content-render.ts b/composables/content-render.ts
index 5e029d0744..4062b0a182 100644
--- a/composables/content-render.ts
+++ b/composables/content-render.ts
@@ -60,16 +60,40 @@ export function nodeToVNode(node: Node): VNode | string | null {
}
if ('children' in node) {
- if (node.name === 'a' && (node.attributes.href?.startsWith('/') || node.attributes.href?.startsWith('.'))) {
- node.attributes.to = node.attributes.href
+ if (node.name === 'a') {
+ if (node.attributes.href?.startsWith('/') || node.attributes.href?.startsWith('.')) {
+ node.attributes.to = node.attributes.href
+
+ const { href: _href, target: _target, ...attrs } = node.attributes
+ return h(
+ RouterLink as any,
+ attrs,
+ () => node.children.map(treeToVNode),
+ )
+ }
- const { href: _href, target: _target, ...attrs } = node.attributes
+ // fix #3122
return h(
- RouterLink as any,
- attrs,
- () => node.children.map(treeToVNode),
+ node.name,
+ node.attributes,
+ node.children.map((n: Node) => {
+ // replace span.ellipsis with bdi.ellipsis inside links
+ if (n && n.type === ELEMENT_NODE && n.name !== 'bdi' && n.attributes?.class?.includes('ellipsis')) {
+ const children = n.children.splice(0, n.children.length)
+ const bdi = {
+ ...n,
+ name: 'bdi',
+ children,
+ } satisfies ElementNode
+ children.forEach((n: Node) => n.parent = bdi)
+ return treeToVNode(bdi)
+ }
+
+ return treeToVNode(n)
+ }),
)
}
+
return h(
node.name,
node.attributes,
diff --git a/tests/nuxt/__snapshots__/content-rich.test.ts.snap b/tests/nuxt/__snapshots__/content-rich.test.ts.snap
index 74f93d1420..4e99489cbf 100644
--- a/tests/nuxt/__snapshots__/content-rich.test.ts.snap
+++ b/tests/nuxt/__snapshots__/content-rich.test.ts.snap
@@ -257,7 +257,7 @@ exports[`content-rich > link + mention 1`] = `
rel="nofollow noopener noreferrer"
target="_blank"
>https://github.com/ayoayco/astro-reactgithub.com/ayoayco/astro-reactive-library/pull/203