-
Notifications
You must be signed in to change notification settings - Fork 120
/
AndroidPluralsGenerator.kt
79 lines (65 loc) · 2.61 KB
/
AndroidPluralsGenerator.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/*
* Copyright 2020 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license.
*/
package dev.icerock.gradle.generator.android
import com.squareup.kotlinpoet.ClassName
import com.squareup.kotlinpoet.CodeBlock
import com.squareup.kotlinpoet.KModifier
import dev.icerock.gradle.generator.PluralMap
import dev.icerock.gradle.generator.PluralsGenerator
import dev.icerock.gradle.generator.KeyType
import dev.icerock.gradle.generator.NOPObjectBodyExtendable
import dev.icerock.gradle.generator.ObjectBodyExtendable
import org.apache.commons.lang3.StringEscapeUtils
import org.gradle.api.file.FileTree
import java.io.File
class AndroidPluralsGenerator(
pluralsFileTree: FileTree,
strictLineBreaks: Boolean,
private val getAndroidRClassPackage: () -> String
) : PluralsGenerator(pluralsFileTree, strictLineBreaks),
ObjectBodyExtendable by NOPObjectBodyExtendable() {
override fun getClassModifiers(): Array<KModifier> = arrayOf(KModifier.ACTUAL)
override fun getPropertyModifiers(): Array<KModifier> = arrayOf(KModifier.ACTUAL)
override fun getPropertyInitializer(key: String) =
CodeBlock.of("PluralsResource(R.plurals.%L)", processKey(key))
override fun getImports(): List<ClassName> = listOf(
ClassName(getAndroidRClassPackage(), "R")
)
override fun generateResources(
resourcesGenerationDir: File,
language: String?,
strings: Map<KeyType, PluralMap>
) {
val valuesDirName = when (language) {
null -> "values"
else -> "values-$language"
}
val valuesDir = File(resourcesGenerationDir, valuesDirName)
val stringsFile = File(valuesDir, "multiplatform_plurals.xml")
valuesDir.mkdirs()
val header = """
<?xml version="1.0" encoding="utf-8"?>
<resources>
""".trimIndent()
val content = strings.map { (key, pluralMap) ->
val processedKey = processKey(key)
val start = "\t<plurals name=\"$processedKey\">\n"
val items = pluralMap.map { (quantity, value) ->
val processedValue = StringEscapeUtils.escapeXml(value)
"\t\t<item quantity=\"$quantity\">$processedValue</item>"
}.joinToString("\n")
val end = "\n\t</plurals>"
start + items + end
}.joinToString("\n")
val footer = """
</resources>
""".trimIndent()
stringsFile.writeText(header + "\n")
stringsFile.appendText(content)
stringsFile.appendText("\n" + footer)
}
private fun processKey(key: String): String {
return key.replace(".", "_")
}
}