fix(markdown): parse mentions inside brackets correctly

This commit is contained in:
Hampus Kraft 2026-02-20 19:24:07 +00:00
parent b178c90879
commit 5fceaa79f3
No known key found for this signature in database
GPG Key ID: 6090864C465A454D
2 changed files with 26 additions and 2 deletions

View File

@ -18,7 +18,7 @@
*/
import {Parser} from '@fluxer/markdown_parser/src/parser/Parser';
import {NodeType, ParserFlags} from '@fluxer/markdown_parser/src/types/Enums';
import {MentionKind, NodeType, ParserFlags} from '@fluxer/markdown_parser/src/types/Enums';
import type {LinkNode} from '@fluxer/markdown_parser/src/types/Nodes';
import {describe, expect, test} from 'vitest';
@ -543,6 +543,22 @@ describe('Fluxer Markdown Parser', () => {
]);
});
test('link parser should not escape bracketed mentions', () => {
const input = '[ <@1473362285356646457> ]';
const flags = ParserFlags.ALLOW_MASKED_LINKS | ParserFlags.ALLOW_USER_MENTIONS;
const parser = new Parser(input, flags);
const {nodes: ast} = parser.parse();
expect(ast).toEqual([
{type: NodeType.Text, content: '[ '},
{
type: NodeType.Mention,
kind: {kind: MentionKind.User, id: '1473362285356646457'},
},
{type: NodeType.Text, content: ' ]'},
]);
});
test('domain-like link text without protocol should parse as a link', () => {
const testCases = [
{input: '[google.com](https://evil.com)', url: 'https://evil.com/'},

View File

@ -17,6 +17,7 @@
* along with Fluxer. If not, see <https://www.gnu.org/licenses/>.
*/
import {parseMention} from '@fluxer/markdown_parser/src/parsers/MentionParsers';
import {NodeType, ParserFlags} from '@fluxer/markdown_parser/src/types/Enums';
import {MAX_LINK_URL_LENGTH} from '@fluxer/markdown_parser/src/types/MarkdownConstants';
import type {Node, ParserResult} from '@fluxer/markdown_parser/src/types/Nodes';
@ -53,7 +54,7 @@ function containsLinkSyntax(text: string): boolean {
export function parseLink(
text: string,
_parserFlags: number,
parserFlags: number,
parseInline: (text: string) => Array<Node>,
): ParserResult | null {
if (text.charCodeAt(0) !== OPEN_BRACKET) return null;
@ -72,6 +73,13 @@ export function parseLink(
if (bracketResult) {
const {bracketPosition, linkText} = bracketResult;
const trimmedLinkText = linkText.trim();
const mentionResult = parseMention(trimmedLinkText, parserFlags);
if (mentionResult && mentionResult.advance === trimmedLinkText.length) {
return null;
}
if (containsLinkSyntax(linkText)) {
return {