From ca21fb6c8847a5b4dcff80be51bf69e548a18765 Mon Sep 17 00:00:00 2001 From: Karenkov Igor Date: Tue, 16 Jul 2019 21:34:48 +0300 Subject: [PATCH] stringGenerator migrated to kotlin dsl --- gradle/stringGenerator.gradle | 92 -------------------------- gradle/stringGenerator.gradle.kts | 105 ++++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+), 92 deletions(-) delete mode 100644 gradle/stringGenerator.gradle create mode 100644 gradle/stringGenerator.gradle.kts diff --git a/gradle/stringGenerator.gradle b/gradle/stringGenerator.gradle deleted file mode 100644 index 26bc127..0000000 --- a/gradle/stringGenerator.gradle +++ /dev/null @@ -1,92 +0,0 @@ -import groovy.json.JsonSlurper -import groovy.xml.MarkupBuilder - -task stringGenerator { - generate(languageMap) - println("Strings generated!") -} - -private def generate(Map sources) { - 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) - 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 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 getJsonsMap(Map sources) { - return sources.collectEntries { - [(it.key): new JsonSlurper().parseText(new File(it.value).text)] - } -} - -private static File getFile(String key, boolean defaultLang) { - if (defaultLang) { - return new File("app/src/main/res/values/strings.xml") - } else { - def directory = new File("app/src/main/res/values-$key") - if (!directory.exists()) { - directory.mkdir() - } - return new File("app/src/main/res/values-$key/strings.xml") - } -} - -private static String getDefaultLangKey(Map sources) { - def defaultLanguage = sources.find { it.value.contains("default") } - if (defaultLanguage != null) { - return defaultLanguage.key - } else { - throw new IOException("Can't find default language") - } - -} diff --git a/gradle/stringGenerator.gradle.kts b/gradle/stringGenerator.gradle.kts new file mode 100644 index 0000000..6ff6221 --- /dev/null +++ b/gradle/stringGenerator.gradle.kts @@ -0,0 +1,105 @@ +import com.google.gson.JsonObject +import com.google.gson.JsonParser +import org.redundent.kotlin.xml.PrintOptions +import org.redundent.kotlin.xml.xml + +buildscript { + repositories { + jcenter() + } + dependencies { + classpath("org.redundent:kotlin-xml-builder:1.5.1") + classpath("com.google.code.gson:gson:2.8.5") + } +} + +task("stringGenerator") { + val languageMap: Map? by rootProject.extra + generate(languageMap) + println("Strings generated!") +} + +fun generate(sources: Map?) { + if (sources == null || sources.isEmpty()) { + throw java.io.IOException("languageMap can't be null or empty") + } + val jsonMap = getJsonsMap(sources) + val diffs = calcDiffs(jsonMap) + if (diffs.isNotEmpty()) { + printDiffs(diffs) + throw IllegalStateException("Strings source can't be different") + } + val defaultLang = getDefaultLangKey(sources) + jsonMap.forEach { (key, json) -> + val xmlString = xml("resources") { + includeXmlProlog = true + json.entrySet().forEach { + "string" { + attribute("name", it.key) + attribute("formatted", "false") + -it.value.asString.replace("\n", "\\n") + } + } + } + + val stringsFile = getFile(key, key == defaultLang) + stringsFile.writeText(xmlString.toString(PrintOptions(singleLineTextElements = true))) + } +} + +fun printDiffs(diffs: Map>) { + val diffLog = StringBuilder() + diffs.forEach { (key, value) -> + if (value.isNotEmpty()) { + diffLog.append("For $key was missed string keys: ${value.size}\n") + value.forEach { + diffLog.append("\tString key: $it\n") + } + } + } + println(diffLog.toString()) +} + +fun calcDiffs(jsonsMap: Map): Map> { + if (jsonsMap.size == 1) { + return emptyMap() + } + val keys = jsonsMap.mapValues { + it.value.keySet().toList() + } + val inclusive = keys[keys.keys.first()]!!.toSet() + return keys.mapValues { + inclusive - it.value.intersect(inclusive) + }.filter { it.value.isNotEmpty() } +} + +fun getJsonsMap(sources: Map): Map { + return sources.mapValues { + JsonParser().parse(File(it.value).readText()).asJsonObject + } +} + +fun getFile(key: String, defaultLang: Boolean): File { + if (defaultLang) { + return File("app/src/main/res/values/strings.xml") + } else { + val directory = File("app/src/main/res/values-$key") + if (!directory.exists()) { + directory.mkdir() + } + return File("app/src/main/res/values-$key/strings.xml") + } +} + +fun getDefaultLangKey(sources: Map): String { + val defaultLanguage = sources + .filter { it.value.contains("default") } + .iterator().run { + if (hasNext()) next() else null + } + if (defaultLanguage != null) { + return defaultLanguage.key + } else { + throw java.io.IOException("Can't find default language") + } +}