fix(markdown): parse mentions inside brackets correctly
This commit is contained in:
parent
b178c90879
commit
5fceaa79f3
@ -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/'},
|
||||
|
||||
@ -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 {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user