summaryrefslogtreecommitdiff
path: root/clformat
diff options
context:
space:
mode:
Diffstat (limited to 'clformat')
-rw-r--r--clformat/src/main/java/bjc/utils/ioutils/format/CLFormatter.java8
-rw-r--r--clformat/src/main/java/bjc/utils/ioutils/format/directives/CaseDirective.java1
-rw-r--r--clformat/src/main/java/bjc/utils/ioutils/format/directives/Directive.java30
-rw-r--r--clformat/src/main/java/bjc/utils/ioutils/format/directives/InflectDirective.java72
4 files changed, 90 insertions, 21 deletions
diff --git a/clformat/src/main/java/bjc/utils/ioutils/format/CLFormatter.java b/clformat/src/main/java/bjc/utils/ioutils/format/CLFormatter.java
index e2a80ce..1d7ddab 100644
--- a/clformat/src/main/java/bjc/utils/ioutils/format/CLFormatter.java
+++ b/clformat/src/main/java/bjc/utils/ioutils/format/CLFormatter.java
@@ -84,7 +84,9 @@ public class CLFormatter {
builtinDirectives.put("^", new EscapeDirective());
builtinDirectives.put("[", new ConditionalDirective());
builtinDirectives.put("{", new IterationDirective());
+
builtinDirectives.put("(", new CaseDirective());
+ builtinDirectives.put("`(", new InflectDirective());
builtinDirectives.put("T", new TabulateDirective());
}
@@ -258,6 +260,10 @@ public class CLFormatter {
"Found seperator outside of block.");
case "}":
throw new IllegalArgumentException("Found iteration-end outside of iteration");
+ case ")":
+ throw new IllegalArgumentException("Case-conversion end outside of case conversion");
+ case "`]":
+ throw new IllegalArgumentException("Inflection-end outside of inflection");
case "<":
case ">":
throw new IllegalArgumentException("Layout-control directives aren't implemented yet.");
@@ -276,8 +282,6 @@ public class CLFormatter {
throw new IllegalArgumentException("S and W aren't implemented. Use A instead");
case "P":
throw new IllegalArgumentException("These directives aren't implemented yet");
- case ")":
- throw new IllegalArgumentException("Case-conversion end outside of case conversion");
case "\n":
/*
* Ignored newline.
diff --git a/clformat/src/main/java/bjc/utils/ioutils/format/directives/CaseDirective.java b/clformat/src/main/java/bjc/utils/ioutils/format/directives/CaseDirective.java
index 728bb43..6e80b1d 100644
--- a/clformat/src/main/java/bjc/utils/ioutils/format/directives/CaseDirective.java
+++ b/clformat/src/main/java/bjc/utils/ioutils/format/directives/CaseDirective.java
@@ -1,4 +1,3 @@
-
package bjc.utils.ioutils.format.directives;
import bjc.utils.esodata.Tape;
diff --git a/clformat/src/main/java/bjc/utils/ioutils/format/directives/Directive.java b/clformat/src/main/java/bjc/utils/ioutils/format/directives/Directive.java
index 61abfc1..2e644ae 100644
--- a/clformat/src/main/java/bjc/utils/ioutils/format/directives/Directive.java
+++ b/clformat/src/main/java/bjc/utils/ioutils/format/directives/Directive.java
@@ -39,15 +39,12 @@ public interface Directive {
Matcher dirMatcher, CLFormatter fmt) throws IOException;
public static boolean isOpening(String str) {
- return isOpening(str.charAt(0));
- }
-
- public static boolean isOpening(char dir) {
- switch(dir) {
- case '(':
- case '<':
- case '[':
- case '{':
+ switch(str) {
+ case "(":
+ case "<":
+ case "[":
+ case "{":
+ case "`(":
return true;
default:
return false;
@@ -55,15 +52,12 @@ public interface Directive {
}
public static boolean isClosing(String str) {
- return isClosing(str.charAt(0));
- }
-
- public static boolean isClosing(char dir) {
- switch(dir) {
- case ')':
- case '>':
- case ']':
- case '}':
+ switch(str) {
+ case ")":
+ case ">":
+ case "]":
+ case "}":
+ case "`)":
return true;
default:
return false;
diff --git a/clformat/src/main/java/bjc/utils/ioutils/format/directives/InflectDirective.java b/clformat/src/main/java/bjc/utils/ioutils/format/directives/InflectDirective.java
new file mode 100644
index 0000000..aa75f76
--- /dev/null
+++ b/clformat/src/main/java/bjc/utils/ioutils/format/directives/InflectDirective.java
@@ -0,0 +1,72 @@
+package bjc.utils.ioutils.format.directives;
+
+import bjc.inflexion.InflectionML;
+
+import bjc.utils.esodata.Tape;
+import bjc.utils.ioutils.format.*;
+import bjc.utils.ioutils.ReportWriter;
+
+import java.io.IOException;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.IllegalFormatConversionException;
+import java.util.List;
+import java.util.logging.Logger;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class InflectDirective implements Directive {
+ private static final Pattern wordPattern = Pattern.compile("(\\w+)(\\b*)");
+
+ @Override
+ public void format(ReportWriter rw, Object item, CLModifiers mods, CLParameters params, Tape<Object> tParams,
+ Matcher dirMatcher, CLFormatter fmt) throws IOException {
+ StringBuffer condBody = new StringBuffer();
+
+ int nestLevel = 1;
+
+ while (dirMatcher.find()) {
+ /* Process a list of clauses. */
+ String dirName = dirMatcher.group("name");
+
+ if (dirName != null) {
+ /* Append everything up to this directive. */
+ dirMatcher.appendReplacement(condBody, "");
+
+ if (dirName.equals("`[")) {
+ if (nestLevel > 0) {
+ condBody.append(dirMatcher.group());
+ }
+
+ nestLevel += 1;
+ } else if (Directive.isOpening(dirName)) {
+ nestLevel += 1;
+
+ condBody.append(dirMatcher.group());
+ } else if (dirName.equals("`]")) {
+ nestLevel = Math.max(0, nestLevel - 1);
+
+ /* End the iteration. */
+ if (nestLevel == 0) break;
+ } else if (Directive.isClosing(dirName)) {
+ nestLevel = Math.max(0, nestLevel - 1);
+ } else {
+ /* Not a special directive. */
+ condBody.append(dirMatcher.group());
+ }
+ }
+ }
+
+ String frmt = condBody.toString();
+
+ ReportWriter nrw = rw.duplicate(new StringWriter());
+
+ fmt.doFormatString(frmt, nrw, tParams, false);
+
+ String strang = nrw.toString();
+
+ strang = InflectionML.inflect(strang);
+
+ rw.write(strang);
+ }
+}