1
package com.thaiopensource.relaxng.output.dtd;
3
import java.util.NoSuchElementException;
6
private boolean done = false;
7
private BreakIterator iter;
8
private final String prefix;
9
private final String model;
10
private final String suffix;
11
private final int maxLineLength;
13
private ModelBreaker nested = null;
15
private static class BreakIterator {
16
private final String model;
18
private final int length;
20
BreakIterator(String model) {
22
this.length = model.length();
30
boolean advanced = false;
32
for (; pos < length; pos++) {
33
switch (model.charAt(pos)) {
47
if (level != 0 || !advanced)
51
if (level != 0 || !advanced)
61
ModelBreaker(String prefix, String model, String suffix, int maxLineLength) {
62
if (isSingleGroup(model)) {
63
int open = model.indexOf('(') + 1;
64
this.prefix = prefix + model.substring(0, open);
65
this.model = model.substring(open);
72
this.maxLineLength = maxLineLength;
76
boolean hasNextLine() {
77
if (nested != null && nested.hasNextLine())
83
if (nested != null && nested.hasNextLine())
84
return nested.nextLine();
86
throw new NoSuchElementException();
87
int avail = maxLineLength - prefix.length();
89
boolean tooBig = false;
90
if ((model.length() - modelPos) + suffix.length() > avail) {
92
iter = new BreakIterator(model);
95
int pos = iter.getPos();
96
if (pos >= model.length())
98
int w = pos - modelPos;
101
if (breakPos == -1) {
109
} while (iter.advance());
110
if (breakPos == -1) {
112
breakPos = model.length();
116
breakPos = model.length();
118
if (breakPos < model.length() && model.charAt(breakPos) == ' ')
119
nextModelPos = breakPos + 1;
121
nextModelPos = breakPos;
122
StringBuffer buf = new StringBuffer();
126
for (int i = 0, len = prefix.length(); i < len; i++)
129
if (tooBig && (modelPos != 0 || breakPos != model.length())) {
131
if (breakPos == model.length()) {
137
nested = new ModelBreaker(buf.toString(), model.substring(modelPos, breakPos), nestSuffix, maxLineLength);
138
modelPos = nextModelPos;
139
return nested.nextLine();
141
buf.append(model.substring(modelPos, breakPos));
142
if (nextModelPos == model.length()) {
146
modelPos = nextModelPos;
147
return buf.toString();
150
private static boolean isSingleGroup(String model) {
151
int length = model.length();
155
if (model.charAt(0) == '|')
157
if (model.charAt(i) != '(')
161
switch (model.charAt(length - 1)) {
162
case '*': case '+': case '?': case ',': case '|': case ')':
170
for (++i; i < length; i++)
171
switch (model.charAt(i)) {
184
static public void main(String[] args) throws NumberFormatException {
185
for (ModelBreaker breaker = new ModelBreaker(args[0], args[1], args[2], Integer.parseInt(args[3]));
186
breaker.hasNextLine();)
187
System.err.println(breaker.nextLine());