From 27931daca6b1bf957def5de85f1715bbf69b41b9 Mon Sep 17 00:00:00 2001 From: marhali Date: Tue, 22 Feb 2022 21:46:32 +0100 Subject: [PATCH] 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