refactor: Improve XML performance (#139)

This commit is contained in:
kitadai31 2025-02-12 09:54:06 +09:00 committed by GitHub
parent fae60e63df
commit 325b43e394
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 58 additions and 52 deletions

View File

@ -112,10 +112,11 @@ val darkThemePatch = resourcePatch(
.valueOrThrow() .valueOrThrow()
document("res/values/colors.xml").use { document -> document("res/values/colors.xml").use { document ->
val resourcesNode = document.getElementsByTagName("resources").item(0) as Element val resourcesNode = document.documentElement
val childNodes = resourcesNode.childNodes
for (i in 0 until resourcesNode.childNodes.length) { for (i in 0 until childNodes.length) {
val node = resourcesNode.childNodes.item(i) as? Element ?: continue val node = childNodes.item(i) as? Element ?: continue
val colorName = node.getAttribute("name") val colorName = node.getAttribute("name")
if (DARK_COLOR.contains(colorName)) { if (DARK_COLOR.contains(colorName)) {

View File

@ -37,8 +37,9 @@ private fun ResourcePatchContext.patchXmlFile(
val parentList = document.getElementsByTagName(parentNode).item(0) as Element val parentList = document.getElementsByTagName(parentNode).item(0) as Element
if (targetNode != null) { if (targetNode != null) {
for (i in 0 until parentList.childNodes.length) { val childNodes = parentList.childNodes
val node = parentList.childNodes.item(i) as? Element ?: continue for (i in 0 until childNodes.length) {
val node = childNodes.item(i) as? Element ?: continue
if (node.nodeName == targetNode && node.hasAttribute(attribute)) { if (node.nodeName == targetNode && node.hasAttribute(attribute)) {
node.getAttributeNode(attribute).textContent = newValue node.getAttributeNode(attribute).textContent = newValue

View File

@ -123,21 +123,22 @@ fun ResourcePatchContext.baseTranslationsPatch(
}.toHashSet().toTypedArray() }.toHashSet().toTypedArray()
// Remove unselected app languages from RVX Settings // Remove unselected app languages from RVX Settings
setOf( document("res/values/arrays.xml").use { document ->
val targetAttributeNames = setOf(
"revanced_language_entries", "revanced_language_entries",
"revanced_language_entry_values", "revanced_language_entry_values",
).forEach { attributeName -> )
document("res/values/arrays.xml").use { document ->
with(document) {
val nodesToRemove = mutableListOf<Node>() val nodesToRemove = mutableListOf<Node>()
val resourcesNode = getElementsByTagName("resources").item(0) as Element val resourcesNode = document.documentElement
for (i in 0 until resourcesNode.childNodes.length) { val childNodes = resourcesNode.childNodes
val node = resourcesNode.childNodes.item(i) as? Element ?: continue for (i in 0 until childNodes.length) {
val node = childNodes.item(i) as? Element ?: continue
if (node.getAttribute("name") == attributeName) { if (node.getAttribute("name") in targetAttributeNames) {
for (j in 0 until node.childNodes.length) { val itemNodes = node.childNodes
val item = node.childNodes.item(j) as? Element ?: continue for (j in 0 until itemNodes.length) {
val item = itemNodes.item(j) as? Element ?: continue
val text = item.textContent val text = item.textContent
val length = text.length val length = text.length
if (!text.endsWith("DEFAULT") && text.subSequence(length - 2, length) !in filteredAppLanguages) { if (!text.endsWith("DEFAULT") && text.subSequence(length - 2, length) !in filteredAppLanguages) {
@ -153,8 +154,6 @@ fun ResourcePatchContext.baseTranslationsPatch(
} }
} }
} }
}
}
/** /**
* Extension function to ResourceContext to copy XML translation files. * Extension function to ResourceContext to copy XML translation files.

View File

@ -348,14 +348,16 @@ val snackBarComponentsPatch = resourcePatch(
} }
document("res/values/dimens.xml").use { document -> document("res/values/dimens.xml").use { document ->
val resourcesNode = document.getElementsByTagName("resources").item(0) as Element val resourcesNode = document.documentElement
val childNodes = resourcesNode.childNodes
for (i in 0 until resourcesNode.childNodes.length) { for (i in 0 until childNodes.length) {
val node = resourcesNode.childNodes.item(i) as? Element ?: continue val node = childNodes.item(i) as? Element ?: continue
val dimenName = node.getAttribute("name") val dimenName = node.getAttribute("name")
if (dimenName.equals("snackbar_corner_radius")) { if (dimenName.equals("snackbar_corner_radius")) {
node.textContent = cornerRadius node.textContent = cornerRadius
break
} }
} }
} }

View File

@ -77,10 +77,11 @@ val themePatch = resourcePatch(
arrayOf("values", "values-v31").forEach { path -> arrayOf("values", "values-v31").forEach { path ->
document("res/$path/colors.xml").use { document -> document("res/$path/colors.xml").use { document ->
val resourcesNode = document.getElementsByTagName("resources").item(0) as Element val resourcesNode = document.documentElement
val childNodes = resourcesNode.childNodes
for (i in 0 until resourcesNode.childNodes.length) { for (i in 0 until childNodes.length) {
val node = resourcesNode.childNodes.item(i) as? Element ?: continue val node = childNodes.item(i) as? Element ?: continue
node.textContent = when (node.getAttribute("name")) { node.textContent = when (node.getAttribute("name")) {
"yt_black0", "yt_black1", "yt_black1_opacity95", "yt_black1_opacity98", "yt_black2", "yt_black3", "yt_black0", "yt_black1", "yt_black1_opacity95", "yt_black1_opacity98", "yt_black2", "yt_black3",

View File

@ -223,22 +223,21 @@ val settingsPatch = resourcePatch(
/** /**
* remove ReVanced Extended Settings divider * remove ReVanced Extended Settings divider
*/ */
arrayOf("Theme.YouTube.Settings", "Theme.YouTube.Settings.Dark").forEach { themeName ->
document("res/values/styles.xml").use { document -> document("res/values/styles.xml").use { document ->
val themeNames = arrayOf("Theme.YouTube.Settings", "Theme.YouTube.Settings.Dark")
with(document) { with(document) {
val resourcesNode = getElementsByTagName("resources").item(0) as Element val resourcesNode = documentElement
val childNodes = resourcesNode.childNodes
val newElement: Element = createElement("item") for (i in 0 until childNodes.length) {
newElement.setAttribute("name", "android:listDivider") val node = childNodes.item(i) as? Element ?: continue
for (i in 0 until resourcesNode.childNodes.length) { if (node.getAttribute("name") in themeNames) {
val node = resourcesNode.childNodes.item(i) as? Element ?: continue val newElement = createElement("item").apply {
setAttribute("name", "android:listDivider")
if (node.getAttribute("name") == themeName) { appendChild(createTextNode("@null"))
newElement.appendChild(createTextNode("@null"))
node.appendChild(newElement)
} }
node.appendChild(newElement)
} }
} }
} }

View File

@ -55,7 +55,8 @@ fun Node.cloneNodes(parent: Node) {
*/ */
fun Node.doRecursively(action: (Node) -> Unit) { fun Node.doRecursively(action: (Node) -> Unit) {
action(this) action(this)
for (i in 0 until this.childNodes.length) this.childNodes.item(i).doRecursively(action) val childNodes = this.childNodes
for (i in 0 until childNodes.length) childNodes.item(i).doRecursively(action)
} }
fun List<String>.getResourceGroup(fileNames: Array<String>) = map { directory -> fun List<String>.getResourceGroup(fileNames: Array<String>) = map { directory ->
@ -164,10 +165,11 @@ fun ResourcePatchContext.addEntryValues(
) { ) {
document(path).use { document -> document(path).use { document ->
with(document) { with(document) {
val resourcesNode = getElementsByTagName("resources").item(0) as Element val resourcesNode = documentElement
val childNodes = resourcesNode.childNodes
val newElement: Element = createElement("item") val newElement: Element = createElement("item")
for (i in 0 until resourcesNode.childNodes.length) { for (i in 0 until childNodes.length) {
val node = resourcesNode.childNodes.item(i) as? Element ?: continue val node = childNodes.item(i) as? Element ?: continue
if (node.getAttribute("name") == attributeName) { if (node.getAttribute("name") == attributeName) {
newElement.appendChild(createTextNode(attributeValue)) newElement.appendChild(createTextNode(attributeValue))
@ -177,6 +179,7 @@ fun ResourcePatchContext.addEntryValues(
} else { } else {
node.insertBefore(newElement, node.firstChild) node.insertBefore(newElement, node.firstChild)
} }
break
} }
} }
} }