summaryrefslogtreecommitdiff
path: root/src/main/java/bjc/rgens/parser/templates/LiveTemplateElement.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/bjc/rgens/parser/templates/LiveTemplateElement.java')
-rw-r--r--src/main/java/bjc/rgens/parser/templates/LiveTemplateElement.java60
1 files changed, 60 insertions, 0 deletions
diff --git a/src/main/java/bjc/rgens/parser/templates/LiveTemplateElement.java b/src/main/java/bjc/rgens/parser/templates/LiveTemplateElement.java
new file mode 100644
index 0000000..2487c83
--- /dev/null
+++ b/src/main/java/bjc/rgens/parser/templates/LiveTemplateElement.java
@@ -0,0 +1,60 @@
+package bjc.rgens.parser.templates;
+
+import bjc.utils.data.BooleanToggle;
+import bjc.utils.funcdata.FunctionalList;
+
+import bjc.rgens.parser.GenerationState;
+import bjc.rgens.parser.RGrammarParser;
+import bjc.rgens.parser.elements.CaseElement;
+import bjc.rgens.parser.elements.LiteralCaseElement;
+
+import java.util.Arrays;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class LiveTemplateElement extends TemplateElement {
+ private static final Pattern INSERT_PAT = Pattern.compile("\\$@(.+?)@\\$");
+
+ public final List<List<CaseElement>> elements;
+
+ public LiveTemplateElement(String val) {
+ super(ElementType.TEMPLATE);
+
+ elements = new ArrayList<>();
+
+ Matcher mat = INSERT_PAT.matcher(val);
+ StringBuffer sb = new StringBuffer();
+
+ while(mat.find()) {
+ mat.appendReplacement(sb, "");
+ String body = mat.group(1);
+
+ FunctionalList<CaseElement> elms = (FunctionalList<CaseElement>)RGrammarParser.parseElementString(body).getLeft();
+
+ elements.add(Arrays.asList(new LiteralCaseElement(sb.toString())));
+ elements.add(elms.getInternal());
+
+ sb = new StringBuffer();
+ }
+
+ mat.appendTail(sb);
+ elements.add(Arrays.asList(new LiteralCaseElement(sb.toString())));
+ }
+
+ public void generate(GenerationState state) {
+ BooleanToggle bt = new BooleanToggle(false);
+
+ for(List<CaseElement> elmList : elements) {
+ boolean doSpacing = bt.get();
+
+ for(CaseElement elm : elmList) {
+ elm.generate(state);
+
+ if(doSpacing && elm.type.spacing)
+ state.contents.append(" ");
+ }
+ }
+ }
+}