diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadMediaDetailInputFilter.java b/app/src/main/java/fr/free/nrw/commons/upload/UploadMediaDetailInputFilter.java deleted file mode 100644 index f2c444ee7..000000000 --- a/app/src/main/java/fr/free/nrw/commons/upload/UploadMediaDetailInputFilter.java +++ /dev/null @@ -1,81 +0,0 @@ -package fr.free.nrw.commons.upload; - -import android.text.InputFilter; -import android.text.Spanned; -import java.util.regex.Pattern; - -/** - * An {@link InputFilter} class that removes characters blocklisted in Wikimedia titles. The list - * of blocklisted characters is linked below. - * @see wikimedia.org - */ -public class UploadMediaDetailInputFilter implements InputFilter { - private final Pattern[] patterns; - - /** - * Initializes the blocklisted patterns. - */ - public UploadMediaDetailInputFilter() { - patterns = new Pattern[]{ - Pattern.compile("[\\x{00A0}\\x{1680}\\x{180E}\\x{2000}-\\x{200B}\\x{2028}\\x{2029}\\x{202F}\\x{205F}]"), - Pattern.compile("[\\x{202A}-\\x{202E}]"), - Pattern.compile("\\p{Cc}"), - Pattern.compile("\\x{3A}"), // Added for colon(:) - Pattern.compile("\\x{FEFF}"), - Pattern.compile("\\x{00AD}"), - Pattern.compile("[\\x{E000}-\\x{F8FF}\\x{FFF0}-\\x{FFFF}]"), - Pattern.compile("[^\\x{0000}-\\x{FFFF}\\p{sc=Han}]") - }; - } - - /** - * Checks if the source text contains any blocklisted characters. - * @param source input text - * @return contains a blocklisted character - */ - private Boolean checkBlocklisted(final CharSequence source) { - for (final Pattern pattern: patterns) { - if (pattern.matcher(source).find()) { - return true; - } - } - - return false; - } - - /** - * Removes any blocklisted characters from the source text. - * @param source input text - * @return a cleaned character sequence - */ - private CharSequence removeBlocklisted(CharSequence source) { - for (final Pattern pattern: patterns) { - source = pattern.matcher(source).replaceAll(""); - } - - return source; - } - - /** - * Filters out any blocklisted characters. - * @param source {@inheritDoc} - * @param start {@inheritDoc} - * @param end {@inheritDoc} - * @param dest {@inheritDoc} - * @param dstart {@inheritDoc} - * @param dend {@inheritDoc} - * @return {@inheritDoc} - */ - @Override - public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, - int dend) { - if (checkBlocklisted(source)) { - if (start == dstart && dest.length() > 0) { - return dest; - } - - return removeBlocklisted(source); - } - return null; - } -} \ No newline at end of file diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadMediaDetailInputFilter.kt b/app/src/main/java/fr/free/nrw/commons/upload/UploadMediaDetailInputFilter.kt new file mode 100644 index 000000000..d4baf21c8 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadMediaDetailInputFilter.kt @@ -0,0 +1,69 @@ +package fr.free.nrw.commons.upload + +import android.text.InputFilter +import android.text.Spanned +import java.util.regex.Pattern + +/** + * An [InputFilter] class that removes characters blocklisted in Wikimedia titles. The list + * of blocklisted characters is linked below. + * @see [](https://commons.wikimedia.org/wiki/MediaWiki:Titleblacklist)wikimedia.org + */ +class UploadMediaDetailInputFilter : InputFilter { + private val patterns = listOf( + Pattern.compile("[\\x{00A0}\\x{1680}\\x{180E}\\x{2000}-\\x{200B}\\x{2028}\\x{2029}\\x{202F}\\x{205F}]"), + Pattern.compile("[\\x{202A}-\\x{202E}]"), + Pattern.compile("\\p{Cc}"), + Pattern.compile("\\x{3A}"), // Added for colon(:) + Pattern.compile("\\x{FEFF}"), + Pattern.compile("\\x{00AD}"), + Pattern.compile("[\\x{E000}-\\x{F8FF}\\x{FFF0}-\\x{FFFF}]"), + Pattern.compile("[^\\x{0000}-\\x{FFFF}\\p{sc=Han}]") + ) + + /** + * Checks if the source text contains any blocklisted characters. + * @param source input text + * @return contains a blocklisted character + */ + private fun checkBlocklisted(source: CharSequence): Boolean = + patterns.any { it.matcher(source).find() } + + /** + * Removes any blocklisted characters from the source text. + * @param source input text + * @return a cleaned character sequence + */ + private fun removeBlocklisted(input: CharSequence): CharSequence { + var source = input + patterns.forEach { + source = it.matcher(source).replaceAll("") + } + + return source + } + + /** + * Filters out any blocklisted characters. + * @param source {@inheritDoc} + * @param start {@inheritDoc} + * @param end {@inheritDoc} + * @param dest {@inheritDoc} + * @param dstart {@inheritDoc} + * @param dend {@inheritDoc} + * @return {@inheritDoc} + */ + override fun filter( + source: CharSequence, start: Int, end: Int, dest: Spanned, dstart: Int, + dend: Int + ): CharSequence? { + if (checkBlocklisted(source)) { + if (start == dstart && dest.isNotEmpty()) { + return dest + } + + return removeBlocklisted(source) + } + return null + } +} \ No newline at end of file