package org.jtwig.parser.parboiled.node;
import org.jtwig.model.tree.TextNode;
import org.jtwig.parser.parboiled.ParserContext;
import org.jtwig.parser.parboiled.base.BasicParser;
import org.jtwig.parser.parboiled.base.LimitsParser;
import org.jtwig.parser.parboiled.base.PositionTrackerParser;
import org.parboiled.Rule;
import static org.parboiled.Parboiled.createParser;
public class TextNodeParser extends NodeParser<TextNode> {
public TextNodeParser(ParserContext context) {
super(TextNodeParser.class, context);
createParser(TextBuilderParser.class, context);
}
@Override
public Rule NodeRule() {
PositionTrackerParser positionTrackerParser = parserContext().parser(PositionTrackerParser.class);
TextBuilderParser textBuilderParser = parserContext().parser(TextBuilderParser.class);
LimitsParser limitsParser = parserContext().parser(LimitsParser.class);
return Sequence(
positionTrackerParser.PushPosition(),
textBuilderParser.Text(),
push(new TextNode(
positionTrackerParser.pop(1),
textBuilderParser.pop().toString(),
new TextNode.Configuration().setTrimLeft(limitsParser.lastWhiteSpace()))),
limitsParser.update(peek())
);
}
public static class TextBuilderParser extends BasicParser<StringBuilder> {
public TextBuilderParser(ParserContext context) {
super(TextBuilderParser.class, context);
}
public Rule Text() {
return Sequence(
push(new StringBuilder()),
OneOrMore(
TestNot(
parserContext().parser(LimitsParser.class).anyEnd()
),
ANY,
run(peek().append(match()))
)
);
}
boolean run(StringBuilder append) {
return true;
}
}
}