99 lines
2.8 KiB
Groovy
99 lines
2.8 KiB
Groovy
import groovy.json.JsonSlurper
|
|
import groovy.xml.MarkupBuilder
|
|
|
|
tasks.register('stringGenerator') {
|
|
def sources = android.languageMap
|
|
|
|
outputs.files(sources)
|
|
|
|
doLast {
|
|
generate(sources, project)
|
|
println("Strings generated!")
|
|
}
|
|
}
|
|
|
|
private def generate(Map<String, String> sources, Project project) {
|
|
if (sources == null || sources.isEmpty()) {
|
|
throw new IOException("languageMap can't be null or empty")
|
|
}
|
|
Map jsonMap = getJsonsMap(sources)
|
|
def diffs = calcDiffs(jsonMap)
|
|
if (!diffs.isEmpty()) {
|
|
printDiffs(diffs)
|
|
throw new IllegalStateException("Strings source can't be different")
|
|
}
|
|
def defaultLang = getDefaultLangKey(sources)
|
|
jsonMap.forEach { key, json ->
|
|
|
|
def sw = new StringWriter()
|
|
def xml = new MarkupBuilder(sw)
|
|
|
|
xml.setDoubleQuotes(true)
|
|
xml.mkp.xmlDeclaration(version: "1.0", encoding: "utf-8")
|
|
xml.resources() {
|
|
json.each {
|
|
k, v ->
|
|
string(name: "${k}", formatted: "false", "${v}".replace('\n', '\\n'))
|
|
}
|
|
}
|
|
|
|
def stringsFile = getFile(key, key == defaultLang, project)
|
|
stringsFile.write(sw.toString(), "UTF-8")
|
|
}
|
|
}
|
|
|
|
private printDiffs(Map<?, ?> diffs) {
|
|
def diffLog = new StringBuilder()
|
|
diffs.forEach { k, v ->
|
|
if (v.size() > 0) {
|
|
diffLog.append("For $k was missed string keys: ${v.size()}\n")
|
|
v.forEach {
|
|
diffLog.append("\tString key: $it\n")
|
|
}
|
|
}
|
|
}
|
|
println(diffLog.toString())
|
|
}
|
|
|
|
private static def calcDiffs(Map<String, Object> jsonsMap) {
|
|
if (jsonsMap.size() == 1) {
|
|
return [:]
|
|
}
|
|
def keys = jsonsMap.collectEntries {
|
|
[(it.key): (it.value).keySet() as List]
|
|
}
|
|
def inclusive = keys.get(keys.keySet().first())
|
|
def diffs = keys.collectEntries {
|
|
[(it.key): inclusive - it.value.intersect(inclusive)]
|
|
}.findAll { it.value.size() > 0 }
|
|
return diffs
|
|
}
|
|
|
|
private static Map<String, Object> getJsonsMap(Map sources) {
|
|
return sources.collectEntries {
|
|
[(it.key): new JsonSlurper().parseText(new File(it.value).text)]
|
|
}
|
|
}
|
|
|
|
private static File getFile(String key, boolean defaultLang, Project project) {
|
|
if (defaultLang) {
|
|
return project.file("src/main/res/values/strings.xml")
|
|
} else {
|
|
def directory = project.file("src/main/res/values-$key")
|
|
if (!directory.exists()) {
|
|
directory.mkdir()
|
|
}
|
|
return project.file("src/main/res/values-$key/strings.xml")
|
|
}
|
|
}
|
|
|
|
private static String getDefaultLangKey(Map<String, String> sources) {
|
|
def defaultLanguage = sources.find { it.value.contains("default") }
|
|
if (defaultLanguage != null) {
|
|
return defaultLanguage.key
|
|
} else {
|
|
throw new IOException("Can't find default language")
|
|
}
|
|
|
|
}
|