Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -18,17 +18,21 @@ abstract class LibresStringGenerationTask : DefaultTask() {

@get:InputFiles
@get:PathSensitive(PathSensitivity.RELATIVE)
internal abstract var inputDirectory: FileCollection
internal abstract var inputDirectories: List<FileCollection>

@get:OutputDirectory
internal abstract var outputDirectory: File

@TaskAction
fun apply() {
inputDirectory.files
.takeIf { files -> files.isNotEmpty() }
?.let { files -> parseStringResources(files, settings.baseLocaleLanguageCode) }
?.takeIf { resources -> resources.getValue(settings.baseLocaleLanguageCode).isNotEmpty() }
inputDirectories
.mapNotNull { fileCollection ->
fileCollection.files.takeIf { files -> files.isNotEmpty() }
}
.let { listFiles ->
parseStringResources(listFiles, settings.baseLocaleLanguageCode)
}
.takeIf { resources -> resources.getValue(settings.baseLocaleLanguageCode).isNotEmpty() }
?.let { resources -> buildResources(resources) }
?: buildEmptyResources()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ class ResourcesPlugin : Plugin<Project> {
private var isKotlin = false

private lateinit var pluginExtension: ResourcesPluginExtension
private lateinit var inputDirectory: File
private lateinit var inputDirectories: List<File>
private lateinit var mainSourceSet: PluginSourceSet
private val allSourceSets = mutableListOf<PluginSourceSet>()
private var outputPackageName: String? = null
Expand Down Expand Up @@ -99,31 +99,31 @@ class ResourcesPlugin : Plugin<Project> {

when {
commonSourceSet != null -> {
inputDirectory = commonSourceSet.resources.sourceDirectories.first().resolveSibling("libres")
inputDirectories = commonSourceSet.resources.sourceDirectories.map { it.resolveSibling("libres") }
mainSourceSet = commonSourceSet.createKotlinSourceSet(outputDirectory, KotlinPlatform.Common)
allSourceSets += kotlinExtension.targets.takeKotlinSourceSet(outputDirectory)
if (androidExtension != null) allSourceSets += androidExtension.findAndroidSourceSet(true, outputDirectory, kotlinExtension)
allSourceSets += mainSourceSet
}
androidExtension != null -> {
val androidMainSourceSet = androidExtension.sourceSets.getByName(SourceSet.MAIN_SOURCE_SET_NAME)
inputDirectory = androidMainSourceSet.resources.srcDirs.first().resolveSibling("libres")
inputDirectories = androidMainSourceSet.resources.srcDirs.map { it.resolveSibling("libres") }
mainSourceSet = androidExtension.findAndroidSourceSet(false, outputDirectory, kotlinExtension)
allSourceSets += mainSourceSet
}
else -> {
val target = kotlinExtension.targets.firstOrNull { it.platform != null } ?: return
val defaultSourceSet = target.compilations.firstOrNull { it.isMainCompilation }?.defaultSourceSet ?: return
mainSourceSet = defaultSourceSet.createKotlinSourceSet(outputDirectory, target.platform!!)
inputDirectory = defaultSourceSet.resources.sourceDirectories.first().resolveSibling("libres")
inputDirectories = defaultSourceSet.resources.sourceDirectories.map { it.resolveSibling("libres") }
allSourceSets += mainSourceSet
}
}
}

private fun Project.registerGeneratorsTasks() {
val stringsInputDirectory = File(inputDirectory, "strings")
val imagesInputDirectory = File(inputDirectory, "images")
val stringsInputDirectory = inputDirectories.map { File(it, "strings") }
val imagesInputDirectory = inputDirectories.map { File(it, "images") }
val stringsOutputPackageName = listOfNotNull(outputPackageName, "strings").joinToString(".")
val imagesOutputPackageName = listOfNotNull(outputPackageName, "images").joinToString(".")

Expand All @@ -136,9 +136,11 @@ class ResourcesPlugin : Plugin<Project> {
baseLocaleLanguageCode = pluginExtension.baseLocaleLanguageCode,
camelCaseForApple = pluginExtension.camelCaseNamesForAppleFramework && allSourceSets.any { it.platform == KotlinPlatform.Apple }
)
task.inputDirectory = fileTree(stringsInputDirectory) { config ->
config.include { element ->
!element.isDirectory && element.file.extension.lowercase() in STRINGS_EXTENSIONS
task.inputDirectories = stringsInputDirectory.map { dir ->
fileTree(dir) { config ->
config.include { element ->
!element.isDirectory && element.file.extension.lowercase() in STRINGS_EXTENSIONS
}
}
}
task.outputDirectory = mainSourceSet.sourcesDir.toOutputDirectory(stringsOutputPackageName)
Expand All @@ -152,11 +154,24 @@ class ResourcesPlugin : Plugin<Project> {
camelCaseForApple = pluginExtension.camelCaseNamesForAppleFramework,
appleBundleName = project.appleBundleName
)
task.inputDirectory = fileTree(imagesInputDirectory) { config ->
config.include { element ->
!element.isDirectory && element.file.extension.lowercase() in IMAGES_EXTENSIONS

imagesInputDirectory.map { dir ->
fileTree(dir) { config ->
config.include { element ->
!element.isDirectory && element.file.extension.lowercase() in IMAGES_EXTENSIONS
}
}
}

task.inputDirectory = imagesInputDirectory.map { dir ->
fileTree(dir) { config ->
config.include { element ->
!element.isDirectory && element.file.extension.lowercase() in IMAGES_EXTENSIONS
}
}.filter { true }
}.reduce { fileCollectionLeft, fileCollectionRight ->
fileCollectionLeft + fileCollectionRight
}
task.outputSourcesDirectories = allSourceSets.associateBy(PluginSourceSet::platform) {
it.sourcesDir.toOutputDirectory(imagesOutputPackageName)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,29 @@ private typealias Resources = Map<LanguageCode, List<TextResource>>

private val xmlMapper = XmlMapper()

internal fun parseStringResources(inputFiles: Set<File>, baseLocaleLanguageCode: LanguageCode): Resources {
val filesByLocale = inputFiles.groupBy { it.name.substringAfterLast("_").substringBefore(".") }
if (filesByLocale[baseLocaleLanguageCode].isNullOrEmpty()) throw BaseStringResourcesNotFoundException()

val resources = filesByLocale.mapValues { (_, files) -> files.map(xmlMapper::readTree).flatMap(JsonNode::parseResources) }
internal fun parseStringResources(
listInputFiles: List<Set<File>>,
baseLocaleLanguageCode: LanguageCode
): Resources {
val resources = listInputFiles
.map { inputFiles ->
val filesByLocale =
inputFiles.groupBy { it.name.substringAfterLast("_").substringBefore(".") }

if (filesByLocale[baseLocaleLanguageCode].isNullOrEmpty()) throw BaseStringResourcesNotFoundException()

filesByLocale.mapValues { (_, files) -> files.map(xmlMapper::readTree).flatMap(JsonNode::parseResources) }
}
.fold(mutableMapOf<String, MutableMap<String, TextResource>>()) { mutableAccumulator, resource ->
for ((lang, list) in resource) {
mutableAccumulator.getOrPut(lang, ::mutableMapOf).putAll(list.associateBy { it.name })
}
mutableAccumulator
}
.map { (lang, map) ->
lang to map.values.toList()
}
.toMap()
resources.validateNames(baseLocaleLanguageCode)
resources.validateDuplicatesAndArguments()
return resources
Expand Down