diff --git a/packages/formatters/__tests__/escapers.test.ts b/packages/formatters/__tests__/escapers.test.ts index 280dc4d1a392..a5d69763ced3 100644 --- a/packages/formatters/__tests__/escapers.test.ts +++ b/packages/formatters/__tests__/escapers.test.ts @@ -23,6 +23,8 @@ const testURLs = [ 'https://example.com/name_with_underscores', 'https://example.com/name__with__underscores', 'https://example.com/name_with_underscores_and__double__underscores', + 'https://*.example.com/globbed/*', + 'https://example.com/*before*/>/*after*', ]; describe('Markdown escapers', () => { @@ -87,6 +89,16 @@ describe('Markdown escapers', () => { test('url', () => { for (const url of testURLs) expect(escapeItalic(url)).toBe(url); }); + + test('after-url', () => { + const url = ''; + for (const [input, output] of [ + ['*hi*', '\\*hi\\*'], + ['_hi_', '\\_hi\\_'], + ]) { + expect(escapeItalic(url + input)).toBe(url + output); + } + }); }); describe('escapeUnderline', () => { diff --git a/packages/formatters/src/escapers.ts b/packages/formatters/src/escapers.ts index bceaf484f1d9..b1f0b028a226 100644 --- a/packages/formatters/src/escapers.ts +++ b/packages/formatters/src/escapers.ts @@ -212,15 +212,21 @@ export function escapeInlineCode(text: string): string { */ export function escapeItalic(text: string): string { let idx = 0; - const newText = text.replaceAll(/(?<=^|[^*])\*([^*]|\*\*|$)/g, (_, match) => { - if (match === '**') return ++idx % 2 ? `\\*${match}` : `${match}\\*`; - return `\\*${match}`; - }); + const newText = text.replaceAll( + /(?<=^|[^*])(?]*)\*([^*]|\*\*|$)/g, + (_, match) => { + if (match === '**') return ++idx % 2 ? `\\*${match}` : `${match}\\*`; + return `\\*${match}`; + }, + ); idx = 0; - return newText.replaceAll(/(?<=^|[^_])(?)([^_]|__|$)/g, (_, match) => { - if (match === '__') return ++idx % 2 ? `\\_${match}` : `${match}\\_`; - return `\\_${match}`; - }); + return newText.replaceAll( + /(?<=^|[^_])(?]*)_(?!:\d+>)([^_]|__|$)/g, + (_, match) => { + if (match === '__') return ++idx % 2 ? `\\_${match}` : `${match}\\_`; + return `\\_${match}`; + }, + ); } /**