mirror of
https://github.com/ankidroid/Anki-Android.git
synced 2024-09-20 03:52:15 +02:00
Detect invalid capital letters
This commit is contained in:
parent
100f219b09
commit
d0e16f7d56
@ -36,8 +36,11 @@ import java.util.*
|
|||||||
import java.util.regex.Pattern
|
import java.util.regex.Pattern
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fix for "Linting Error - String format should be valid."
|
* Fix for 2 issues
|
||||||
|
* 1. "Linting Error - String format should be valid."
|
||||||
* [https://github.com/ankidroid/Anki-Android/issues/10604](https://github.com/ankidroid/Anki-Android/issues/10604)
|
* [https://github.com/ankidroid/Anki-Android/issues/10604](https://github.com/ankidroid/Anki-Android/issues/10604)
|
||||||
|
* 2."Check formatters like %1$D"
|
||||||
|
* https://github.com/ankidroid/Anki-Android/issues/14079
|
||||||
*/
|
*/
|
||||||
class InvalidStringFormatDetector : ResourceXmlDetector() {
|
class InvalidStringFormatDetector : ResourceXmlDetector() {
|
||||||
companion object {
|
companion object {
|
||||||
@ -58,6 +61,14 @@ class InvalidStringFormatDetector : ResourceXmlDetector() {
|
|||||||
)
|
)
|
||||||
|
|
||||||
private val INVALID_FORMAT_PATTERN = Pattern.compile("[^%]+%").toRegex()
|
private val INVALID_FORMAT_PATTERN = Pattern.compile("[^%]+%").toRegex()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* (?<!%)% => should match %, but does not match if there's another % immediately to the left
|
||||||
|
* [^%a-zA-Z]* => should match any characters (zero or more) that are not %, alphabetical or whitespace
|
||||||
|
* [DFNOGC] => should match any of the capital characters that cause the errors
|
||||||
|
* .* => can match any non whitespace characters (zero or more) following the format specifier
|
||||||
|
*/
|
||||||
|
private val INVALID_CAPITALIZATION = Pattern.compile("(?<!%)%[^%a-zA-Z]*[DFNOGC].*").toRegex()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun appliesTo(folderType: ResourceFolderType): Boolean =
|
override fun appliesTo(folderType: ResourceFolderType): Boolean =
|
||||||
@ -104,6 +115,19 @@ class InvalidStringFormatDetector : ResourceXmlDetector() {
|
|||||||
"eg: 'I have completed% %s cards.' "
|
"eg: 'I have completed% %s cards.' "
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (it.matches(INVALID_CAPITALIZATION)) {
|
||||||
|
val location = context.createLocationHandle(element).resolve()
|
||||||
|
context.report(
|
||||||
|
ISSUE,
|
||||||
|
location,
|
||||||
|
"Formatted string should not use capital letter. " +
|
||||||
|
"eg: %D, %1D, %9D, %-9D, %1\$D, " +
|
||||||
|
"%F, %1F, %9F, %-9F, %1\$F, " +
|
||||||
|
"%N, %O, %G, %C " +
|
||||||
|
"should all be in lowercase."
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -54,6 +54,66 @@ class InvalidStringFormatDetectorTest {
|
|||||||
|</resources>
|
|</resources>
|
||||||
""".trimMargin()
|
""".trimMargin()
|
||||||
|
|
||||||
|
@Language("XML")
|
||||||
|
private val invalidCapitalization = """<resources>
|
||||||
|
|<string name="testString">%D</string>
|
||||||
|
|<string name="testString2">%1D</string>
|
||||||
|
|<string name="testString3">%9D</string>
|
||||||
|
|<string name="testString4">%-9D</string>
|
||||||
|
|<string name="testString5">%1${'$'}D</string>
|
||||||
|
|<string name="testString6">%F</string>
|
||||||
|
|<string name="testString7">%1F</string>
|
||||||
|
|<string name="testString8">%9F</string>
|
||||||
|
|<string name="testString9">%-9F</string>
|
||||||
|
|<string name="testString10">%1${'$'}F</string>
|
||||||
|
|<string name="testString11">%N</string>
|
||||||
|
|<string name="testString12">%O</string>
|
||||||
|
|<string name="testString13">%G</string>
|
||||||
|
|<string name="testString14">%C</string>
|
||||||
|
|<string name="testString15">%D %1D %9D %-9D %1${'$'}D %F %1F %9F %-9F %1${'$'}F %N %O %G %C</string>
|
||||||
|
|<string name="testString16">% %D</string>
|
||||||
|
|<string name="testString17">%D%</string>
|
||||||
|
|<string name="testString18">%D%%</string>
|
||||||
|
|<plurals name="pluralTestString1">
|
||||||
|
<item quantity="other">%2${'$'}D</item>
|
||||||
|
</plurals>
|
||||||
|
|</resources>
|
||||||
|
""".trimMargin()
|
||||||
|
|
||||||
|
@Language("XML")
|
||||||
|
private val validCapitalization = """<resources>
|
||||||
|
|<string name="testString">%d</string>
|
||||||
|
|<string name="testString2">%1d</string>
|
||||||
|
|<string name="testString3">%9d</string>
|
||||||
|
|<string name="testString4">%-9d</string>
|
||||||
|
|<string name="testString5">%1${'$'}d</string>
|
||||||
|
|<string name="testString6">%f</string>
|
||||||
|
|<string name="testString7">%1f</string>
|
||||||
|
|<string name="testString8">%9f</string>
|
||||||
|
|<string name="testString9">%-9f</string>
|
||||||
|
|<string name="testString10">%1${'$'}f</string>
|
||||||
|
|<string name="testString11">%n</string>
|
||||||
|
|<string name="testString12">%o</string>
|
||||||
|
|<string name="testString13">%g</string>
|
||||||
|
|<string name="testString14">%c</string>
|
||||||
|
|<string name="testString15">%d %1d %9d %-9d %1${'$'}d %f %1f %9f %-9f %1${'$'}f %n %o %g %c</string>
|
||||||
|
|<string name="testString16">% %d</string>
|
||||||
|
|<string name="testString16">%%D</string>
|
||||||
|
|<string name="testString17">% D</string>
|
||||||
|
|<string name="testString18">%d%</string>
|
||||||
|
|<string name="testString19">%d%%</string>
|
||||||
|
|<string name="testString20">%abcd</string>
|
||||||
|
|<string name="testString21">%S %X %T %E %H %B %A</string>
|
||||||
|
|<string name="testString22">%S %1S %9S %-9S %1${'$'}S</string>
|
||||||
|
|<string name="testString23">%1{'$'}d\nDatabase version</string>
|
||||||
|
|<string name="testString24">%abcD</string>
|
||||||
|
|<string name="testString25">%abcDefg</string>
|
||||||
|
|<plurals name="pluralTestString1">
|
||||||
|
<item quantity="other">Hello hello %2${'$'}d hello hello</item>
|
||||||
|
</plurals>
|
||||||
|
|</resources>
|
||||||
|
""".trimMargin()
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun error_if_string_format_invalid() {
|
fun error_if_string_format_invalid() {
|
||||||
TestLintTask.lint()
|
TestLintTask.lint()
|
||||||
@ -76,4 +136,27 @@ class InvalidStringFormatDetectorTest {
|
|||||||
.run()
|
.run()
|
||||||
.expectClean()
|
.expectClean()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun error_if_capitalization_invalid() {
|
||||||
|
TestLintTask.lint()
|
||||||
|
.allowMissingSdk()
|
||||||
|
.allowCompilationErrors()
|
||||||
|
.allowDuplicates()
|
||||||
|
.files(TestFiles.xml("res/values/string.xml", invalidCapitalization))
|
||||||
|
.issues(InvalidStringFormatDetector.ISSUE)
|
||||||
|
.run()
|
||||||
|
.expectErrorCount(19)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun no_error_if_capitalization_valid() {
|
||||||
|
TestLintTask.lint()
|
||||||
|
.allowMissingSdk()
|
||||||
|
.allowCompilationErrors()
|
||||||
|
.files(TestFiles.xml("res/values/string.xml", validCapitalization))
|
||||||
|
.issues(InvalidStringFormatDetector.ISSUE)
|
||||||
|
.run()
|
||||||
|
.expectClean()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user