package com.opensymphony.module.sitemesh.html;
import com.opensymphony.module.sitemesh.SitemeshBuffer;
import com.opensymphony.module.sitemesh.SitemeshBufferFragment;
public abstract class BlockExtractingRule extends BasicRule {
private boolean keepInBuffer;
// we should only handle tags that have been opened previously.
// else the parser throws a NoSuchElementException (SIM-216)
private boolean seenOpeningTag;
protected BlockExtractingRule(boolean keepInBuffer, String acceptableTagName) {
super(acceptableTagName);
this.keepInBuffer = keepInBuffer;
}
protected BlockExtractingRule(boolean keepInBuffer) {
this.keepInBuffer = keepInBuffer;
}
public void process(Tag tag) {
if (tag.getType() == Tag.OPEN) {
if (!keepInBuffer) {
context.currentBuffer().markStartDelete(tag.getPosition());
}
context.pushBuffer(createBuffer(context.getSitemeshBuffer()).markStart(tag.getPosition() + tag.getLength()));
start(tag);
seenOpeningTag = true;
} else if (tag.getType() == Tag.CLOSE && seenOpeningTag) {
context.currentBuffer().end(tag.getPosition());
end(tag);
context.popBuffer();
if (!keepInBuffer) {
context.currentBuffer().endDelete(tag.getPosition() + tag.getLength());
}
seenOpeningTag = false;
} else if (!keepInBuffer) {
context.currentBuffer().delete(tag.getPosition(), tag.getLength());
}
}
protected void start(Tag tag) {
}
protected void end(Tag tag) {
}
protected SitemeshBufferFragment.Builder createBuffer(SitemeshBuffer sitemeshBuffer) {
return SitemeshBufferFragment.builder().setBuffer(sitemeshBuffer);
}
}