package org.jtwig.parser.parboiled.base;
import org.jtwig.model.tree.TextNode;
import org.jtwig.parser.parboiled.ParserContext;
import org.jtwig.parser.parboiled.model.LimitProperties;
import org.parboiled.Rule;
import org.parboiled.annotations.Label;
public class LimitsParser extends BasicParser<LimitProperties> {
boolean whiteSpace = false;
TextNode update = null;
public LimitsParser(ParserContext context) {
super(LimitsParser.class, context);
}
public Rule startComment () {
return Sequence(
parserContext().syntaxConfiguration().getStartComment(),
LimitProperty(),
markWhiteSpace(pop().isWhiteSpaceControl())
);
}
public Rule endComment () {
return Sequence(
LimitProperty(),
parserContext().syntaxConfiguration().getEndComment(),
markWhiteSpace(pop().isWhiteSpaceControl())
);
}
public Rule startOutput () {
return Sequence(
parserContext().syntaxConfiguration().getStartOutput(),
LimitProperty(),
markWhiteSpace(pop().isWhiteSpaceControl())
);
}
public Rule endOutput () {
return Sequence(
LimitProperty(),
parserContext().syntaxConfiguration().getEndOutput(),
markWhiteSpace(pop().isWhiteSpaceControl())
);
}
@Label("Start Code Island")
public Rule startCode () {
return Sequence(
parserContext().syntaxConfiguration().getStartCode(),
LimitProperty(),
markWhiteSpace(pop().isWhiteSpaceControl())
);
}
@Label("End Code Island")
public Rule endCode () {
return Sequence(
LimitProperty(),
parserContext().syntaxConfiguration().getEndCode(),
markWhiteSpace(pop().isWhiteSpaceControl())
);
}
Rule LimitProperty() {
return FirstOf(
Sequence(
String("-"),
push(new LimitProperties(true))
),
push(new LimitProperties(false))
);
}
boolean markWhiteSpace(boolean whiteSpace) {
if (!getContext().inPredicate()) {
if (update != null) {
update.trimRight(whiteSpace);
update = null;
}
this.whiteSpace = whiteSpace;
}
return true;
}
public Rule anyEnd() {
return FirstOf(
parserContext().syntaxConfiguration().getStartComment(),
parserContext().syntaxConfiguration().getStartCode(),
parserContext().syntaxConfiguration().getStartOutput()
);
}
public boolean lastWhiteSpace() {
return whiteSpace;
}
public boolean update(TextNode update) {
this.update = update;
return true;
}
}