From 289ed55112fab22b6b17c1c225efb823698eb144 Mon Sep 17 00:00:00 2001 From: tateisu Date: Sun, 3 Sep 2023 20:21:28 +0900 Subject: [PATCH] =?UTF-8?q?#=E3=81=BB=E3=81=92=E3=81=BB=E3=81=926=20?= =?UTF-8?q?=E3=81=A8=E3=81=8B=E5=8D=8A=E8=A7=92=E6=95=B0=E5=AD=97=E3=81=A8?= =?UTF-8?q?=E9=9D=9Eascii=E6=96=87=E5=AD=97=E3=81=8C=E6=B7=B7=E3=81=96?= =?UTF-8?q?=E3=81=A3=E3=81=9F=E3=83=8F=E3=83=83=E3=82=B7=E3=83=A5=E3=82=BF?= =?UTF-8?q?=E3=82=B0=E3=82=92=E6=8A=95=E7=A8=BF=E3=81=99=E3=82=8B=E6=99=82?= =?UTF-8?q?=E3=81=AB=E8=AD=A6=E5=91=8A=E3=82=92=E5=87=BA=E3=81=95=E3=81=AA?= =?UTF-8?q?=E3=81=8F=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/modules.xml | 6 ++++ .../jp/juggler/subwaytooter/util/PostImpl.kt | 17 ++++++--- .../subwaytooter/TestPostImplTagAscii.kt | 35 +++++++++++++++++++ 3 files changed, 53 insertions(+), 5 deletions(-) create mode 100644 app/src/test/java/jp/juggler/subwaytooter/TestPostImplTagAscii.kt diff --git a/.idea/modules.xml b/.idea/modules.xml index eb749e40..402d47a4 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -38,6 +38,12 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/java/jp/juggler/subwaytooter/util/PostImpl.kt b/app/src/main/java/jp/juggler/subwaytooter/util/PostImpl.kt index d81f3636..85913dff 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/util/PostImpl.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/util/PostImpl.kt @@ -68,8 +68,14 @@ class PostImpl( ) { companion object { private val log = LogCategory("PostImpl") - private val reAscii = """[\x00-\x7f]""".asciiPattern() - private val reNotAscii = """[^\x00-\x7f]""".asciiPattern() + + // ハッシュタグ内部の、半角数字以外のASCII文字にマッチする正規表現 + // 単体テストで使うのでpublig + val reTagAsciiNotNumber = """[\x00-\x2f\x3a-\x7f]""".toRegex() + + // ハッシュタグ内部の、非ASCII文字にマッチする正規表現 + // 単体テストで使うのでpublig + val reTagNonAscii = """[^\x00-\x7f]""".toRegex() private var lastPostTapped: Long = 0L @@ -434,9 +440,10 @@ class PostImpl( if (PrefB.bpWarnHashtagAsciiAndNonAscii.value) { TootTag.findHashtags(content, account.isMisskey) ?.filter { - val hasAscii = reAscii.matcher(it).find() - val hasNotAscii = reNotAscii.matcher(it).find() - hasAscii && hasNotAscii + // タグがASCII文字(半角数字を除く)と非ASCII文字の両方を含むか? + val hasAscii = reTagAsciiNotNumber.containsMatchIn(it) + val hasNonAscii = reTagNonAscii.containsMatchIn(it) + hasAscii && hasNonAscii }?.map { "#$it" } ?.notEmpty() ?.let { badTags -> diff --git a/app/src/test/java/jp/juggler/subwaytooter/TestPostImplTagAscii.kt b/app/src/test/java/jp/juggler/subwaytooter/TestPostImplTagAscii.kt new file mode 100644 index 00000000..551eba3d --- /dev/null +++ b/app/src/test/java/jp/juggler/subwaytooter/TestPostImplTagAscii.kt @@ -0,0 +1,35 @@ +package jp.juggler.subwaytooter + +import jp.juggler.subwaytooter.util.PostImpl +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Test + +class TestPostImplTagAscii { + @Test + fun testPostImplTagAscii() { + val reTagNumber = """[0-9]""".toRegex() + for (cp in 0..<0x100) { + val str = "" + cp.toChar() + when { + cp >= 0x80 -> { + assertTrue(PostImpl.reTagNonAscii.containsMatchIn(str)) + assertFalse(PostImpl.reTagAsciiNotNumber.containsMatchIn(str)) + assertFalse(reTagNumber.containsMatchIn(str)) + } + + cp in '0'.code..'9'.code -> { + assertFalse(PostImpl.reTagNonAscii.containsMatchIn(str)) + assertFalse(PostImpl.reTagAsciiNotNumber.containsMatchIn(str)) + assertTrue(reTagNumber.containsMatchIn(str)) + } + + else -> { + assertFalse(PostImpl.reTagNonAscii.containsMatchIn(str)) + assertTrue(PostImpl.reTagAsciiNotNumber.containsMatchIn(str)) + assertFalse(reTagNumber.containsMatchIn(str)) + } + } + } + } +}