use of com.vladsch.flexmark.util.sequence.ReplacedTextRegion in project flexmark-java by vsch.
the class EscapedCharacterNodePostProcessor method process.
@Override
public void process(NodeTracker state, Node node) {
BasedSequence original = node.getChars();
ReplacedTextMapper textMapper = new ReplacedTextMapper(original);
BasedSequence literal = Escaping.unescape(original, textMapper);
int lastEscaped = 0;
boolean wrapInTextBase = !(node.getParent() instanceof TextBase);
TextBase textBase = wrapInTextBase ? null : (TextBase) node.getParent();
ArrayList<ReplacedTextRegion> replacedRegions = textMapper.getRegions();
for (ReplacedTextRegion region : replacedRegions) {
int startOffset = region.getOriginalRange().getStart();
int endOffset = region.getOriginalRange().getEnd();
if (original.charAt(startOffset) == '\\' && region.getReplacedRange().length() == 1 && // fix for #19, ArrayIndexOutOfBounds while parsing markdown with backslash as last character of text block
startOffset + 1 < original.length()) {
if (wrapInTextBase) {
wrapInTextBase = false;
textBase = new TextBase(original);
node.insertBefore(textBase);
state.nodeAdded(textBase);
}
if (startOffset != lastEscaped) {
if (startOffset > original.length() || lastEscaped > original.length()) {
int tmp = 0;
}
BasedSequence escapedChars = original.subSequence(lastEscaped, startOffset);
Node node1 = new Text(escapedChars);
textBase.appendChild(node1);
state.nodeAdded(node1);
}
BasedSequence origToDecorateText = original.subSequence(startOffset, endOffset);
BasedSequence text = origToDecorateText.subSequence(1);
EscapedCharacter decorationNode = new EscapedCharacter(origToDecorateText.subSequence(0, 1), text);
textBase.appendChild(decorationNode);
// Text undecoratedTextNode = new Text(origToDecorateText);
// decorationNode.appendChild(undecoratedTextNode);
// state.nodeAddedWithChildren(decorationNode);
state.nodeAdded(decorationNode);
lastEscaped = endOffset;
}
}
if (lastEscaped > 0) {
if (lastEscaped != original.length()) {
BasedSequence escapedChars = original.subSequence(lastEscaped, original.length());
Node node1 = new Text(escapedChars);
textBase.appendChild(node1);
state.nodeAdded(node1);
}
node.unlink();
state.nodeRemoved(node);
}
}
Aggregations