Skip to content

Commit

Permalink
Add option to export ImageVector with trailing comma
Browse files Browse the repository at this point in the history
  • Loading branch information
egorikftp committed Oct 3, 2024
1 parent dc7bc59 commit 9854736
Show file tree
Hide file tree
Showing 23 changed files with 216 additions and 92 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,8 @@ fun CodeBlock.Builder.indention(block: CodeBlock.Builder.() -> Unit) {
fun CodeBlock.Builder.newLine() {
add("\n")
}

fun CodeBlock.Builder.trailingNewLine() {
add(",")
newLine()
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ internal data class ImageVectorSpecConfig(
val generatePreview: Boolean,
val useFlatPackage: Boolean,
val useExplicitMode: Boolean,
val addTrailingComma: Boolean,
)

internal class ImageVectorFileSpec(private val config: ImageVectorSpecConfig) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ data class ImageVectorGeneratorConfig(
val generatePreview: Boolean,
val useFlatPackage: Boolean,
val useExplicitMode: Boolean,
val addTrailingComma: Boolean,
)

enum class OutputFormat(val key: String) {
Expand Down Expand Up @@ -50,6 +51,7 @@ object ImageVectorGenerator {
generatePreview = config.generatePreview,
useFlatPackage = config.useFlatPackage,
useExplicitMode = config.useExplicitMode,
addTrailingComma = config.addTrailingComma,
),
).createFileFor(vector)
}
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,14 @@ internal fun CodeBlock.Builder.addImageVectorBlock(
},
irVector = irVector,
path = {
irVector.nodes.forEach { node -> addVectorNode(node) }
irVector.nodes.forEach { node ->
addVectorNode(
irVectorNode = node,
addTrailingComma = config.addTrailingComma,
)
}
},
addTrailingComma = config.addTrailingComma,
),
)
}
Expand All @@ -73,17 +79,26 @@ internal fun FileSpec.Builder.addPreview(
}
}

