From d91028c852defb258c499c7098ed70f8f651861d Mon Sep 17 00:00:00 2001 From: "Benjamin J. Culkin" Date: Sun, 16 Sep 2018 22:36:28 -0300 Subject: Add inflection directive --- .../java/bjc/utils/ioutils/format/CLFormatter.java | 8 ++- .../ioutils/format/directives/CaseDirective.java | 1 - .../utils/ioutils/format/directives/Directive.java | 30 ++++----- .../format/directives/InflectDirective.java | 72 ++++++++++++++++++++++ 4 files changed, 90 insertions(+), 21 deletions(-) create mode 100644 clformat/src/main/java/bjc/utils/ioutils/format/directives/InflectDirective.java (limited to 'clformat/src/main/java/bjc/utils/ioutils/format') 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 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); + } +} -- cgit v1.2.3