mirror of
https://github.com/CarmJos/EasyConfiguration.git
synced 2026-06-04 10:38:19 +08:00
refactor(comment): Extract common comment functions
This commit is contained in:
+62
@@ -0,0 +1,62 @@
|
|||||||
|
package cc.carm.lib.configuration.commentable;
|
||||||
|
|
||||||
|
import cc.carm.lib.configuration.source.ConfigurationHolder;
|
||||||
|
import cc.carm.lib.configuration.source.loader.ConfigurationInitializer;
|
||||||
|
import cc.carm.lib.configuration.source.option.StandardOptions;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
public class Commentable {
|
||||||
|
|
||||||
|
public static void registerMeta(@NotNull ConfigurationInitializer initializer) {
|
||||||
|
CommentableMeta.register(initializer);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static @Nullable String getInlineComment(@NotNull ConfigurationHolder<?> holder, @NotNull String path) {
|
||||||
|
String comment = getInlineComment(holder, path, null);
|
||||||
|
if (comment != null) return comment;
|
||||||
|
|
||||||
|
String sep = String.valueOf(holder.options().get(StandardOptions.PATH_SEPARATOR));
|
||||||
|
|
||||||
|
// If the comment is not found, try to get the comment from the parent section
|
||||||
|
String[] keys = path.split(Pattern.quote(sep));
|
||||||
|
if (keys.length == 1) return null;
|
||||||
|
|
||||||
|
// Try every possible parent key&child key combination
|
||||||
|
for (int i = 1; i < keys.length; i++) {
|
||||||
|
String parentKey = String.join(sep, Arrays.copyOfRange(keys, 0, i));
|
||||||
|
String childKey = String.join(sep, Arrays.copyOfRange(keys, i, keys.length));
|
||||||
|
comment = getInlineComment(holder, parentKey, childKey);
|
||||||
|
if (comment != null) return comment;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static @Nullable String getInlineComment(@NotNull ConfigurationHolder<?> holder, @NotNull String path, @Nullable String sectionKey) {
|
||||||
|
Map<String, String> pathComment = holder.metadata(path).get(CommentableMeta.INLINE);
|
||||||
|
if (pathComment == null || pathComment.isEmpty()) return null;
|
||||||
|
if (sectionKey == null) return pathComment.get(null);
|
||||||
|
for (Map.Entry<String/*regex*/, String/*content*/> entry : pathComment.entrySet()) {
|
||||||
|
if (entry.getKey() == null) continue;
|
||||||
|
if (Objects.equals(entry.getKey(), sectionKey)) return entry.getValue();
|
||||||
|
Pattern pattern = Pattern.compile(entry.getKey().replace(".", "\\.").replace("*", "(.*)"));
|
||||||
|
if (pattern.matcher(sectionKey).matches()) return entry.getValue();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static @Nullable List<String> getHeaderComments(@NotNull ConfigurationHolder<?> holder, @Nullable String path) {
|
||||||
|
return holder.metadata(path).get(CommentableMeta.HEADER);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static @Nullable List<String> getFooterComments(@NotNull ConfigurationHolder<?> holder, @Nullable String path) {
|
||||||
|
return holder.metadata(path).get(CommentableMeta.FOOTER);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
package cc.carm.lib.configuration.option;
|
package cc.carm.lib.configuration.commentable;
|
||||||
|
|
||||||
import cc.carm.lib.configuration.source.option.ConfigurationOption;
|
import cc.carm.lib.configuration.source.option.ConfigurationOption;
|
||||||
|
|
||||||
+2
-1
@@ -1,5 +1,6 @@
|
|||||||
package cc.carm.lib.configuration.source.yaml;
|
package cc.carm.lib.configuration.source.yaml;
|
||||||
|
|
||||||
|
import cc.carm.lib.configuration.commentable.Commentable;
|
||||||
import cc.carm.lib.configuration.commentable.CommentableMeta;
|
import cc.carm.lib.configuration.commentable.CommentableMeta;
|
||||||
import cc.carm.lib.configuration.source.ConfigurationHolder;
|
import cc.carm.lib.configuration.source.ConfigurationHolder;
|
||||||
import cc.carm.lib.configuration.source.file.FileConfigFactory;
|
import cc.carm.lib.configuration.source.file.FileConfigFactory;
|
||||||
@@ -125,7 +126,7 @@ public class YAMLConfigFactory extends FileConfigFactory<YAMLSource, Configurati
|
|||||||
File configFile = this.file;
|
File configFile = this.file;
|
||||||
String sourcePath = this.resourcePath;
|
String sourcePath = this.resourcePath;
|
||||||
|
|
||||||
CommentableMeta.register(this.initializer); // Register commentable meta types
|
Commentable.registerMeta(this.initializer); // Register commentable meta types
|
||||||
|
|
||||||
return new ConfigurationHolder<YAMLSource>(this.adapters, this.options, this.metadata, this.initializer) {
|
return new ConfigurationHolder<YAMLSource>(this.adapters, this.options, this.metadata, this.initializer) {
|
||||||
final @NotNull YAMLSource source = new YAMLSource(this, configFile, sourcePath);
|
final @NotNull YAMLSource source = new YAMLSource(this, configFile, sourcePath);
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package cc.carm.lib.configuration.source.yaml;
|
package cc.carm.lib.configuration.source.yaml;
|
||||||
|
|
||||||
import cc.carm.lib.configuration.commentable.CommentableMeta;
|
import cc.carm.lib.configuration.commentable.Commentable;
|
||||||
import cc.carm.lib.configuration.option.CommentableOptions;
|
import cc.carm.lib.configuration.commentable.CommentableOptions;
|
||||||
import cc.carm.lib.configuration.source.ConfigurationHolder;
|
import cc.carm.lib.configuration.source.ConfigurationHolder;
|
||||||
import cc.carm.lib.configuration.source.file.FileConfigSource;
|
import cc.carm.lib.configuration.source.file.FileConfigSource;
|
||||||
import cc.carm.lib.configuration.source.option.StandardOptions;
|
import cc.carm.lib.configuration.source.option.StandardOptions;
|
||||||
@@ -25,9 +25,10 @@ import java.io.Reader;
|
|||||||
import java.io.StringWriter;
|
import java.io.StringWriter;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
public class YAMLSource extends FileConfigSource<MemorySection, Map<String, Object>, YAMLSource> implements CommentedSection {
|
public class YAMLSource
|
||||||
|
extends FileConfigSource<MemorySection, Map<String, Object>, YAMLSource>
|
||||||
|
implements CommentedSection {
|
||||||
|
|
||||||
protected final @NotNull YamlConstructor yamlConstructor;
|
protected final @NotNull YamlConstructor yamlConstructor;
|
||||||
protected final @NotNull YamlRepresenter yamlRepresenter;
|
protected final @NotNull YamlRepresenter yamlRepresenter;
|
||||||
@@ -192,47 +193,18 @@ public class YAMLSource extends FileConfigSource<MemorySection, Map<String, Obje
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @Nullable String getInlineComment(@NotNull String path) {
|
public @Nullable String getInlineComment(@NotNull String key) {
|
||||||
String comment = getInlineComment(path, null);
|
return Commentable.getInlineComment(holder(), key);
|
||||||
if (comment != null) return comment;
|
|
||||||
|
|
||||||
String sep = String.valueOf(separator());
|
|
||||||
|
|
||||||
// If the comment is not found, try to get the comment from the parent section
|
|
||||||
String[] keys = path.split(Pattern.quote(sep));
|
|
||||||
if (keys.length == 1) return null;
|
|
||||||
|
|
||||||
// Try every possible parent key&child key combination
|
|
||||||
for (int i = 1; i < keys.length; i++) {
|
|
||||||
String parentKey = String.join(sep, Arrays.copyOfRange(keys, 0, i));
|
|
||||||
String childKey = String.join(sep, Arrays.copyOfRange(keys, i, keys.length));
|
|
||||||
comment = getInlineComment(parentKey, childKey);
|
|
||||||
if (comment != null) return comment;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public @Nullable String getInlineComment(@NotNull String path, @Nullable String sectionKey) {
|
|
||||||
Map<String, String> pathComment = holder().metadata(path).get(CommentableMeta.INLINE);
|
|
||||||
if (pathComment == null || pathComment.isEmpty()) return null;
|
|
||||||
if (sectionKey == null) return pathComment.get(null);
|
|
||||||
for (Map.Entry<String/*regex*/, String/*content*/> entry : pathComment.entrySet()) {
|
|
||||||
if (entry.getKey() == null) continue;
|
|
||||||
if (Objects.equals(entry.getKey(), sectionKey)) return entry.getValue();
|
|
||||||
Pattern pattern = Pattern.compile(entry.getKey().replace(".", "\\.").replace("*", "(.*)"));
|
|
||||||
if (pattern.matcher(sectionKey).matches()) return entry.getValue();
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @Nullable List<String> getHeaderComments(@Nullable String key) {
|
public @Nullable List<String> getHeaderComments(@Nullable String key) {
|
||||||
return holder().metadata(key).get(CommentableMeta.HEADER);
|
return Commentable.getHeaderComments(holder(), key);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @Nullable List<String> getFooterComments(@Nullable String key) {
|
public @Nullable List<String> getFooterComments(@Nullable String key) {
|
||||||
return holder().metadata(key).get(CommentableMeta.FOOTER);
|
return Commentable.getFooterComments(holder(), key);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class YamlRepresenter extends Representer {
|
public static class YamlRepresenter extends Representer {
|
||||||
|
|||||||
Reference in New Issue
Block a user