From 70d0937aab71de6e9fb475e01940bebde3b6d77d Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 20 Oct 2018 09:03:04 +0900
Subject: [PATCH] Fix #2949

---
 src/mfm/parse/elements/hashtag.ts | 4 ++--
 test/mfm.ts                       | 5 +++++
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/src/mfm/parse/elements/hashtag.ts b/src/mfm/parse/elements/hashtag.ts
index 339026228..e4e9df6ce 100644
--- a/src/mfm/parse/elements/hashtag.ts
+++ b/src/mfm/parse/elements/hashtag.ts
@@ -9,9 +9,9 @@ export type TextElementHashtag = {
 };
 
 export default function(text: string, i: number) {
-	if (!(/^\s#[^\s\.,]+/.test(text) || (i == 0 && /^#[^\s\.,]+/.test(text)))) return null;
+	if (!(/^\s#[^\s\.,!\?]+/.test(text) || (i == 0 && /^#[^\s\.,!\?]+/.test(text)))) return null;
 	const isHead = text.startsWith('#');
-	const hashtag = text.match(/^\s?#[^\s\.,]+/)[0];
+	const hashtag = text.match(/^\s?#[^\s\.,!\?]+/)[0];
 	const res: any[] = !isHead ? [{
 		type: 'text',
 		content: text[0]
diff --git a/test/mfm.ts b/test/mfm.ts
index ad12eac7b..684cf42fb 100644
--- a/test/mfm.ts
+++ b/test/mfm.ts
@@ -122,6 +122,11 @@ describe('Text', () => {
 				{ type: 'hashtag', content: '#piyo', hashtag: 'piyo' },
 				{ type: 'text', content: '.' }
 			], tokens2);
+
+			const tokens3 = analyze('#Foo!');
+			assert.deepEqual([
+				{ type: 'text', content: '#Foo!' },
+			], tokens3);
 		});
 
 		it('quote', () => {