From 8cbb9614932ab684f2cf85624739369ed9e7757e Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 22 Nov 2018 05:02:38 +0900 Subject: [MFM] Improve URL parsing Fix #3368 --- src/mfm/parser.ts | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/mfm/parser.ts b/src/mfm/parser.ts index 5acba7867b..047124e582 100644 --- a/src/mfm/parser.ts +++ b/src/mfm/parser.ts @@ -245,11 +245,25 @@ const mfm = P.createLanguage({ const match = text.match(/^https?:\/\/[\w\/:%#@\$&\?!\(\)\[\]~\.,=\+\-]+/); if (!match) return P.makeFailure(i, 'not a url'); let url = match[0]; - const before = input[i - 1]; + let pendingBracket = 0; + const end = url.split('').findIndex(char => { + if (char == ')') { + if (pendingBracket > 0) { + pendingBracket--; + return false; + } else { + return true; + } + } else if (char == '(') { + pendingBracket++; + return false; + } else { + return false; + } + }); + if (end > 0) url = url.substr(0, end); if (url.endsWith('.')) url = url.substr(0, url.lastIndexOf('.')); if (url.endsWith(',')) url = url.substr(0, url.lastIndexOf(',')); - if (url.endsWith(')') && before == '(') url = url.substr(0, url.lastIndexOf(')')); - if (url.endsWith(']') && before == '[') url = url.substr(0, url.lastIndexOf(']')); return P.makeSuccess(i + url.length, url); }) .map(x => makeNode('url', { url: x })), -- cgit v1.2.3-freya