private fun CodeBlock.Builder.addVectorNode(irVectorNode: IrVectorNode) {
private fun CodeBlock.Builder.addVectorNode(
irVectorNode: IrVectorNode,
addTrailingComma: Boolean,
) {
when (irVectorNode) {
is IrVectorNode.IrGroup -> {
beginControlFlow("%M", MemberNames.Group)
irVectorNode.paths.forEach { path ->
addVectorNode(path)
addVectorNode(
irVectorNode = path,
addTrailingComma = addTrailingComma,
)
}
endControlFlow()
}
is IrVectorNode.IrPath -> {
addPath(irVectorNode) {
addPath(
path = irVectorNode,
addTrailingComma = addTrailingComma,
) {
irVectorNode.paths.forEach { pathNode ->
// based on https://github.com/square/kotlinpoet/pull/1860#issuecomment-1986825382
addStatement("%L", pathNode.asStatement().replace(' ', '·'))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,29 @@ package io.github.composegears.valkyrie.generator.imagevector.util
import com.squareup.kotlinpoet.CodeBlock
import com.squareup.kotlinpoet.buildCodeBlock
import io.github.composegears.valkyrie.generator.ext.formatFloat
import io.github.composegears.valkyrie.generator.ext.newLine
import io.github.composegears.valkyrie.generator.ext.trailingNewLine
import io.github.composegears.valkyrie.generator.ext.trimTrailingZero
import io.github.composegears.valkyrie.ir.IrImageVector

internal fun imageVectorBuilderSpecs(
iconName: String,
irVector: IrImageVector,
path: CodeBlock.Builder.() -> Unit,
addTrailingComma: Boolean,
): CodeBlock = buildCodeBlock {
add("%T.Builder(\n", ClassNames.ImageVector)
indent()
add("name = %S,\n", iconName)
add("defaultWidth = %L.%M,\n", irVector.defaultWidth.trimTrailingZero(), MemberNames.Dp)
add("defaultHeight = %L.%M,\n", irVector.defaultHeight.trimTrailingZero(), MemberNames.Dp)
add("viewportWidth = %L,\n", irVector.viewportWidth.formatFloat())
add("viewportHeight = %L\n", irVector.viewportHeight.formatFloat())
add("viewportHeight = %L", irVector.viewportHeight.formatFloat())
if (addTrailingComma) {
trailingNewLine()
} else {
newLine()
}
unindent()
add(")")

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import io.github.composegears.valkyrie.generator.ext.formatFloat
import io.github.composegears.valkyrie.generator.ext.indention
import io.github.composegears.valkyrie.generator.ext.newLine
import io.github.composegears.valkyrie.generator.ext.toColorHex
import io.github.composegears.valkyrie.generator.ext.trailingNewLine
import io.github.composegears.valkyrie.generator.imagevector.util.PathParams.FillAlphaParam
import io.github.composegears.valkyrie.generator.imagevector.util.PathParams.FillParam
import io.github.composegears.valkyrie.generator.imagevector.util.PathParams.PathFillTypeParam
Expand All @@ -26,6 +27,7 @@ import io.github.composegears.valkyrie.ir.IrVectorNode

internal fun CodeBlock.Builder.addPath(
path: IrVectorNode.IrPath,
addTrailingComma: Boolean,
pathBody: CodeBlock.Builder.() -> Unit,
) {
val pathParams = path.buildPathParams()
Expand Down Expand Up @@ -55,9 +57,13 @@ internal fun CodeBlock.Builder.addPath(
pathParams.forEachIndexed { index, param ->
fillPathArgs(param)
if (index == pathParams.lastIndex) {
add("\n")
if (addTrailingComma) {
trailingNewLine()
} else {
newLine()
}
} else {
add(",\n")
trailingNewLine()
}
}
unindent()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,33 +3,14 @@ package io.github.composegears.valkyrie.generator.imagevector
import assertk.assertThat
import assertk.assertions.isEqualTo
import io.github.composegears.valkyrie.extensions.ResourceUtils.getResourcePath
import io.github.composegears.valkyrie.generator.imagevector.common.createConfig
import io.github.composegears.valkyrie.generator.imagevector.common.toResourceText
import io.github.composegears.valkyrie.parser.svgxml.SvgXmlParser
import org.junit.jupiter.params.ParameterizedTest
import org.junit.jupiter.params.provider.EnumSource

class CustomPackageTest {

private fun createConfig(
packageName: String = "io.github.composegears.valkyrie.icons",
packName: String = "",
nestedPackName: String = "",
outputFormat: OutputFormat,
generatePreview: Boolean = false,
useFlatPackage: Boolean = true,
useExplicitMode: Boolean = false,
): ImageVectorGeneratorConfig {
return ImageVectorGeneratorConfig(
packageName = packageName,
packName = packName,
nestedPackName = nestedPackName,
outputFormat = outputFormat,
generatePreview = generatePreview,
useFlatPackage = useFlatPackage,
useExplicitMode = useExplicitMode,
)
}

@ParameterizedTest
@EnumSource(value = OutputFormat::class)
fun `flat package without icon pack`(outputFormat: OutputFormat) {
Expand All @@ -38,7 +19,10 @@ class CustomPackageTest {
val output = ImageVectorGenerator.convert(
vector = parserOutput.vector,
kotlinName = parserOutput.kotlinName,
config = createConfig(outputFormat = outputFormat),
config = createConfig(
outputFormat = outputFormat,
useFlatPackage = true,
),
).content

val expected = outputFormat.toResourceText(
Expand All @@ -59,6 +43,7 @@ class CustomPackageTest {
config = createConfig(
packName = "ValkyrieIcons",
outputFormat = outputFormat,
useFlatPackage = true,
),
).content

Expand All @@ -81,6 +66,7 @@ class CustomPackageTest {
packName = "ValkyrieIcons",
nestedPackName = "Filled",
outputFormat = outputFormat,
useFlatPackage = true,
),
).content

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package io.github.composegears.valkyrie.generator.imagevector
import assertk.assertThat
import assertk.assertions.isEqualTo
import io.github.composegears.valkyrie.extensions.ResourceUtils.getResourcePath
import io.github.composegears.valkyrie.generator.imagevector.common.createConfig
import io.github.composegears.valkyrie.generator.imagevector.common.toResourceText
import io.github.composegears.valkyrie.parser.svgxml.SvgXmlParser
import org.junit.jupiter.params.ParameterizedTest
Expand All @@ -18,13 +19,8 @@ class ExplicitModeTest {
val output = ImageVectorGenerator.convert(
vector = parserOutput.vector,
kotlinName = parserOutput.kotlinName,
config = ImageVectorGeneratorConfig(
packageName = "io.github.composegears.valkyrie.icons",
packName = "",
nestedPackName = "",
config = createConfig(
outputFormat = outputFormat,
generatePreview = false,
useFlatPackage = false,
useExplicitMode = true,
),
).content
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,32 +3,14 @@ package io.github.composegears.valkyrie.generator.imagevector
import assertk.assertThat
import assertk.assertions.isEqualTo
import io.github.composegears.valkyrie.extensions.ResourceUtils.getResourcePath
import io.github.composegears.valkyrie.generator.imagevector.common.createConfig
import io.github.composegears.valkyrie.generator.imagevector.common.toResourceText
import io.github.composegears.valkyrie.parser.svgxml.SvgXmlParser
import org.junit.jupiter.params.ParameterizedTest
import org.junit.jupiter.params.provider.EnumSource

class ImageVectorWithPreviewTest {

private fun createConfig(
packName: String = "",
nestedPackName: String = "",
outputFormat: OutputFormat,
generatePreview: Boolean = true,
useFlatPackage: Boolean = false,
useExplicitMode: Boolean = false,
): ImageVectorGeneratorConfig {
return ImageVectorGeneratorConfig(
packageName = "io.github.composegears.valkyrie.icons",
packName = packName,
nestedPackName = nestedPackName,
outputFormat = outputFormat,
generatePreview = generatePreview,
useFlatPackage = useFlatPackage,
useExplicitMode = useExplicitMode,
)
}

@ParameterizedTest
@EnumSource(value = OutputFormat::class)
fun `preview generation without icon pack`(outputFormat: OutputFormat) {
Expand All @@ -37,7 +19,10 @@ class ImageVectorWithPreviewTest {
val output = ImageVectorGenerator.convert(
vector = parserOutput.vector,
kotlinName = parserOutput.kotlinName,
config = createConfig(outputFormat = outputFormat),
config = createConfig(
outputFormat = outputFormat,
generatePreview = true,
),
).content

val expected = outputFormat.toResourceText(
Expand All @@ -58,6 +43,7 @@ class ImageVectorWithPreviewTest {
config = createConfig(
packName = "ValkyrieIcons",
outputFormat = outputFormat,
generatePreview = true,
),
).content

Expand All @@ -80,6 +66,7 @@ class ImageVectorWithPreviewTest {
packName = "ValkyrieIcons",
nestedPackName = "Filled",
outputFormat = outputFormat,
generatePreview = true,
),
).content

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,32 +3,14 @@ package io.github.composegears.valkyrie.generator.imagevector
import assertk.assertThat
import assertk.assertions.isEqualTo
import io.github.composegears.valkyrie.extensions.ResourceUtils.getResourcePath
import io.github.composegears.valkyrie.generator.imagevector.common.createConfig
import io.github.composegears.valkyrie.generator.imagevector.common.toResourceText
import io.github.composegears.valkyrie.parser.svgxml.SvgXmlParser
import org.junit.jupiter.params.ParameterizedTest
import org.junit.jupiter.params.provider.EnumSource

class SvgWithGradientToImageVectorTest {

private fun createConfig(
packName: String = "",
nestedPackName: String = "",
outputFormat: OutputFormat,
generatePreview: Boolean = false,
useFlatPackage: Boolean = false,
useExplicitMode: Boolean = false,
): ImageVectorGeneratorConfig {
return ImageVectorGeneratorConfig(
packageName = "io.github.composegears.valkyrie.icons",
packName = packName,
nestedPackName = nestedPackName,
outputFormat = outputFormat,
generatePreview = generatePreview,
useFlatPackage = useFlatPackage,
useExplicitMode = useExplicitMode,
)
}

@ParameterizedTest
@EnumSource(value = OutputFormat::class)
fun `svg linear gradient parsing`(outputFormat: OutputFormat) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package io.github.composegears.valkyrie.generator.imagevector

import assertk.assertThat
import assertk.assertions.isEqualTo
import io.github.composegears.valkyrie.extensions.ResourceUtils.getResourcePath
import io.github.composegears.valkyrie.generator.imagevector.common.createConfig
import io.github.composegears.valkyrie.generator.imagevector.common.toResourceText
import io.github.composegears.valkyrie.parser.svgxml.SvgXmlParser
import org.junit.jupiter.params.ParameterizedTest
import org.junit.jupiter.params.provider.EnumSource

class TrailingCommaTest {

@ParameterizedTest
@EnumSource(value = OutputFormat::class)
fun `icon with path and solid color`(outputFormat: OutputFormat) {
val icon = getResourcePath("xml/ic_fill_color_stroke.xml")
val parserOutput = SvgXmlParser.toIrImageVector(icon)
val output = ImageVectorGenerator.convert(
vector = parserOutput.vector,
kotlinName = parserOutput.kotlinName,
config = createConfig(
packName = "ValkyrieIcons",
outputFormat = outputFormat,
addTrailingComma = true,
),
).content

val expected = outputFormat.toResourceText(
pathToBackingProperty = "kt/backing/FillColorStroke.trailing.kt",
pathToLazyProperty = "kt/lazy/FillColorStroke.trailing.kt",
)
assertThat(output).isEqualTo(expected)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,32 +3,14 @@ package io.github.composegears.valkyrie.generator.imagevector
import assertk.assertThat
import assertk.assertions.isEqualTo
import io.github.composegears.valkyrie.extensions.ResourceUtils.getResourcePath
import io.github.composegears.valkyrie.generator.imagevector.common.createConfig
import io.github.composegears.valkyrie.generator.imagevector.common.toResourceText
import io.github.composegears.valkyrie.parser.svgxml.SvgXmlParser
import org.junit.jupiter.params.ParameterizedTest
import org.junit.jupiter.params.provider.EnumSource

class XmlToImageVectorTest {

private fun createConfig(
packName: String = "",
nestedPackName: String = "",
outputFormat: OutputFormat,
generatePreview: Boolean = false,
useFlatPackage: Boolean = false,
useExplicitMode: Boolean = false,
): ImageVectorGeneratorConfig {
return ImageVectorGeneratorConfig(
packageName = "io.github.composegears.valkyrie.icons",
packName = packName,
nestedPackName = nestedPackName,
outputFormat = outputFormat,
generatePreview = generatePreview,
useFlatPackage = useFlatPackage,
useExplicitMode = useExplicitMode,
)
}

@ParameterizedTest
@EnumSource(value = OutputFormat::class)
fun `generation without icon pack`(outputFormat: OutputFormat) {
Expand Down
Loading

0 comments on commit 9854736

Please sign in to comment.