From 5c92c812d44a91f841c363f8bee3cc974352ed42 Mon Sep 17 00:00:00 2001 From: marhali Date: Tue, 15 Feb 2022 13:13:25 +0100 Subject: [PATCH 1/8] add dependency on json5 by syntaxerror --- build.gradle.kts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/build.gradle.kts b/build.gradle.kts index 36b33dc..bf4599d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -22,6 +22,11 @@ version = properties("pluginVersion") // Configure project's dependencies repositories { mavenCentral() + maven(url = "https://maven.syntaxerror.at") +} + +dependencies { + "idea"("at.syntaxerror:json5:1.2.0") } // Configure Gradle IntelliJ Plugin - read more: https://github.com/JetBrains/gradle-intellij-plugin From 68ec11a4e9435722bcc135e8b64ccccde158cde4 Mon Sep 17 00:00:00 2001 From: marhali Date: Tue, 22 Feb 2022 20:24:44 +0100 Subject: [PATCH 2/8] add dependency on json5-java by marhali --- build.gradle.kts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index bf4599d..27accc1 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -22,11 +22,10 @@ version = properties("pluginVersion") // Configure project's dependencies repositories { mavenCentral() - maven(url = "https://maven.syntaxerror.at") } dependencies { - "idea"("at.syntaxerror:json5:1.2.0") + implementation("de.marhali:json5-java:1.0.1") } // Configure Gradle IntelliJ Plugin - read more: https://github.com/JetBrains/gradle-intellij-plugin From 85073f7f5b8cc5ad6e9e7574e1065e516e295106 Mon Sep 17 00:00:00 2001 From: marhali Date: Tue, 22 Feb 2022 21:45:44 +0100 Subject: [PATCH 3/8] add utility method to check whether a string is valid hexadecimal number --- .../java/de/marhali/easyi18n/util/StringUtil.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/main/java/de/marhali/easyi18n/util/StringUtil.java b/src/main/java/de/marhali/easyi18n/util/StringUtil.java index 88c7ab8..6597dda 100644 --- a/src/main/java/de/marhali/easyi18n/util/StringUtil.java +++ b/src/main/java/de/marhali/easyi18n/util/StringUtil.java @@ -3,6 +3,7 @@ package de.marhali.easyi18n.util; import org.jetbrains.annotations.NotNull; import java.io.StringWriter; +import java.util.regex.Pattern; /** * String utilities @@ -10,6 +11,17 @@ import java.io.StringWriter; */ public class StringUtil { + /** + * Checks if the provided String represents a hexadecimal number. + * For example: {@code 0x100...}, {@code -0x100...} and {@code +0x100...}. + * @param string String to evaluate + * @return true if hexadecimal string otherwise false + */ + public static boolean isHexString(@NotNull String string) { + final Pattern hexNumberPattern = Pattern.compile("[+-]?0[xX][0-9a-fA-F]+"); + return hexNumberPattern.matcher(string).matches(); + } + /** * Escapes control characters for the given input string. * Inspired by Apache Commons (see {@link org.apache.commons.lang.StringEscapeUtils} From 27931daca6b1bf957def5de85f1715bbf69b41b9 Mon Sep 17 00:00:00 2001 From: marhali Date: Tue, 22 Feb 2022 21:46:32 +0100 Subject: [PATCH 4/8] implement json5 parser strategy --- .../io/parser/ParserStrategyType.java | 2 + .../io/parser/json5/Json5ParserStrategy.java | 58 +++++++++++++++++++ src/main/resources/messages.properties | 2 +- 3 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 src/main/java/de/marhali/easyi18n/io/parser/json5/Json5ParserStrategy.java diff --git a/src/main/java/de/marhali/easyi18n/io/parser/ParserStrategyType.java b/src/main/java/de/marhali/easyi18n/io/parser/ParserStrategyType.java index acc25ec..9f60b8d 100644 --- a/src/main/java/de/marhali/easyi18n/io/parser/ParserStrategyType.java +++ b/src/main/java/de/marhali/easyi18n/io/parser/ParserStrategyType.java @@ -1,6 +1,7 @@ package de.marhali.easyi18n.io.parser; import de.marhali.easyi18n.io.parser.json.JsonParserStrategy; +import de.marhali.easyi18n.io.parser.json5.Json5ParserStrategy; import de.marhali.easyi18n.io.parser.properties.PropertiesParserStrategy; import de.marhali.easyi18n.io.parser.yaml.YamlParserStrategy; @@ -10,6 +11,7 @@ import de.marhali.easyi18n.io.parser.yaml.YamlParserStrategy; */ public enum ParserStrategyType { JSON(JsonParserStrategy.class), + JSON5(Json5ParserStrategy.class), YAML(YamlParserStrategy.class), YML(YamlParserStrategy.class), PROPERTIES(PropertiesParserStrategy.class), diff --git a/src/main/java/de/marhali/easyi18n/io/parser/json5/Json5ParserStrategy.java b/src/main/java/de/marhali/easyi18n/io/parser/json5/Json5ParserStrategy.java new file mode 100644 index 0000000..9015189 --- /dev/null +++ b/src/main/java/de/marhali/easyi18n/io/parser/json5/Json5ParserStrategy.java @@ -0,0 +1,58 @@ +package de.marhali.easyi18n.io.parser.json5; + +import com.intellij.openapi.vfs.VirtualFile; + +import de.marhali.easyi18n.io.parser.ParserStrategy; +import de.marhali.easyi18n.model.SettingsState; +import de.marhali.easyi18n.model.TranslationData; +import de.marhali.easyi18n.model.TranslationFile; +import de.marhali.easyi18n.model.TranslationNode; +import de.marhali.json5.Json5; +import de.marhali.json5.Json5Element; +import de.marhali.json5.Json5Object; + +import org.jetbrains.annotations.NotNull; + +import java.io.InputStreamReader; +import java.io.Reader; +import java.util.Objects; + +/** + * Json5 file format parser strategy + * @author marhali + */ +public class Json5ParserStrategy extends ParserStrategy { + + private static final Json5 JSON5 = Json5.builder(builder -> + builder.allowInvalidSurrogate().trailingComma().indentFactor(4).build()); + + public Json5ParserStrategy(@NotNull SettingsState settings) { + super(settings); + } + + @Override + public void read(@NotNull TranslationFile file, @NotNull TranslationData data) throws Exception { + data.addLocale(file.getLocale()); + + VirtualFile vf = file.getVirtualFile(); + TranslationNode targetNode = super.getOrCreateTargetNode(file, data); + + try (Reader reader = new InputStreamReader(vf.getInputStream(), vf.getCharset())) { + Json5Element input = JSON5.parse(reader); + if(input != null && input.isJsonObject()) { + Json5Mapper.read(file.getLocale(), input.getAsJsonObject(), targetNode); + } + } + } + + @Override + public void write(@NotNull TranslationData data, @NotNull TranslationFile file) throws Exception { + TranslationNode targetNode = super.getTargetNode(data, file); + + Json5Object output = new Json5Object(); + Json5Mapper.write(file.getLocale(), output, Objects.requireNonNull(targetNode)); + + VirtualFile vf = file.getVirtualFile(); + vf.setBinaryContent(JSON5.serialize(output).getBytes(vf.getCharset())); + } +} diff --git a/src/main/resources/messages.properties b/src/main/resources/messages.properties index e251085..ed38b92 100644 --- a/src/main/resources/messages.properties +++ b/src/main/resources/messages.properties @@ -17,7 +17,7 @@ settings.path.text=Locales directory settings.strategy.title=Translation file structure settings.strategy.folder=Single Directory;Modularized: Locale / Namespace;Modularized: Namespace / Locale settings.strategy.folder.tooltip=What is the folder structure of your translation files? -settings.strategy.parser=JSON;YAML;YML;Properties;ARB +settings.strategy.parser=JSON;JSON5;YAML;YML;Properties;ARB settings.strategy.parser.tooltip=Which file parser should be used to process your translation files? settings.strategy.file-pattern.tooltip=Defines a wildcard matcher to filter relevant translation files. For example *.json, *.???. settings.preview=Preview locale From 38e451b5fa3d36f45cae3c2930d72109b2cf2f6d Mon Sep 17 00:00:00 2001 From: marhali Date: Tue, 22 Feb 2022 21:46:45 +0100 Subject: [PATCH 5/8] add json5 mapper --- .../io/parser/json5/Json5ArrayMapper.java | 53 +++++++++++++ .../easyi18n/io/parser/json5/Json5Mapper.java | 74 +++++++++++++++++++ 2 files changed, 127 insertions(+) create mode 100644 src/main/java/de/marhali/easyi18n/io/parser/json5/Json5ArrayMapper.java create mode 100644 src/main/java/de/marhali/easyi18n/io/parser/json5/Json5Mapper.java diff --git a/src/main/java/de/marhali/easyi18n/io/parser/json5/Json5ArrayMapper.java b/src/main/java/de/marhali/easyi18n/io/parser/json5/Json5ArrayMapper.java new file mode 100644 index 0000000..e31eefc --- /dev/null +++ b/src/main/java/de/marhali/easyi18n/io/parser/json5/Json5ArrayMapper.java @@ -0,0 +1,53 @@ +package de.marhali.easyi18n.io.parser.json5; + +import de.marhali.easyi18n.io.parser.ArrayMapper; +import de.marhali.easyi18n.util.StringUtil; +import de.marhali.json5.Json5; +import de.marhali.json5.Json5Array; +import de.marhali.json5.Json5Primitive; + +import org.apache.commons.lang.math.NumberUtils; + +import java.io.IOException; + +/** + * Map json5 array values. + * @author marhali + */ +public class Json5ArrayMapper extends ArrayMapper { + + private static final Json5 JSON5 = Json5.builder(builder -> + builder.allowInvalidSurrogate().quoteSingle().indentFactor(0).build()); + + public static String read(Json5Array array) { + return read(array.iterator(), (jsonElement -> { + try { + return jsonElement.isJsonArray() || jsonElement.isJsonObject() + ? "\\" + JSON5.serialize(jsonElement) + : jsonElement.getAsString(); + } catch (IOException e) { + throw new AssertionError(e.getMessage(), e.getCause()); + } + })); + } + + public static Json5Array write(String concat) { + Json5Array array = new Json5Array(); + + write(concat, (element) -> { + if(element.startsWith("\\")) { + array.add(JSON5.parse(element.replace("\\", ""))); + } else { + if(StringUtil.isHexString(element)) { + array.add(Json5Primitive.of(element, true)); + } else if(NumberUtils.isNumber(element)) { + array.add(Json5Primitive.of(NumberUtils.createNumber(element))); + } else { + array.add(Json5Primitive.of(element)); + } + } + }); + + return array; + } +} diff --git a/src/main/java/de/marhali/easyi18n/io/parser/json5/Json5Mapper.java b/src/main/java/de/marhali/easyi18n/io/parser/json5/Json5Mapper.java new file mode 100644 index 0000000..30bdcad --- /dev/null +++ b/src/main/java/de/marhali/easyi18n/io/parser/json5/Json5Mapper.java @@ -0,0 +1,74 @@ +package de.marhali.easyi18n.io.parser.json5; + +import de.marhali.easyi18n.model.Translation; +import de.marhali.easyi18n.model.TranslationNode; +import de.marhali.easyi18n.util.StringUtil; + +import de.marhali.json5.Json5Element; +import de.marhali.json5.Json5Object; +import de.marhali.json5.Json5Primitive; +import org.apache.commons.lang.StringEscapeUtils; +import org.apache.commons.lang.math.NumberUtils; + +import java.util.Map; +import java.util.regex.Pattern; + +/** + * Mapper for mapping json5 objects into translation nodes and backwards. + * @author marhali + */ +public class Json5Mapper { + public static void read(String locale, Json5Object json, TranslationNode node) { + for(Map.Entry entry : json.entrySet()) { + String key = entry.getKey(); + Json5Element value = entry.getValue(); + + TranslationNode childNode = node.getOrCreateChildren(key); + + if(value.isJsonObject()) { + // Nested element - run recursively + read(locale, value.getAsJsonObject(), childNode); + } else { + Translation translation = childNode.getValue(); + + String content = value.isJsonArray() + ? Json5ArrayMapper.read(value.getAsJsonArray()) + : StringUtil.escapeControls(value.getAsString(), true); + + translation.put(locale, content); + childNode.setValue(translation); + } + } + } + + public static void write(String locale, Json5Object json, TranslationNode node) { + for(Map.Entry entry : node.getChildren().entrySet()) { + String key = entry.getKey(); + TranslationNode childNode = entry.getValue(); + + if(!childNode.isLeaf()) { + // Nested node - run recursively + Json5Object childJson = new Json5Object(); + write(locale, childJson, childNode); + if(childJson.size() > 0) { + json.add(key, childJson); + } + + } else { + Translation translation = childNode.getValue(); + String content = translation.get(locale); + if(content != null) { + if(Json5ArrayMapper.isArray(content)) { + json.add(key, Json5ArrayMapper.write(content)); + } else if(StringUtil.isHexString(content)) { + json.add(key, Json5Primitive.of(content, true)); + } else if(NumberUtils.isNumber(content)) { + json.add(key, Json5Primitive.of(NumberUtils.createNumber(content))); + } else { + json.add(key, Json5Primitive.of(StringEscapeUtils.unescapeJava(content))); + } + } + } + } + } +} From 26a62159efc09b1a02561af53f29d0c144b66590 Mon Sep 17 00:00:00 2001 From: marhali Date: Tue, 22 Feb 2022 22:02:05 +0100 Subject: [PATCH 6/8] add unit tests for Json5Mapper --- .../easyi18n/mapper/Json5MapperTest.java | 162 ++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 src/test/java/de/marhali/easyi18n/mapper/Json5MapperTest.java diff --git a/src/test/java/de/marhali/easyi18n/mapper/Json5MapperTest.java b/src/test/java/de/marhali/easyi18n/mapper/Json5MapperTest.java new file mode 100644 index 0000000..84ff99c --- /dev/null +++ b/src/test/java/de/marhali/easyi18n/mapper/Json5MapperTest.java @@ -0,0 +1,162 @@ +package de.marhali.easyi18n.mapper; + +import com.google.gson.JsonObject; +import de.marhali.easyi18n.io.parser.json.JsonArrayMapper; +import de.marhali.easyi18n.io.parser.json.JsonMapper; +import de.marhali.easyi18n.io.parser.json5.Json5ArrayMapper; +import de.marhali.easyi18n.io.parser.json5.Json5Mapper; +import de.marhali.easyi18n.model.KeyPath; +import de.marhali.easyi18n.model.TranslationData; +import de.marhali.json5.Json5Object; +import de.marhali.json5.Json5Primitive; + +import org.apache.commons.lang.StringEscapeUtils; +import org.junit.Assert; + +import java.util.Arrays; +import java.util.LinkedHashSet; +import java.util.Set; + +/** + * Unit tests for {@link Json5Mapper}. + * @author marhali + */ +public class Json5MapperTest extends AbstractMapperTest { + + @Override + public void testNonSorting() { + Json5Object input = new Json5Object(); + input.add("zulu", Json5Primitive.of("test")); + input.add("alpha", Json5Primitive.of("test")); + input.add("bravo", Json5Primitive.of("test")); + + TranslationData data = new TranslationData(false); + Json5Mapper.read("en", input, data.getRootNode()); + + Json5Object output = new Json5Object(); + Json5Mapper.write("en", output, data.getRootNode()); + + Set expect = new LinkedHashSet<>(Arrays.asList("zulu", "alpha", "bravo")); + Assert.assertEquals(expect, output.keySet()); + } + + @Override + public void testSorting() { + Json5Object input = new Json5Object(); + input.add("zulu", Json5Primitive.of("test")); + input.add("alpha", Json5Primitive.of("test")); + input.add("bravo", Json5Primitive.of("test")); + + TranslationData data = new TranslationData(false); + Json5Mapper.read("en", input, data.getRootNode()); + + Json5Object output = new Json5Object(); + Json5Mapper.write("en", output, data.getRootNode()); + + Set expect = new LinkedHashSet<>(Arrays.asList("alpha", "bravo", "zulu")); + Assert.assertEquals(expect, output.keySet()); + } + + @Override + public void testArrays() { + TranslationData data = new TranslationData(true); + data.setTranslation(KeyPath.of("simple"), create(arraySimple)); + data.setTranslation(KeyPath.of("escaped"), create(arrayEscaped)); + + Json5Object output = new Json5Object(); + Json5Mapper.write("en", output, data.getRootNode()); + + Assert.assertTrue(output.get("simple").isJsonArray()); + Assert.assertEquals(arraySimple, Json5ArrayMapper.read(output.get("simple").getAsJsonArray())); + Assert.assertTrue(output.get("escaped").isJsonArray()); + Assert.assertEquals(arrayEscaped, StringEscapeUtils.unescapeJava(Json5ArrayMapper.read(output.get("escaped").getAsJsonArray()))); + + TranslationData input = new TranslationData(true); + Json5Mapper.read("en", output, input.getRootNode()); + + Assert.assertTrue(JsonArrayMapper.isArray(input.getTranslation(KeyPath.of("simple")).get("en"))); + Assert.assertTrue(JsonArrayMapper.isArray(input.getTranslation(KeyPath.of("escaped")).get("en"))); + } + + @Override + public void testSpecialCharacters() { + TranslationData data = new TranslationData(true); + data.setTranslation(KeyPath.of("chars"), create(specialCharacters)); + + Json5Object output = new Json5Object(); + Json5Mapper.write("en", output, data.getRootNode()); + + Assert.assertEquals(specialCharacters, output.get("chars").getAsString()); + + TranslationData input = new TranslationData(true); + Json5Mapper.read("en", output, input.getRootNode()); + + Assert.assertEquals(specialCharacters, + StringEscapeUtils.unescapeJava(input.getTranslation(KeyPath.of("chars")).get("en"))); + } + + @Override + public void testNestedKeys() { + TranslationData data = new TranslationData(true); + data.setTranslation(KeyPath.of("nested", "key", "section"), create("test")); + + Json5Object output = new Json5Object(); + Json5Mapper.write("en", output, data.getRootNode()); + + Assert.assertEquals("test", output.getAsJson5Object("nested").getAsJson5Object("key").get("section").getAsString()); + + TranslationData input = new TranslationData(true); + Json5Mapper.read("en", output, input.getRootNode()); + + Assert.assertEquals("test", input.getTranslation(KeyPath.of("nested", "key", "section")).get("en")); + } + + @Override + public void testNonNestedKeys() { + TranslationData data = new TranslationData(true); + data.setTranslation(KeyPath.of("long.key.with.many.sections"), create("test")); + + Json5Object output = new Json5Object(); + Json5Mapper.write("en", output, data.getRootNode()); + + Assert.assertTrue(output.has("long.key.with.many.sections")); + + TranslationData input = new TranslationData(true); + Json5Mapper.read("en", output, input.getRootNode()); + + Assert.assertEquals("test", input.getTranslation(KeyPath.of("long.key.with.many.sections")).get("en")); + } + + @Override + public void testLeadingSpace() { + TranslationData data = new TranslationData(true); + data.setTranslation(KeyPath.of("space"), create(leadingSpace)); + + Json5Object output = new Json5Object(); + Json5Mapper.write("en", output, data.getRootNode()); + + Assert.assertEquals(leadingSpace, output.get("space").getAsString()); + + TranslationData input = new TranslationData(true); + Json5Mapper.read("en", output, input.getRootNode()); + + Assert.assertEquals(leadingSpace, input.getTranslation(KeyPath.of("space")).get("en")); + } + + @Override + public void testNumbers() { + TranslationData data = new TranslationData(true); + data.setTranslation(KeyPath.of("numbered"), create("15000")); + + Json5Object output = new Json5Object(); + Json5Mapper.write("en", output, data.getRootNode()); + + Assert.assertEquals(15000, output.get("numbered").getAsNumber()); + + Json5Object input = new Json5Object(); + input.addProperty("numbered", 143.23); + Json5Mapper.read("en", input, data.getRootNode()); + + Assert.assertEquals("143.23", data.getTranslation(KeyPath.of("numbered")).get("en")); + } +} \ No newline at end of file From a5e8375fe170876408406f254e24615e7a87fd27 Mon Sep 17 00:00:00 2001 From: marhali Date: Tue, 22 Feb 2022 22:36:44 +0100 Subject: [PATCH 7/8] update to json5-java 2.0.0 --- build.gradle.kts | 2 +- .../easyi18n/io/parser/json5/Json5ArrayMapper.java | 2 +- .../marhali/easyi18n/io/parser/json5/Json5Mapper.java | 9 ++++----- .../easyi18n/io/parser/json5/Json5ParserStrategy.java | 4 ++-- .../de/marhali/easyi18n/mapper/Json5MapperTest.java | 10 ++++------ 5 files changed, 12 insertions(+), 15 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 27accc1..f7acd51 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -25,7 +25,7 @@ repositories { } dependencies { - implementation("de.marhali:json5-java:1.0.1") + implementation("de.marhali:json5-java:2.0.0") } // Configure Gradle IntelliJ Plugin - read more: https://github.com/JetBrains/gradle-intellij-plugin diff --git a/src/main/java/de/marhali/easyi18n/io/parser/json5/Json5ArrayMapper.java b/src/main/java/de/marhali/easyi18n/io/parser/json5/Json5ArrayMapper.java index e31eefc..c5f545b 100644 --- a/src/main/java/de/marhali/easyi18n/io/parser/json5/Json5ArrayMapper.java +++ b/src/main/java/de/marhali/easyi18n/io/parser/json5/Json5ArrayMapper.java @@ -22,7 +22,7 @@ public class Json5ArrayMapper extends ArrayMapper { public static String read(Json5Array array) { return read(array.iterator(), (jsonElement -> { try { - return jsonElement.isJsonArray() || jsonElement.isJsonObject() + return jsonElement.isJson5Array() || jsonElement.isJson5Object() ? "\\" + JSON5.serialize(jsonElement) : jsonElement.getAsString(); } catch (IOException e) { diff --git a/src/main/java/de/marhali/easyi18n/io/parser/json5/Json5Mapper.java b/src/main/java/de/marhali/easyi18n/io/parser/json5/Json5Mapper.java index 30bdcad..80b36ae 100644 --- a/src/main/java/de/marhali/easyi18n/io/parser/json5/Json5Mapper.java +++ b/src/main/java/de/marhali/easyi18n/io/parser/json5/Json5Mapper.java @@ -11,7 +11,6 @@ import org.apache.commons.lang.StringEscapeUtils; import org.apache.commons.lang.math.NumberUtils; import java.util.Map; -import java.util.regex.Pattern; /** * Mapper for mapping json5 objects into translation nodes and backwards. @@ -25,14 +24,14 @@ public class Json5Mapper { TranslationNode childNode = node.getOrCreateChildren(key); - if(value.isJsonObject()) { + if(value.isJson5Object()) { // Nested element - run recursively - read(locale, value.getAsJsonObject(), childNode); + read(locale, value.getAsJson5Object(), childNode); } else { Translation translation = childNode.getValue(); - String content = value.isJsonArray() - ? Json5ArrayMapper.read(value.getAsJsonArray()) + String content = value.isJson5Array() + ? Json5ArrayMapper.read(value.getAsJson5Array()) : StringUtil.escapeControls(value.getAsString(), true); translation.put(locale, content); diff --git a/src/main/java/de/marhali/easyi18n/io/parser/json5/Json5ParserStrategy.java b/src/main/java/de/marhali/easyi18n/io/parser/json5/Json5ParserStrategy.java index 9015189..cb9c64b 100644 --- a/src/main/java/de/marhali/easyi18n/io/parser/json5/Json5ParserStrategy.java +++ b/src/main/java/de/marhali/easyi18n/io/parser/json5/Json5ParserStrategy.java @@ -39,8 +39,8 @@ public class Json5ParserStrategy extends ParserStrategy { try (Reader reader = new InputStreamReader(vf.getInputStream(), vf.getCharset())) { Json5Element input = JSON5.parse(reader); - if(input != null && input.isJsonObject()) { - Json5Mapper.read(file.getLocale(), input.getAsJsonObject(), targetNode); + if(input != null && input.isJson5Object()) { + Json5Mapper.read(file.getLocale(), input.getAsJson5Object(), targetNode); } } } diff --git a/src/test/java/de/marhali/easyi18n/mapper/Json5MapperTest.java b/src/test/java/de/marhali/easyi18n/mapper/Json5MapperTest.java index 84ff99c..befdc04 100644 --- a/src/test/java/de/marhali/easyi18n/mapper/Json5MapperTest.java +++ b/src/test/java/de/marhali/easyi18n/mapper/Json5MapperTest.java @@ -1,8 +1,6 @@ package de.marhali.easyi18n.mapper; -import com.google.gson.JsonObject; import de.marhali.easyi18n.io.parser.json.JsonArrayMapper; -import de.marhali.easyi18n.io.parser.json.JsonMapper; import de.marhali.easyi18n.io.parser.json5.Json5ArrayMapper; import de.marhali.easyi18n.io.parser.json5.Json5Mapper; import de.marhali.easyi18n.model.KeyPath; @@ -66,10 +64,10 @@ public class Json5MapperTest extends AbstractMapperTest { Json5Object output = new Json5Object(); Json5Mapper.write("en", output, data.getRootNode()); - Assert.assertTrue(output.get("simple").isJsonArray()); - Assert.assertEquals(arraySimple, Json5ArrayMapper.read(output.get("simple").getAsJsonArray())); - Assert.assertTrue(output.get("escaped").isJsonArray()); - Assert.assertEquals(arrayEscaped, StringEscapeUtils.unescapeJava(Json5ArrayMapper.read(output.get("escaped").getAsJsonArray()))); + Assert.assertTrue(output.get("simple").isJson5Array()); + Assert.assertEquals(arraySimple, Json5ArrayMapper.read(output.get("simple").getAsJson5Array())); + Assert.assertTrue(output.get("escaped").isJson5Array()); + Assert.assertEquals(arrayEscaped, StringEscapeUtils.unescapeJava(Json5ArrayMapper.read(output.get("escaped").getAsJson5Array()))); TranslationData input = new TranslationData(true); Json5Mapper.read("en", output, input.getRootNode()); From 386d345e9797e8b0ee49760c6403d9f637d79635 Mon Sep 17 00:00:00 2001 From: marhali Date: Wed, 23 Feb 2022 09:30:12 +0100 Subject: [PATCH 8/8] prepare upcoming release 3.0.1 --- CHANGELOG.md | 8 +++++--- README.md | 4 ++-- gradle.properties | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 11cfec0..0c32592 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,12 +3,14 @@ # easy-i18n Changelog ## [Unreleased] +### Added +- Support for Json5 files ## [3.0.1] -### Changed -- Fresh projects will receive a notification instead of an exception to configure the plugin +### Changed +- Fresh projects will receive a notification instead of an exception to configure the plugin -### Fixed +### Fixed - Exception on json array value mapping ## [3.0.0] diff --git a/README.md b/README.md index 2846afb..c83ee0f 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ This plugin can be used for any project based on one of the formats and structur ## Builtin Support ### File Types -**JSON** - **YAML** - **Properties** +**JSON** - **JSON5** - **YAML** - **Properties** ### Folder Structure - Single Directory: All translation files are within one directory @@ -90,7 +90,7 @@ _For more examples, please refer to the [Examples Directory](https://github.com/ ## Roadmap -- [ ] JSON5 Support +- [X] JSON5 Support - [ ] XML Support - [ ] Mark duplicate translation values diff --git a/gradle.properties b/gradle.properties index cd3efe5..fdb65ea 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ pluginGroup = de.marhali.easyi18n pluginName = easy-i18n # SemVer format -> https://semver.org -pluginVersion = 3.0.1 +pluginVersion = 3.1.0 # See https://plugins.jetbrains.com/docs/intellij/build-number-ranges.html # for insight into build numbers and IntelliJ Platform versions.