Skip to content

Commit aa3737c

Browse files
authored
fix(richtext-lexical): remove undefined rel and target attributes in link HTML converter (#11754)
When converting lexical to HTML, links without "open in new tab" checked were incorrectly rendering with rel=undefined and target=undefined attributes. This fix ensures those attributes are only added when newTab is true. Fixes: #11752
1 parent 06aa940 commit aa3737c

File tree

4 files changed

+7
-29
lines changed
  • packages
    • plugin-form-builder/src/utilities/lexical/converters
    • richtext-lexical/src/features

4 files changed

+7
-29
lines changed

packages/plugin-form-builder/src/utilities/lexical/converters/link.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,13 @@ export const LinkHTMLConverter: HTMLConverter<any> = {
1515
submissionData,
1616
})
1717

18-
const rel: string = node.fields.newTab ? ' rel="noopener noreferrer"' : ''
19-
const target: string = node.fields.newTab ? ' target="_blank"' : ''
20-
2118
let href: string =
2219
node.fields.linkType === 'custom' ? node.fields.url : node.fields.doc?.value?.id
2320

2421
if (submissionData) {
2522
href = replaceDoubleCurlys(href, submissionData)
2623
}
27-
28-
return `<a href="${href}"${target}${rel}>${childrenText}</a>`
24+
return `<a href="${href}"${node.fields.newTab ? ' rel="noopener noreferrer" target="_blank"' : ''}>${childrenText}</a>`
2925
},
3026
nodeTypes: ['link'],
3127
}

packages/richtext-lexical/src/features/converters/lexicalToHtml/async/converters/link.ts

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,7 @@ export const LinkHTMLConverterAsync: (args: {
1616
})
1717
).join('')
1818

19-
const rel: string | undefined = node.fields.newTab ? 'noopener noreferrer' : undefined
20-
const target: string | undefined = node.fields.newTab ? '_blank' : undefined
21-
22-
return `<a${providedStyleTag} href="${node.fields.url}" rel=${rel} target=${target}>
19+
return `<a${providedStyleTag} href="${node.fields.url}"${node.fields.newTab ? ' rel="noopener noreferrer" target="_blank"' : ''}>
2320
${children}
2421
</a>`
2522
},
@@ -30,9 +27,6 @@ export const LinkHTMLConverterAsync: (args: {
3027
})
3128
).join('')
3229

33-
const rel: string | undefined = node.fields.newTab ? 'noopener noreferrer' : undefined
34-
const target: string | undefined = node.fields.newTab ? '_blank' : undefined
35-
3630
let href: string = node.fields.url ?? ''
3731
if (node.fields.linkType === 'internal') {
3832
if (internalDocToHref) {
@@ -45,7 +39,7 @@ export const LinkHTMLConverterAsync: (args: {
4539
}
4640
}
4741

48-
return `<a${providedStyleTag} href="${href}" rel=${rel} target=${target}>
42+
return `<a${providedStyleTag} href="${href}"${node.fields.newTab ? ' rel="noopener noreferrer" target="_blank"' : ''}>
4943
${children}
5044
</a>`
5145
},

packages/richtext-lexical/src/features/converters/lexicalToHtml/sync/converters/link.ts

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,7 @@ export const LinkHTMLConverter: (args: {
99
nodes: node.children,
1010
}).join('')
1111

12-
const rel: string | undefined = node.fields.newTab ? 'noopener noreferrer' : undefined
13-
const target: string | undefined = node.fields.newTab ? '_blank' : undefined
14-
15-
return `<a${providedStyleTag} href="${node.fields.url}" rel=${rel} target=${target}>
12+
return `<a${providedStyleTag} href="${node.fields.url}"${node.fields.newTab ? ' rel="noopener noreferrer" target="_blank"' : ''}>
1613
${children}
1714
</a>`
1815
},
@@ -21,9 +18,6 @@ export const LinkHTMLConverter: (args: {
2118
nodes: node.children,
2219
}).join('')
2320

24-
const rel: string | undefined = node.fields.newTab ? 'noopener noreferrer' : undefined
25-
const target: string | undefined = node.fields.newTab ? '_blank' : undefined
26-
2721
let href: string = node.fields.url ?? ''
2822
if (node.fields.linkType === 'internal') {
2923
if (internalDocToHref) {
@@ -36,7 +30,7 @@ export const LinkHTMLConverter: (args: {
3630
}
3731
}
3832

39-
return `<a${providedStyleTag} href="${href}" rel=${rel} target=${target}>
33+
return `<a${providedStyleTag} href="${href}"${node.fields.newTab ? ' rel="noopener noreferrer" target="_blank"' : ''}>
4034
${children}
4135
</a>`
4236
},

packages/richtext-lexical/src/features/link/server/index.ts

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -191,9 +191,6 @@ export const LinkFeature = createServerFeature<
191191
showHiddenFields,
192192
})
193193

194-
const rel: string = node.fields.newTab ? ' rel="noopener noreferrer"' : ''
195-
const target: string = node.fields.newTab ? ' target="_blank"' : ''
196-
197194
let href: string = node.fields.url ?? ''
198195
if (node.fields.linkType === 'internal') {
199196
href =
@@ -202,7 +199,7 @@ export const LinkFeature = createServerFeature<
202199
: String(node.fields.doc?.value?.id)
203200
}
204201

205-
return `<a href="${href}"${target}${rel}>${childrenText}</a>`
202+
return `<a href="${href}"${node.fields.newTab ? ' rel="noopener noreferrer" target="_blank"' : ''}>${childrenText}</a>`
206203
},
207204
nodeTypes: [AutoLinkNode.getType()],
208205
},
@@ -240,15 +237,12 @@ export const LinkFeature = createServerFeature<
240237
showHiddenFields,
241238
})
242239

243-
const rel: string = node.fields.newTab ? ' rel="noopener noreferrer"' : ''
244-
const target: string = node.fields.newTab ? ' target="_blank"' : ''
245-
246240
const href: string =
247241
node.fields.linkType === 'custom'
248242
? escapeHTML(node.fields.url)
249243
: (node.fields.doc?.value as string)
250244

251-
return `<a href="${href}"${target}${rel}>${childrenText}</a>`
245+
return `<a href="${href}"${node.fields.newTab ? ' rel="noopener noreferrer" target="_blank"' : ''}>${childrenText}</a>`
252246
},
253247
nodeTypes: [LinkNode.getType()],
254248
},

0 commit comments

Comments
 (0)