package net.java.textilej.parser.tag.confluence;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import net.java.textilej.parser.tag.BlockTagProcessor;
public abstract class ConfluenceBlockTagProcessor extends BlockTagProcessor {
protected ConfluenceBlockTag tag;
protected boolean blockOpened;
private Pattern endTagPattern;
public void setOptions(String options) {
String[] opts = options.split("\\s*\\|\\s*");
for (String optionPair: opts) {
String[] keyValue = optionPair.split("\\s*=\\s*");
if (keyValue.length == 2) {
String key = keyValue[0].trim();
String value = keyValue[1].trim();
setOption(key,value);
}
}
}
protected abstract void setOption(String key, String value);
@Override
public void process(String text, int offset) {
if (!blockOpened) {
openBlock();
blockOpened = true;
}
if (closeBlock(text,offset)) {
return;
}
processContent(text,offset);
setLineOffset(text.length());
}
protected boolean closeBlock(String text,int offset) {
Matcher matcher = endTagPattern.matcher(text);
if (offset > 0) {
matcher.region(offset, text.length());
}
if (matcher.matches()) {
int afterEndOffset = matcher.end(1);
setLineOffset(afterEndOffset);
setBlockClosed(true);
return true;
}
return false;
}
protected abstract void openBlock();
protected abstract void processContent(String text, int offset);
void setEndTagPattern(Pattern endTagPattern) {
this.endTagPattern = endTagPattern;
}
void setTag(ConfluenceBlockTag tag) {
this.tag = tag;
}
}