refactor: Use raw string resources (#4109)

This commit is contained in:
LisoUseInAIKyrios
2024-12-12 17:01:16 +04:00
committed by GitHub
parent b639476a22
commit c9b1a3bf60
2 changed files with 149 additions and 59 deletions

View File

@ -1,8 +1,8 @@
package app.revanced.util.resource
import app.revanced.patcher.patch.PatchException
import org.w3c.dom.Document
import org.w3c.dom.Node
import java.util.logging.Logger
/**
* A string value.
@ -19,13 +19,36 @@ class StringResource(
) : BaseResource(name, "string") {
override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit) =
super.serialize(ownerDocument, resourceCallback).apply {
fun String.validateAndroidStringEscaping() : String {
if (value.startsWith('"') && value.endsWith('"')) {
// Raw strings allow unescaped single quote but not double quote.
if (!value.substring(1, value.length - 1).contains(Regex("(?<!\\\\)[\"]"))) {
return this;
}
} else {
if (value.contains('\n')) {
// Don't throw an exception, otherwise unnoticed mistakes
// in Crowdin can cause patching failures.
// Incorrectly escaped strings still work but do not display as intended.
Logger.getLogger(StringResource.javaClass.name).severe(
"String $name is not raw but contains encoded new line characters: $value")
}
if (!value.contains(Regex("(?<!\\\\)['\"]"))) {
return this;
}
}
Logger.getLogger(StringResource.javaClass.name).severe(
"String $name cannot contain unescaped quotes in value: $value")
return this;
}
// if the string is un-formatted, explicitly add the formatted attribute
if (!formatted) setAttribute("formatted", "false")
if (value.contains(Regex("(?<!\\\\)['\"]")))
throw PatchException("String $name cannot contain unescaped quotes in value \"$value\".")
textContent = value
textContent = value.validateAndroidStringEscaping();
}
companion object {