diff --git a/app/src/main/java/com/hippo/ehviewer/client/EhFilter.kt b/app/src/main/java/com/hippo/ehviewer/client/EhFilter.kt index a241889c3..c3f984ee2 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/EhFilter.kt +++ b/app/src/main/java/com/hippo/ehviewer/client/EhFilter.kt @@ -19,16 +19,14 @@ import android.util.Log import com.hippo.ehviewer.EhDB import com.hippo.ehviewer.client.data.GalleryInfo import com.hippo.ehviewer.dao.Filter -import java.util.Locale -import java.util.regex.Pattern object EhFilter { - private val mTitleFilterList: MutableList = ArrayList() - private val mUploaderFilterList: MutableList = ArrayList() - private val mTagFilterList: MutableList = ArrayList() - private val mTagNamespaceFilterList: MutableList = ArrayList() - private val mCommenterFilterList: MutableList = ArrayList() - private val mCommentFilterList: MutableList = ArrayList() + val titleFilterList = mutableListOf() + val uploaderFilterList = mutableListOf() + val tagFilterList = mutableListOf() + val tagNamespaceFilterList = mutableListOf() + val commenterFilterList = mutableListOf() + val commentFilterList = mutableListOf() const val MODE_TITLE = 0 const val MODE_UPLOADER = 1 @@ -36,52 +34,34 @@ object EhFilter { const val MODE_TAG_NAMESPACE = 3 const val MODE_COMMENTER = 4 const val MODE_COMMENT = 5 - private val TAG = EhFilter::class.java.simpleName + private const val TAG = "EhFilter" init { - val list = EhDB.allFilter - var i = 0 - val n = list.size - while (i < n) { - val filter = list[i] + EhDB.allFilter.forEach { filter -> when (filter.mode) { MODE_TITLE -> { - filter.text = filter.text!!.lowercase(Locale.getDefault()) - mTitleFilterList.add(filter) + filter.text = filter.text!!.lowercase() + titleFilterList.add(filter) } MODE_TAG -> { - filter.text = filter.text!!.lowercase(Locale.getDefault()) - mTagFilterList.add(filter) + filter.text = filter.text!!.lowercase() + tagFilterList.add(filter) } MODE_TAG_NAMESPACE -> { - filter.text = filter.text!!.lowercase(Locale.getDefault()) - mTagNamespaceFilterList.add(filter) + filter.text = filter.text!!.lowercase() + tagNamespaceFilterList.add(filter) } - MODE_UPLOADER -> mUploaderFilterList.add(filter) - MODE_COMMENTER -> mCommenterFilterList.add(filter) - MODE_COMMENT -> mCommentFilterList.add(filter) + MODE_UPLOADER -> uploaderFilterList.add(filter) + MODE_COMMENTER -> commenterFilterList.add(filter) + MODE_COMMENT -> commentFilterList.add(filter) else -> Log.d(TAG, "Unknown mode: " + filter.mode) } - i++ } } - val titleFilterList: List - get() = mTitleFilterList - val uploaderFilterList: List - get() = mUploaderFilterList - val tagFilterList: List - get() = mTagFilterList - val tagNamespaceFilterList: List - get() = mTagNamespaceFilterList - val commenterFilterList: List - get() = mCommenterFilterList - val commentFilterList: List - get() = mCommentFilterList - @Synchronized fun addFilter(filter: Filter): Boolean { // enable filter by default before it is added to database @@ -89,23 +69,23 @@ object EhFilter { if (!EhDB.addFilter(filter)) return false when (filter.mode) { MODE_TITLE -> { - filter.text = filter.text!!.lowercase(Locale.getDefault()) - mTitleFilterList.add(filter) + filter.text = filter.text!!.lowercase() + titleFilterList.add(filter) } MODE_TAG -> { - filter.text = filter.text!!.lowercase(Locale.getDefault()) - mTagFilterList.add(filter) + filter.text = filter.text!!.lowercase() + tagFilterList.add(filter) } MODE_TAG_NAMESPACE -> { - filter.text = filter.text!!.lowercase(Locale.getDefault()) - mTagNamespaceFilterList.add(filter) + filter.text = filter.text!!.lowercase() + tagNamespaceFilterList.add(filter) } - MODE_UPLOADER -> mUploaderFilterList.add(filter) - MODE_COMMENTER -> mCommenterFilterList.add(filter) - MODE_COMMENT -> mCommentFilterList.add(filter) + MODE_UPLOADER -> uploaderFilterList.add(filter) + MODE_COMMENTER -> commenterFilterList.add(filter) + MODE_COMMENT -> commentFilterList.add(filter) else -> Log.d(TAG, "Unknown mode: " + filter.mode) } return true @@ -120,12 +100,12 @@ object EhFilter { fun deleteFilter(filter: Filter) { EhDB.deleteFilter(filter) when (filter.mode) { - MODE_TITLE -> mTitleFilterList.remove(filter) - MODE_TAG -> mTagFilterList.remove(filter) - MODE_TAG_NAMESPACE -> mTagNamespaceFilterList.remove(filter) - MODE_UPLOADER -> mUploaderFilterList.remove(filter) - MODE_COMMENTER -> mCommenterFilterList.remove(filter) - MODE_COMMENT -> mCommentFilterList.remove(filter) + MODE_TITLE -> titleFilterList.remove(filter) + MODE_TAG -> tagFilterList.remove(filter) + MODE_TAG_NAMESPACE -> tagNamespaceFilterList.remove(filter) + MODE_UPLOADER -> uploaderFilterList.remove(filter) + MODE_COMMENTER -> commenterFilterList.remove(filter) + MODE_COMMENT -> commentFilterList.remove(filter) else -> Log.d(TAG, "Unknown mode: " + filter.mode) } } @@ -136,48 +116,30 @@ object EhFilter { @Synchronized fun needTags(): Boolean { - return 0 != mTagFilterList.size || 0 != mTagNamespaceFilterList.size + return 0 != tagFilterList.size || 0 != tagNamespaceFilterList.size } @Synchronized fun filterTitle(info: GalleryInfo): Boolean { val title = info.title ?: return false - return mTitleFilterList.contains { it.enable!! && it.text!! in title.lowercase() } + return titleFilterList.contains { it.enable!! && it.text!! in title.lowercase() } } @Synchronized fun filterUploader(info: GalleryInfo): Boolean { val uploader = info.uploader ?: return false - return mUploaderFilterList.contains { it.enable!! && it.text == uploader } + return uploaderFilterList.contains { it.enable!! && it.text == uploader } } - private fun matchTag(tag: String?, filter: String?): Boolean { - if (null == tag || null == filter) { - return false - } - val tagNamespace: String? - val tagName: String - val filterNamespace: String? - val filterName: String - var index = tag.indexOf(':') - if (index < 0) { - tagNamespace = null - tagName = tag - } else { - tagNamespace = tag.substring(0, index) - tagName = tag.substring(index + 1) - } - index = filter.indexOf(':') - if (index < 0) { - filterNamespace = null - filterName = filter - } else { - filterNamespace = filter.substring(0, index) - filterName = filter.substring(index + 1) - } - return if (null != tagNamespace && null != filterNamespace && - tagNamespace != filterNamespace - ) { + private fun spiltTag(tag: String) = tag.run { + val index = indexOf(':') + if (index < 0) null to this else substring(0, index) to substring(index + 1) + } + + private fun matchTag(tag: String, filter: String): Boolean { + val (tagNamespace, tagName) = spiltTag(tag) + val (filterNamespace, filterName) = spiltTag(filter) + return if (null != tagNamespace && null != filterNamespace && tagNamespace != filterNamespace) { false } else { tagName == filterName @@ -187,66 +149,27 @@ object EhFilter { @Synchronized fun filterTag(info: GalleryInfo): Boolean { val tags = info.simpleTags ?: return false - return tags.contains { tag -> mTagFilterList.contains { it.enable!! && matchTag(tag, it.text) } } + return tags.contains { tag -> tagFilterList.contains { it.enable!! && matchTag(tag, it.text!!) } } } - private fun matchTagNamespace(tag: String?, filter: String?): Boolean { - if (null == tag || null == filter) { - return false - } - val tagNamespace: String - val index = tag.indexOf(':') - return if (index >= 0) { - tagNamespace = tag.substring(0, index) - tagNamespace == filter - } else { - false - } + private fun matchTagNamespace(tag: String, filter: String): Boolean { + val (nameSpace, _) = spiltTag(tag) + return nameSpace == filter } @Synchronized fun filterTagNamespace(info: GalleryInfo): Boolean { val tags = info.simpleTags ?: return false - return tags.contains { tag -> mTagNamespaceFilterList.contains { it.enable!! && matchTagNamespace(tag, it.text) } } + return tags.contains { tag -> tagNamespaceFilterList.contains { it.enable!! && matchTagNamespace(tag, it.text!!) } } } @Synchronized - fun filterCommenter(commenter: String?): Boolean { - if (null == commenter) { - return false - } - val filters: List = mCommenterFilterList - if (filters.isNotEmpty()) { - var i = 0 - val n = filters.size - while (i < n) { - if (filters[i].enable!! && commenter == filters[i].text) { - return false - } - i++ - } - } - return true + fun filterCommenter(commenter: String): Boolean { + return commenterFilterList.contains { it.enable!! && it.text == commenter } } @Synchronized - fun filterComment(comment: String?): Boolean { - if (null == comment) { - return false - } - val filters: List = mCommentFilterList - if (filters.isNotEmpty()) { - var i = 0 - val n = filters.size - while (i < n) { - if (filters[i].enable!!) { - val p = Pattern.compile(filters[i].text!!) - val m = p.matcher(comment) - if (m.find()) return false - } - i++ - } - } - return true + fun filterComment(comment: String): Boolean { + return commentFilterList.contains { it.enable!! && Regex(it.text!!).containsMatchIn(comment) } } } diff --git a/app/src/main/java/com/hippo/ehviewer/client/parser/GalleryDetailParser.kt b/app/src/main/java/com/hippo/ehviewer/client/parser/GalleryDetailParser.kt index cee0e161b..4daa1af3d 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/parser/GalleryDetailParser.kt +++ b/app/src/main/java/com/hippo/ehviewer/client/parser/GalleryDetailParser.kt @@ -399,7 +399,7 @@ object GalleryDetailParser { // filter comment if (!comment.uploader) { val sEhFilter = EhFilter - if (!sEhFilter.filterCommenter(comment.user) || !sEhFilter.filterComment(comment.comment)) { + if (sEhFilter.filterCommenter(comment.user!!) || sEhFilter.filterComment(comment.comment!!)) { return null } }