| 
 | 1 | +package io.github.composegears.valkyrie.gradle  | 
 | 2 | + | 
 | 3 | +import io.github.composegears.valkyrie.generator.jvm.imagevector.ImageVectorGenerator  | 
 | 4 | +import io.github.composegears.valkyrie.generator.jvm.imagevector.ImageVectorGeneratorConfig  | 
 | 5 | +import io.github.composegears.valkyrie.generator.jvm.imagevector.OutputFormat  | 
 | 6 | +import io.github.composegears.valkyrie.generator.jvm.imagevector.PreviewAnnotationType  | 
 | 7 | +import io.github.composegears.valkyrie.parser.unified.ParserType  | 
 | 8 | +import io.github.composegears.valkyrie.parser.unified.SvgXmlParser  | 
 | 9 | +import io.github.composegears.valkyrie.parser.unified.ext.toIOPath  | 
 | 10 | +import io.github.composegears.valkyrie.sdk.core.extensions.writeToKt  | 
 | 11 | +import kotlinx.io.files.Path  | 
 | 12 | +import org.gradle.api.DefaultTask  | 
 | 13 | +import org.gradle.api.GradleException  | 
 | 14 | +import org.gradle.api.file.ConfigurableFileCollection  | 
 | 15 | +import org.gradle.api.file.DirectoryProperty  | 
 | 16 | +import org.gradle.api.provider.Property  | 
 | 17 | +import org.gradle.api.tasks.CacheableTask  | 
 | 18 | +import org.gradle.api.tasks.Input  | 
 | 19 | +import org.gradle.api.tasks.InputFiles  | 
 | 20 | +import org.gradle.api.tasks.Optional  | 
 | 21 | +import org.gradle.api.tasks.OutputDirectory  | 
 | 22 | +import org.gradle.api.tasks.PathSensitive  | 
 | 23 | +import org.gradle.api.tasks.PathSensitivity.RELATIVE  | 
 | 24 | +import org.gradle.api.tasks.TaskAction  | 
 | 25 | + | 
 | 26 | +@CacheableTask  | 
 | 27 | +abstract class GenerateImageVectorsTask : DefaultTask() {  | 
 | 28 | +    @get:[PathSensitive(RELATIVE) InputFiles] abstract val svgFiles: ConfigurableFileCollection  | 
 | 29 | + | 
 | 30 | +    @get:[PathSensitive(RELATIVE) InputFiles] abstract val drawableFiles: ConfigurableFileCollection  | 
 | 31 | + | 
 | 32 | +    @get:Input abstract val packageName: Property<String>  | 
 | 33 | + | 
 | 34 | +    @get:[Input Optional] abstract val iconPackName: Property<String>  | 
 | 35 | + | 
 | 36 | +    @get:[Input Optional] abstract val nestedPackName: Property<String>  | 
 | 37 | + | 
 | 38 | +    @get:Input abstract val outputFormat: Property<OutputFormat>  | 
 | 39 | + | 
 | 40 | +    @get:Input abstract val useComposeColors: Property<Boolean>  | 
 | 41 | + | 
 | 42 | +    @get:Input abstract val generatePreview: Property<Boolean>  | 
 | 43 | + | 
 | 44 | +    @get:Input abstract val previewAnnotationType: Property<PreviewAnnotationType>  | 
 | 45 | + | 
 | 46 | +    @get:Input abstract val useFlatPackage: Property<Boolean>  | 
 | 47 | + | 
 | 48 | +    @get:Input abstract val useExplicitMode: Property<Boolean>  | 
 | 49 | + | 
 | 50 | +    @get:Input abstract val addTrailingComma: Property<Boolean>  | 
 | 51 | + | 
 | 52 | +    @get:Input abstract val indentSize: Property<Int>  | 
 | 53 | + | 
 | 54 | +    @get:OutputDirectory abstract val outputDirectory: DirectoryProperty  | 
 | 55 | + | 
 | 56 | +    @TaskAction  | 
 | 57 | +    fun execute() {  | 
 | 58 | +        val packageName = packageName.orNull  | 
 | 59 | +            ?: throw GradleException("No package name configured for $this")  | 
 | 60 | + | 
 | 61 | +        // e.g. "<project-root>/build/generated/sources/valkyrie/main"  | 
 | 62 | +        val outputDirectory = outputDirectory.get().asFile  | 
 | 63 | +        outputDirectory.deleteRecursively() // make sure nothing is left over from previous run  | 
 | 64 | +        outputDirectory.mkdirs()  | 
 | 65 | + | 
 | 66 | +        val generatedFiles = arrayListOf<Path>()  | 
 | 67 | +        var fileIndex = 0  | 
 | 68 | + | 
 | 69 | +        val useFlatPackage = useFlatPackage.get()  | 
 | 70 | +        val nestedPackName = nestedPackName.getOrElse("")  | 
 | 71 | +        val config = ImageVectorGeneratorConfig(  | 
 | 72 | +            packageName = packageName,  | 
 | 73 | +            iconPackPackage = packageName,  | 
 | 74 | +            packName = iconPackName.getOrElse(""),  | 
 | 75 | +            nestedPackName = nestedPackName,  | 
 | 76 | +            outputFormat = outputFormat.get(),  | 
 | 77 | +            useComposeColors = useComposeColors.get(),  | 
 | 78 | +            generatePreview = generatePreview.get(),  | 
 | 79 | +            previewAnnotationType = previewAnnotationType.get(),  | 
 | 80 | +            useFlatPackage = useFlatPackage,  | 
 | 81 | +            useExplicitMode = useExplicitMode.get(),  | 
 | 82 | +            addTrailingComma = addTrailingComma.get(),  | 
 | 83 | +            indentSize = indentSize.get(),  | 
 | 84 | +        )  | 
 | 85 | + | 
 | 86 | +        (svgFiles + drawableFiles).files.forEach { file ->  | 
 | 87 | +            val parseOutput = SvgXmlParser.toIrImageVector(ParserType.Jvm, Path(file.absolutePath))  | 
 | 88 | +            val vectorSpecOutput = ImageVectorGenerator.convert(  | 
 | 89 | +                vector = parseOutput.irImageVector,  | 
 | 90 | +                iconName = parseOutput.iconName,  | 
 | 91 | +                config = config,  | 
 | 92 | +            )  | 
 | 93 | + | 
 | 94 | +            val path = vectorSpecOutput.content.writeToKt(  | 
 | 95 | +                outputDir = when {  | 
 | 96 | +                    useFlatPackage -> outputDirectory  | 
 | 97 | +                    else -> outputDirectory.resolve(nestedPackName.lowercase())  | 
 | 98 | +                }.absolutePath,  | 
 | 99 | +                nameWithoutExtension = vectorSpecOutput.name,  | 
 | 100 | +            )  | 
 | 101 | +            generatedFiles.add(path.toIOPath())  | 
 | 102 | +            fileIndex++  | 
 | 103 | +            logger.info("File $fileIndex = $path")  | 
 | 104 | +        }  | 
 | 105 | + | 
 | 106 | +        logger.lifecycle("Generated ${generatedFiles.size} ImageVectors in package $packageName")  | 
 | 107 | +    }  | 
 | 108 | + | 
 | 109 | +    internal companion object {  | 
 | 110 | +        internal const val TASK_NAME = "generateImageVectors"  | 
 | 111 | +    }  | 
 | 112 | +}  | 
0 commit comments