diff options
| author | syuilo <syuilotan@yahoo.co.jp> | 2018-11-22 05:02:38 +0900 |
|---|---|---|
| committer | syuilo <syuilotan@yahoo.co.jp> | 2018-11-22 05:02:38 +0900 |
| commit | 8cbb9614932ab684f2cf85624739369ed9e7757e (patch) | |
| tree | db5268320debed5bcbd9d961c7f284c68ea18e78 /src | |
| parent | Refactoring (diff) | |
| download | misskey-8cbb9614932ab684f2cf85624739369ed9e7757e.tar.gz misskey-8cbb9614932ab684f2cf85624739369ed9e7757e.tar.bz2 misskey-8cbb9614932ab684f2cf85624739369ed9e7757e.zip | |
[MFM] Improve URL parsing
Fix #3368
Diffstat (limited to 'src')
| -rw-r--r-- | src/mfm/parser.ts | 20 |
1 files changed, 17 insertions, 3 deletions
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 })), |