Skip to content

Commit 697ee5f

Browse files
committed
Introduce :sdk:tools:svg module
1 parent fc3fa83 commit 697ee5f

9 files changed

Lines changed: 51 additions & 40 deletions

File tree

components/parser/jvm/svg/api/svg.api

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,3 @@
1-
public final class io/github/composegears/valkyrie/parser/jvm/svg/SvgManipulator {
2-
public static final field INSTANCE Lio/github/composegears/valkyrie/parser/jvm/svg/SvgManipulator;
3-
public final fun modifySvg (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Ljava/lang/String;
4-
public final fun updateAttributeConditionally (Lorg/w3c/dom/Element;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
5-
public final fun updateAttributeRecursively (Lorg/w3c/dom/Element;Ljava/lang/String;Ljava/lang/String;)V
6-
}
7-
81
public final class io/github/composegears/valkyrie/parser/jvm/svg/SvgToXmlParser {
92
public static final field INSTANCE Lio/github/composegears/valkyrie/parser/jvm/svg/SvgToXmlParser;
103
public final fun parse (Ljava/lang/String;)Ljava/lang/String;

components/parser/jvm/svg/build.gradle.kts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,4 @@ plugins {
66

77
dependencies {
88
implementation(libs.android.build.tools)
9-
10-
testImplementation(libs.bundles.kmp.test)
119
}

sdk/utils/svg/api/svg.api

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
public final class io/github/composegears/valkyrie/sdk/utils/svg/SvgDomModifier {
2+
public static final field INSTANCE Lio/github/composegears/valkyrie/sdk/utils/svg/SvgDomModifier;
3+
public final fun modify (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Ljava/lang/String;
4+
public final fun updateAttributeConditionally (Lorg/w3c/dom/Element;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
5+
public final fun updateAttributeRecursively (Lorg/w3c/dom/Element;Ljava/lang/String;Ljava/lang/String;)V
6+
}
7+

sdk/utils/svg/build.gradle.kts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
plugins {
2+
alias(libs.plugins.valkyrie.abi)
3+
alias(libs.plugins.valkyrie.jvm)
4+
alias(libs.plugins.valkyrie.kover)
5+
}
6+
7+
dependencies {
8+
testImplementation(libs.bundles.kmp.test)
9+
}

components/parser/jvm/svg/src/main/kotlin/io/github/composegears/valkyrie/parser/jvm/svg/SvgManipulator.kt renamed to sdk/utils/svg/src/main/kotlin/io/github/composegears/valkyrie/sdk/utils/svg/SvgDomModifier.kt

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
1-
package io.github.composegears.valkyrie.parser.jvm.svg
1+
package io.github.composegears.valkyrie.sdk.utils.svg
22

33
import java.io.StringReader
44
import java.io.StringWriter
5+
import javax.xml.XMLConstants
56
import javax.xml.parsers.DocumentBuilderFactory
67
import javax.xml.transform.OutputKeys
78
import javax.xml.transform.TransformerFactory
89
import javax.xml.transform.dom.DOMSource
910
import javax.xml.transform.stream.StreamResult
1011
import org.w3c.dom.Element
12+
import org.xml.sax.InputSource
1113

1214
/**
1315
* Utility for manipulating SVG content using DOM-based XML parsing.
@@ -17,16 +19,16 @@ import org.w3c.dom.Element
1719
* - Attribute ordering differences
1820
* - Multiple occurrences of attributes across nested elements
1921
*/
20-
object SvgManipulator {
22+
object SvgDomModifier {
2123

2224
/**
2325
* Applies attribute modifications to SVG content.
2426
*
2527
* @param svgContent The original SVG content as a string
2628
* @param modifications Lambda that receives the root SVG element for modification
27-
* @return Modified SVG content, or original content if parsing fails
29+
* @return Modified SVG content, or original content if an error occurs
2830
*/
29-
fun modifySvg(
31+
fun modify(
3032
svgContent: String,
3133
modifications: (Element) -> Unit,
3234
): String {
@@ -38,14 +40,14 @@ object SvgManipulator {
3840
setFeature("http://xml.org/sax/features/external-parameter-entities", false)
3941
}
4042
val builder = factory.newDocumentBuilder()
41-
val document = builder.parse(org.xml.sax.InputSource(StringReader(svgContent)))
43+
val document = builder.parse(InputSource(StringReader(svgContent)))
4244

4345
val svgElement = document.documentElement
4446
modifications(svgElement)
4547

4648
val transformerFactory = TransformerFactory.newInstance().apply {
47-
setAttribute(javax.xml.XMLConstants.ACCESS_EXTERNAL_DTD, "")
48-
setAttribute(javax.xml.XMLConstants.ACCESS_EXTERNAL_STYLESHEET, "")
49+
setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "")
50+
setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, "")
4951
}
5052
val transformer = transformerFactory.newTransformer()
5153
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes")
@@ -61,7 +63,7 @@ object SvgManipulator {
6163
/**
6264
* Updates an attribute on all elements in the tree that have it.
6365
*
64-
* @param element Root element to start searching from
66+
* @param element Element to start from (inclusive)
6567
* @param attributeName Name of the attribute to update
6668
* @param newValue New value for the attribute
6769
*/
@@ -86,7 +88,7 @@ object SvgManipulator {
8688
/**
8789
* Updates an attribute on all elements that have a specific current value.
8890
*
89-
* @param element Root element to start searching from
91+
* @param element Element to start from (inclusive)
9092
* @param attributeName Name of the attribute to update
9193
* @param currentValue Current value to match
9294
* @param newValue New value for the attribute

components/parser/jvm/svg/src/test/kotlin/io/github/composegears/valkyrie/parser/jvm/svg/SvgManipulatorTest.kt renamed to sdk/utils/svg/src/test/kotlin/io/github/composegears/valkyrie/sdk/utils/svg/SvgDomModifierTest.kt

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package io.github.composegears.valkyrie.parser.jvm.svg
1+
package io.github.composegears.valkyrie.sdk.utils.svg
22

33
import assertk.assertThat
44
import assertk.assertions.contains
@@ -8,7 +8,7 @@ import kotlin.test.Test
88
import kotlin.test.assertFalse
99
import kotlin.test.assertTrue
1010

11-
class SvgManipulatorTest {
11+
class SvgDomModifierTest {
1212

1313
@Test
1414
fun `modifySvg updates root element attribute`() {
@@ -18,7 +18,7 @@ class SvgManipulatorTest {
1818
</svg>
1919
""".trimIndent()
2020

21-
val modifiedSvg = SvgManipulator.modifySvg(originalSvg) { svgElement ->
21+
val modifiedSvg = SvgDomModifier.modify(originalSvg) { svgElement ->
2222
svgElement.setAttribute("width", "48")
2323
svgElement.setAttribute("height", "48")
2424
}
@@ -40,8 +40,8 @@ class SvgManipulatorTest {
4040
</svg>
4141
""".trimIndent()
4242

43-
val modifiedSvg = SvgManipulator.modifySvg(originalSvg) { svgElement ->
44-
SvgManipulator.updateAttributeRecursively(
43+
val modifiedSvg = SvgDomModifier.modify(originalSvg) { svgElement ->
44+
SvgDomModifier.updateAttributeRecursively(
4545
element = svgElement,
4646
attributeName = "stroke-width",
4747
newValue = "3",
@@ -64,8 +64,8 @@ class SvgManipulatorTest {
6464
</svg>
6565
""".trimIndent()
6666

67-
val modifiedSvg = SvgManipulator.modifySvg(originalSvg) { svgElement ->
68-
SvgManipulator.updateAttributeRecursively(
67+
val modifiedSvg = SvgDomModifier.modify(originalSvg) { svgElement ->
68+
SvgDomModifier.updateAttributeRecursively(
6969
element = svgElement,
7070
attributeName = "stroke-width",
7171
newValue = "3",
@@ -86,8 +86,8 @@ class SvgManipulatorTest {
8686
</svg>
8787
""".trimIndent()
8888

89-
val modifiedSvg = SvgManipulator.modifySvg(originalSvg) { svgElement ->
90-
SvgManipulator.updateAttributeConditionally(
89+
val modifiedSvg = SvgDomModifier.modify(originalSvg) { svgElement ->
90+
SvgDomModifier.updateAttributeConditionally(
9191
element = svgElement,
9292
attributeName = "stroke",
9393
currentValue = "currentColor",
@@ -118,8 +118,8 @@ class SvgManipulatorTest {
118118
</svg>
119119
""".trimIndent()
120120

121-
val modifiedSvg = SvgManipulator.modifySvg(originalSvg) { svgElement ->
122-
SvgManipulator.updateAttributeRecursively(
121+
val modifiedSvg = SvgDomModifier.modify(originalSvg) { svgElement ->
122+
SvgDomModifier.updateAttributeRecursively(
123123
element = svgElement,
124124
attributeName = "stroke-width",
125125
newValue = "5",
@@ -138,7 +138,7 @@ class SvgManipulatorTest {
138138
</svg>
139139
""".trimIndent()
140140

141-
val modifiedSvg = SvgManipulator.modifySvg(originalSvg) { svgElement ->
141+
val modifiedSvg = SvgDomModifier.modify(originalSvg) { svgElement ->
142142
svgElement.setAttribute("width", "48")
143143
}
144144

@@ -153,7 +153,7 @@ class SvgManipulatorTest {
153153
</svg>
154154
""".trimIndent()
155155

156-
val modifiedSvg = SvgManipulator.modifySvg(originalSvg) { svgElement ->
156+
val modifiedSvg = SvgDomModifier.modify(originalSvg) { svgElement ->
157157
svgElement.setAttribute("width", "48")
158158
}
159159

@@ -164,7 +164,7 @@ class SvgManipulatorTest {
164164
fun `modifySvg returns original content on parse failure`() {
165165
val invalidSvg = "This is not valid XML"
166166

167-
val result = SvgManipulator.modifySvg(invalidSvg) { svgElement ->
167+
val result = SvgDomModifier.modify(invalidSvg) { svgElement ->
168168
svgElement.setAttribute("width", "48")
169169
}
170170

@@ -180,7 +180,7 @@ class SvgManipulatorTest {
180180
</svg>
181181
""".trimIndent()
182182

183-
val modifiedSvg = SvgManipulator.modifySvg(originalSvg) { svgElement ->
183+
val modifiedSvg = SvgDomModifier.modify(originalSvg) { svgElement ->
184184
svgElement.setAttribute("width", "48")
185185
}
186186

@@ -200,8 +200,8 @@ class SvgManipulatorTest {
200200
</svg>
201201
""".trimIndent()
202202

203-
val modifiedSvg = SvgManipulator.modifySvg(originalSvg) { svgElement ->
204-
SvgManipulator.updateAttributeRecursively(
203+
val modifiedSvg = SvgDomModifier.modify(originalSvg) { svgElement ->
204+
SvgDomModifier.updateAttributeRecursively(
205205
element = svgElement,
206206
attributeName = "stroke-width",
207207
newValue = "2",
@@ -220,17 +220,17 @@ class SvgManipulatorTest {
220220
</svg>
221221
""".trimIndent()
222222

223-
val modifiedSvg = SvgManipulator.modifySvg(lucideSvg) { svgElement ->
223+
val modifiedSvg = SvgDomModifier.modify(lucideSvg) { svgElement ->
224224
svgElement.setAttribute("width", "48")
225225
svgElement.setAttribute("height", "48")
226226

227-
SvgManipulator.updateAttributeRecursively(
227+
SvgDomModifier.updateAttributeRecursively(
228228
element = svgElement,
229229
attributeName = "stroke-width",
230230
newValue = "3",
231231
)
232232

233-
SvgManipulator.updateAttributeConditionally(
233+
SvgDomModifier.updateAttributeConditionally(
234234
element = svgElement,
235235
attributeName = "stroke",
236236
currentValue = "currentColor",

settings.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,3 +100,4 @@ include("sdk:parser:common")
100100
include("sdk:shared")
101101
include("sdk:test:coverage")
102102
include("sdk:test:resource-loader")
103+
include("sdk:utils:svg")

tools/idea-plugin/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ dependencies {
5454
implementation(projects.sdk.ir.util)
5555
implementation(projects.sdk.ir.xml)
5656
implementation(projects.sdk.shared)
57+
implementation(projects.sdk.utils.svg)
5758

5859
implementation(libs.android.build.tools)
5960
implementation(libs.androidx.collection)

tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/standard/common/domain/SvgSizeCustomizer.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package io.github.composegears.valkyrie.ui.screen.webimport.standard.common.domain
22

3-
import io.github.composegears.valkyrie.parser.jvm.svg.SvgManipulator
3+
import io.github.composegears.valkyrie.sdk.utils.svg.SvgDomModifier
44
import io.github.composegears.valkyrie.ui.screen.webimport.standard.common.model.SizeSettings
55

66
/**
@@ -13,7 +13,7 @@ object SvgSizeCustomizer {
1313
private const val ATTR_HEIGHT = "height"
1414

1515
fun applySettings(svgContent: String, settings: SizeSettings): String {
16-
return SvgManipulator.modifySvg(svgContent) { svgElement ->
16+
return SvgDomModifier.modify(svgContent) { svgElement ->
1717
svgElement.setAttribute(ATTR_WIDTH, settings.size.toString())
1818
svgElement.setAttribute(ATTR_HEIGHT, settings.size.toString())
1919
}

0 commit comments

Comments
 (0)