package folioxml.text;
import folioxml.core.InvalidMarkupException;
import folioxml.xml.IFilter;
import folioxml.xml.Node;
import folioxml.xml.NodeList;
import java.util.ArrayList;
import java.util.List;
//Only comprehends <br> tags, works if phrasingContentOnly()==true
public class TextLinesSequencer {
public TextLinesSequencer(NodeList nl, IFilter exclusionFilter) throws InvalidMarkupException {
NodeList linebreaks = nl.search("br");
//TODO: throw exception if there is a block level element present after we exclude it.
linesOfTOkens = new ArrayList<List<ITextToken>>(linebreaks.count());
Node prev = null;
for (Node b : linebreaks.list()) {
NodeList tokens = nl.textEntityNodesBetween(prev, b, exclusionFilter);
addLineFromTextNodeList(tokens);
prev = b;
}
NodeList tokens = nl.textEntityNodesBetween(prev, null, exclusionFilter);
addLineFromTextNodeList(tokens);
}
private void addLineFromTextNodeList(NodeList tokens) {
ArrayList<ITextToken> wrapped = new ArrayList<ITextToken>(tokens.count());
for (Node text : tokens.list()) {
wrapped.add(new NodeTextTokenWrapper(text));
}
linesOfTOkens.add(wrapped);
}
public List<List<ITextToken>> linesOfTOkens;
public List<VirtualCharSequence> getLines(boolean decodeEntities) {
List<VirtualCharSequence> lines = new ArrayList<VirtualCharSequence>(linesOfTOkens.size());
for (List<ITextToken> line : linesOfTOkens) {
lines.add(new VirtualCharSequence(line, decodeEntities));
}
return lines;
}
}