summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorsyuilo <syuilotan@yahoo.co.jp>2018-11-25 04:44:42 +0900
committersyuilo <syuilotan@yahoo.co.jp>2018-11-25 04:44:42 +0900
commit3b10e93efea6b216678349816548850e03fc18dc (patch)
tree3b45167de5ab4849228dc0f181a7775cfe357a03 /src
parentUpdate note-mixin.ts (diff)
downloadmisskey-3b10e93efea6b216678349816548850e03fc18dc.tar.gz
misskey-3b10e93efea6b216678349816548850e03fc18dc.tar.bz2
misskey-3b10e93efea6b216678349816548850e03fc18dc.zip
[MFM] Better hashtag parsing
Diffstat (limited to 'src')
-rw-r--r--src/mfm/parser.ts24
1 files changed, 21 insertions, 3 deletions
diff --git a/src/mfm/parser.ts b/src/mfm/parser.ts
index 3edb23b602..480d590755 100644
--- a/src/mfm/parser.ts
+++ b/src/mfm/parser.ts
@@ -112,9 +112,27 @@ const mfm = P.createLanguage({
const text = input.substr(i);
const match = text.match(/^#([^\s\.,!\?#]+)/i);
if (!match) return P.makeFailure(i, 'not a hashtag');
- if (match[1].match(/^[0-9]+$/)) return P.makeFailure(i, 'not a hashtag');
- if (input[i - 1] != '\n' && input[i - 1] != ' ' && input[i - 1] != null) return P.makeFailure(i, 'require space before "#"');
- return P.makeSuccess(i + match[0].length, makeNode('hashtag', { hashtag: match[1] }));
+ let hashtag = match[1];
+ let pendingBracket = 0;
+ const end = hashtag.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) hashtag = hashtag.substr(0, end);
+ if (hashtag.match(/^[0-9]+$/)) return P.makeFailure(i, 'not a hashtag');
+ if (!['\n', ' ', '(', null, undefined].includes(input[i - 1])) return P.makeFailure(i, 'require space before "#"');
+ return P.makeSuccess(i + ('#' + hashtag).length, makeNode('hashtag', { hashtag: hashtag }));
}),
//#endregion