From 9b62a58bd96649a4b21de21a5092473e6134b763 Mon Sep 17 00:00:00 2001 From: shiinapple Date: Sat, 14 Feb 2026 00:06:12 +0800 Subject: [PATCH 1/3] Fix #151: Allow mixed comma and whitespace separation in transform parsing --- .../github/weisj/jsvg/parser/impl/ParserUtil.java | 2 +- .../weisj/jsvg/attribute/AttributeParserTest.java | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/jsvg/src/main/java/com/github/weisj/jsvg/parser/impl/ParserUtil.java b/jsvg/src/main/java/com/github/weisj/jsvg/parser/impl/ParserUtil.java index e08e7179..f18750a4 100644 --- a/jsvg/src/main/java/com/github/weisj/jsvg/parser/impl/ParserUtil.java +++ b/jsvg/src/main/java/com/github/weisj/jsvg/parser/impl/ParserUtil.java @@ -117,7 +117,7 @@ public static float parseFloat(@Nullable String value, float fallback) { inWhiteSpace = false; ListSplitter.SplitResult result = splitter.testChar(c, i - start); if (result.shouldSplit()) { - list.add(value.substring(start, i)); + if (i - start > 0) list.add(value.substring(start, i)); start = result.shouldIncludeChar() ? i : i + 1; } } diff --git a/jsvg/src/test/java/com/github/weisj/jsvg/attribute/AttributeParserTest.java b/jsvg/src/test/java/com/github/weisj/jsvg/attribute/AttributeParserTest.java index d208b6f2..b30862a9 100644 --- a/jsvg/src/test/java/com/github/weisj/jsvg/attribute/AttributeParserTest.java +++ b/jsvg/src/test/java/com/github/weisj/jsvg/attribute/AttributeParserTest.java @@ -23,6 +23,7 @@ import java.util.Random; +import com.github.weisj.jsvg.attributes.transform.TransformPart; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -91,4 +92,17 @@ private String appendToList(T[] arr, Random r, boolean requireComma) { } return builder.toString(); } + + @Test + void testTransformScaleAllowsCommaAndWhitespace() { + TransformPart part = parser.parseTransformPart(TransformPart.TransformType.SCALE, "-1, 1"); + Assertions.assertNotNull(part); + } + + @Test + void testTransformScaleAllowsMixedCommaAndWhitespace() { + TransformPart part = parser.parseTransformPart(TransformPart.TransformType.SCALE, "-1 , 1"); + Assertions.assertNotNull(part); + } + } From a8dcd3b9e31fc117ca36c14d5df0868e371aac56 Mon Sep 17 00:00:00 2001 From: shiinapple Date: Fri, 20 Feb 2026 14:42:39 +0800 Subject: [PATCH 2/3] Fix #151: Allow mixed comma and whitespace separation in transform parsing --- .../github/weisj/jsvg/parser/impl/ParserUtil.java | 12 +++++++++--- .../weisj/jsvg/attribute/AttributeParserTest.java | 9 +++++++-- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/jsvg/src/main/java/com/github/weisj/jsvg/parser/impl/ParserUtil.java b/jsvg/src/main/java/com/github/weisj/jsvg/parser/impl/ParserUtil.java index f18750a4..6e9223cb 100644 --- a/jsvg/src/main/java/com/github/weisj/jsvg/parser/impl/ParserUtil.java +++ b/jsvg/src/main/java/com/github/weisj/jsvg/parser/impl/ParserUtil.java @@ -1,7 +1,7 @@ /* * MIT License * - * Copyright (c) 2025 Jannis Weis + * Copyright (c) 2025-2026 Jannis Weis * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and * associated documentation files (the "Software"), to deal in the Software without restriction, @@ -101,15 +101,18 @@ public static float parseFloat(@Nullable String value, float fallback) { if (value == null || value.isEmpty()) return fallback; List list = new ArrayList<>(); int max = value.length(); + boolean splitOnWhitespace = splitter.splitOnWhitespace(); int start = 0; int i = 0; boolean inWhiteSpace = false; + boolean lastSplitWasWhiteSpace = false; for (; i < max; i++) { char c = value.charAt(i); if (Character.isWhitespace(c)) { - if (!inWhiteSpace && splitter.splitOnWhitespace() && i - start > 0) { + if (!inWhiteSpace && splitOnWhitespace && i - start > 0) { list.add(value.substring(start, i)); start = i + 1; + lastSplitWasWhiteSpace = true; } inWhiteSpace = true; continue; @@ -117,9 +120,12 @@ public static float parseFloat(@Nullable String value, float fallback) { inWhiteSpace = false; ListSplitter.SplitResult result = splitter.testChar(c, i - start); if (result.shouldSplit()) { - if (i - start > 0) list.add(value.substring(start, i)); + if (!(lastSplitWasWhiteSpace && i == start)) list.add(value.substring(start, i)); start = result.shouldIncludeChar() ? i : i + 1; + lastSplitWasWhiteSpace = false; + continue; } + lastSplitWasWhiteSpace = false; } if (i - start > 0) list.add(value.substring(start, i)); return list.toArray(new String[0]); diff --git a/jsvg/src/test/java/com/github/weisj/jsvg/attribute/AttributeParserTest.java b/jsvg/src/test/java/com/github/weisj/jsvg/attribute/AttributeParserTest.java index b30862a9..507e0a05 100644 --- a/jsvg/src/test/java/com/github/weisj/jsvg/attribute/AttributeParserTest.java +++ b/jsvg/src/test/java/com/github/weisj/jsvg/attribute/AttributeParserTest.java @@ -1,7 +1,7 @@ /* * MIT License * - * Copyright (c) 2021-2025 Jannis Weis + * Copyright (c) 2021-2026 Jannis Weis * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and * associated documentation files (the "Software"), to deal in the Software without restriction, @@ -23,11 +23,11 @@ import java.util.Random; -import com.github.weisj.jsvg.attributes.transform.TransformPart; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import com.github.weisj.jsvg.attributes.transform.TransformPart; import com.github.weisj.jsvg.paint.impl.DefaultPaintParser; import com.github.weisj.jsvg.parser.impl.AttributeParser; import com.github.weisj.jsvg.parser.impl.SeparatorMode; @@ -105,4 +105,9 @@ void testTransformScaleAllowsMixedCommaAndWhitespace() { Assertions.assertNotNull(part); } + @Test + void testTransformCommaOnlyKeepsEmptyEntryBetweenCommas() { + String[] values = parser.parseStringList("1,,1", SeparatorMode.COMMA_ONLY); + Assertions.assertArrayEquals(new String[] {"1", "", "1"}, values); + } } From 2389a06c91f29d4740713aa35fc5d8168f821a95 Mon Sep 17 00:00:00 2001 From: Jannis Weis <31143295+weisJ@users.noreply.github.com> Date: Sat, 21 Feb 2026 23:27:58 +0100 Subject: [PATCH 3/3] Add tests for NumberListSplitter --- .../jsvg/attribute/AttributeParserTest.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/jsvg/src/test/java/com/github/weisj/jsvg/attribute/AttributeParserTest.java b/jsvg/src/test/java/com/github/weisj/jsvg/attribute/AttributeParserTest.java index 507e0a05..3800add2 100644 --- a/jsvg/src/test/java/com/github/weisj/jsvg/attribute/AttributeParserTest.java +++ b/jsvg/src/test/java/com/github/weisj/jsvg/attribute/AttributeParserTest.java @@ -22,7 +22,10 @@ package com.github.weisj.jsvg.attribute; import java.util.Random; +import java.util.function.BiConsumer; +import java.util.function.BiFunction; +import com.github.weisj.jsvg.parser.NumberListSplitter; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -52,6 +55,21 @@ void testStringListRequiredComma() { testStringList(true); } + @Test + void testNumberSplitter() { + BiConsumer test = (str, expected) -> { + String[] result = parser.parseStringList(str, NumberListSplitter.INSTANCE); + Assertions.assertArrayEquals(expected, result); + }; + test.accept("1,1", new String[] {"1", "1"}); + test.accept("1 1", new String[] {"1", "1"}); + test.accept("1-1", new String[] {"1", "-1"}); + test.accept("1, 1", new String[] {"1", "1"}); + test.accept("1, 1", new String[] {"1", "1"}); + test.accept("1 , 1", new String[] {"1", "1"}); + test.accept("1, ,1", new String[] {"1", "", "1"}); + } + @Test void testFloatList() { Random r = new Random();