mirror of
https://github.com/CarmJos/EasyConfiguration.git
synced 2026-06-04 18:48:20 +08:00
feat(msg): add enhanced text support
This commit is contained in:
+66
-26
@@ -16,11 +16,12 @@ import java.util.stream.IntStream;
|
|||||||
public abstract class ContentHandler<RECEIVER, SELF extends ContentHandler<RECEIVER, SELF>> {
|
public abstract class ContentHandler<RECEIVER, SELF extends ContentHandler<RECEIVER, SELF>> {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Used to match the message insertion
|
* Used to match the message insertion.
|
||||||
* <p>
|
* <p>
|
||||||
* format:
|
* format:
|
||||||
* <br>- to insert parsed line {prefix}#content-id#{offset-above,offset-down}
|
* <br>- to insert parsed line {prefix}#content-id#{offset-above,offset-down}
|
||||||
* <br>- to insert original line {prefix}@content-id@{offset-above,offset-down}
|
* <br>- to insert original line {prefix}@content-id@{offset-above,offset-down}
|
||||||
|
* <br> original lines will not be parsed
|
||||||
* <br> example:
|
* <br> example:
|
||||||
* <ul>
|
* <ul>
|
||||||
* <li>{- }#content-id#{1,1}</li>
|
* <li>{- }#content-id#{1,1}</li>
|
||||||
@@ -30,6 +31,21 @@ public abstract class ContentHandler<RECEIVER, SELF extends ContentHandler<RECEI
|
|||||||
public static final @NotNull Pattern INSERT_PATTERN = Pattern.compile(
|
public static final @NotNull Pattern INSERT_PATTERN = Pattern.compile(
|
||||||
"^(?:\\{(?<prefix>.*)})?(?<type>[#@])(?<id>.*)[#@](?:\\{(?<above>-?\\d+)(?:,(?<down>-?\\d+))?})?$"
|
"^(?:\\{(?<prefix>.*)})?(?<type>[#@])(?<id>.*)[#@](?:\\{(?<above>-?\\d+)(?:,(?<down>-?\\d+))?})?$"
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to match the message which can be inserted
|
||||||
|
* <p>
|
||||||
|
* format:
|
||||||
|
* <br>- ?[id]Message content
|
||||||
|
* <br> example:
|
||||||
|
* <ul>
|
||||||
|
* <li>?[click]Click to use this item!</li>
|
||||||
|
* </ul>
|
||||||
|
*/
|
||||||
|
public static final @NotNull Pattern ENABLE_PATTERN = Pattern.compile(
|
||||||
|
"^\\?\\[(?<id>.+)](?<content>.*)$"
|
||||||
|
);
|
||||||
|
|
||||||
public static final @NotNull UnaryOperator<String> DEFAULT_PARAM_BUILDER = s -> "%(" + s + ")";
|
public static final @NotNull UnaryOperator<String> DEFAULT_PARAM_BUILDER = s -> "%(" + s + ")";
|
||||||
|
|
||||||
protected BiFunction<RECEIVER, String, String> parser = (receiver, value) -> value;
|
protected BiFunction<RECEIVER, String, String> parser = (receiver, value) -> value;
|
||||||
@@ -45,7 +61,7 @@ public abstract class ContentHandler<RECEIVER, SELF extends ContentHandler<RECEI
|
|||||||
/**
|
/**
|
||||||
* Used to store the insertion of the message
|
* Used to store the insertion of the message
|
||||||
*/
|
*/
|
||||||
protected @NotNull Map<String, Function<RECEIVER, List<String>>> insertion = new HashMap<>();
|
protected @NotNull Map<String, @Nullable Function<RECEIVER, List<String>>> insertion = new HashMap<>();
|
||||||
protected boolean disableInsertion = false;
|
protected boolean disableInsertion = false;
|
||||||
|
|
||||||
public abstract SELF self();
|
public abstract SELF self();
|
||||||
@@ -139,6 +155,17 @@ public abstract class ContentHandler<RECEIVER, SELF extends ContentHandler<RECEI
|
|||||||
return self();
|
return self();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert the specific contents by the id.
|
||||||
|
*
|
||||||
|
* @param id the id of the insertion text
|
||||||
|
* @return the current {@link ContentHandler} instance
|
||||||
|
*/
|
||||||
|
public SELF insert(@NotNull String id) {
|
||||||
|
this.insertion.put(id, null);
|
||||||
|
return self();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Insert the specific contents by the id.
|
* Insert the specific contents by the id.
|
||||||
*
|
*
|
||||||
@@ -205,37 +232,50 @@ public abstract class ContentHandler<RECEIVER, SELF extends ContentHandler<RECEI
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (String line : contents.lines()) {
|
for (String line : contents.lines()) {
|
||||||
Matcher matcher = INSERT_PATTERN.matcher(line);
|
Matcher insertMatcher = INSERT_PATTERN.matcher(line);
|
||||||
if (!matcher.matches()) {
|
if (insertMatcher.matches()) {
|
||||||
lineConsumer.accept(parse(receiver, line));
|
doInsert(insertMatcher, receiver, lineConsumer);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
String id = matcher.group("id");
|
Matcher enableMatcher = ENABLE_PATTERN.matcher(line);
|
||||||
List<String> values = Optional.ofNullable(this.insertion.get(id))
|
if (enableMatcher.matches()) {
|
||||||
.map(f -> f.apply(receiver))
|
if (this.insertion.containsKey(enableMatcher.group("id"))) {
|
||||||
.orElse(null);
|
lineConsumer.accept(parse(receiver, enableMatcher.group("content")));
|
||||||
if (values == null || values.isEmpty()) continue;
|
}
|
||||||
|
continue;
|
||||||
String prefix = matcher.group("prefix");
|
|
||||||
String type = matcher.group("type");
|
|
||||||
boolean original = type.equals("@");
|
|
||||||
int offsetAbove = Optional.ofNullable(matcher.group("above"))
|
|
||||||
.map(Integer::parseInt).orElse(0);
|
|
||||||
int offsetDown = Optional.ofNullable(matcher.group("down"))
|
|
||||||
.map(Integer::parseInt).orElse(offsetAbove); // If offsetDown is not set, use offsetAbove
|
|
||||||
|
|
||||||
IntStream.range(0, Math.max(0, offsetAbove)).mapToObj(i -> "").forEach(lineConsumer);
|
|
||||||
String prefixContent = Optional.ofNullable(prefix).map(p -> parse(receiver, p)).orElse("");
|
|
||||||
if (original) {
|
|
||||||
values.stream().map(value -> prefixContent + value).forEach(lineConsumer);
|
|
||||||
} else {
|
|
||||||
values.stream().map(value -> prefixContent + parse(receiver, value)).forEach(lineConsumer);
|
|
||||||
}
|
}
|
||||||
IntStream.range(0, Math.max(0, offsetDown)).mapToObj(i -> "").forEach(lineConsumer);
|
|
||||||
|
lineConsumer.accept(parse(receiver, line));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void doInsert(Matcher matcher, @Nullable RECEIVER receiver,
|
||||||
|
@NotNull Consumer<String> lineConsumer) {
|
||||||
|
String id = matcher.group("id");
|
||||||
|
List<String> values = Optional.ofNullable(this.insertion.get(id))
|
||||||
|
.map(f -> f.apply(receiver))
|
||||||
|
.orElse(null);
|
||||||
|
if (values == null || values.isEmpty()) return; // No values to insert
|
||||||
|
|
||||||
|
String prefix = matcher.group("prefix");
|
||||||
|
String type = matcher.group("type");
|
||||||
|
boolean original = type.equals("@");
|
||||||
|
int offsetAbove = Optional.ofNullable(matcher.group("above"))
|
||||||
|
.map(Integer::parseInt).orElse(0);
|
||||||
|
int offsetDown = Optional.ofNullable(matcher.group("down"))
|
||||||
|
.map(Integer::parseInt).orElse(offsetAbove); // If offsetDown is not set, use offsetAbove
|
||||||
|
|
||||||
|
IntStream.range(0, Math.max(0, offsetAbove)).mapToObj(i -> "").forEach(lineConsumer);
|
||||||
|
String prefixContent = Optional.ofNullable(prefix).map(p -> parse(receiver, p)).orElse("");
|
||||||
|
if (original) {
|
||||||
|
values.stream().map(value -> prefixContent + value).forEach(lineConsumer);
|
||||||
|
} else {
|
||||||
|
values.stream().map(value -> prefixContent + parse(receiver, value)).forEach(lineConsumer);
|
||||||
|
}
|
||||||
|
IntStream.range(0, Math.max(0, offsetDown)).mapToObj(i -> "").forEach(lineConsumer);
|
||||||
|
}
|
||||||
|
|
||||||
public static String setPlaceholders(@NotNull String messages,
|
public static String setPlaceholders(@NotNull String messages,
|
||||||
@NotNull Map<String, Object> placeholders) {
|
@NotNull Map<String, Object> placeholders) {
|
||||||
if (messages.isEmpty()) return messages;
|
if (messages.isEmpty()) return messages;
|
||||||
|
|||||||
+3
-1
@@ -20,7 +20,8 @@ public class ParseTest {
|
|||||||
lines.add("#guidance#");
|
lines.add("#guidance#");
|
||||||
lines.add("{- }#websites#{0,1}");
|
lines.add("{- }#websites#{0,1}");
|
||||||
lines.add("Thanks for your reading!");
|
lines.add("Thanks for your reading!");
|
||||||
|
lines.add("?[click]");
|
||||||
|
lines.add("?[click]Click to see more!");
|
||||||
|
|
||||||
Map<String, List<String>> optional = new HashMap<>();
|
Map<String, List<String>> optional = new HashMap<>();
|
||||||
optional.put("guidance", Arrays.asList("To get more information for %(name), see:"));
|
optional.put("guidance", Arrays.asList("To get more information for %(name), see:"));
|
||||||
@@ -35,6 +36,7 @@ public class ParseTest {
|
|||||||
|
|
||||||
msg.placeholder("name", "Carm")
|
msg.placeholder("name", "Carm")
|
||||||
.insert("guidance")
|
.insert("guidance")
|
||||||
|
.insert("click")
|
||||||
.insert("websites", "Baidu", "Bilibili", "Google");
|
.insert("websites", "Baidu", "Bilibili", "Google");
|
||||||
|
|
||||||
System.out.println("----------------------------");
|
System.out.println("----------------------------");
|
||||||
|
|||||||
Reference in New Issue
Block a user