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 {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 type {LinkNode} from '@fluxer/markdown_parser/src/types/Nodes';
|
||||||
import {describe, expect, test} from 'vitest';
|
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', () => {
|
test('domain-like link text without protocol should parse as a link', () => {
|
||||||
const testCases = [
|
const testCases = [
|
||||||
{input: '[google.com](https://evil.com)', url: 'https://evil.com/'},
|
{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/>.
|
* 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 {NodeType, ParserFlags} from '@fluxer/markdown_parser/src/types/Enums';
|
||||||
import {MAX_LINK_URL_LENGTH} from '@fluxer/markdown_parser/src/types/MarkdownConstants';
|
import {MAX_LINK_URL_LENGTH} from '@fluxer/markdown_parser/src/types/MarkdownConstants';
|
||||||
import type {Node, ParserResult} from '@fluxer/markdown_parser/src/types/Nodes';
|
import type {Node, ParserResult} from '@fluxer/markdown_parser/src/types/Nodes';
|
||||||
@ -53,7 +54,7 @@ function containsLinkSyntax(text: string): boolean {
|
|||||||
|
|
||||||
export function parseLink(
|
export function parseLink(
|
||||||
text: string,
|
text: string,
|
||||||
_parserFlags: number,
|
parserFlags: number,
|
||||||
parseInline: (text: string) => Array<Node>,
|
parseInline: (text: string) => Array<Node>,
|
||||||
): ParserResult | null {
|
): ParserResult | null {
|
||||||
if (text.charCodeAt(0) !== OPEN_BRACKET) return null;
|
if (text.charCodeAt(0) !== OPEN_BRACKET) return null;
|
||||||
@ -72,6 +73,13 @@ export function parseLink(
|
|||||||
|
|
||||||
if (bracketResult) {
|
if (bracketResult) {
|
||||||
const {bracketPosition, linkText} = 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)) {
|
if (containsLinkSyntax(linkText)) {
|
||||||
return {
|
return {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user