Search in sources :

Example 1 with EscapedCharacter

use of com.vladsch.flexmark.ext.escaped.character.EscapedCharacter 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);
    }
}
Also used : ReplacedTextMapper(com.vladsch.flexmark.util.sequence.ReplacedTextMapper) ReplacedTextRegion(com.vladsch.flexmark.util.sequence.ReplacedTextRegion) BasedSequence(com.vladsch.flexmark.util.sequence.BasedSequence) EscapedCharacter(com.vladsch.flexmark.ext.escaped.character.EscapedCharacter)

Aggregations

EscapedCharacter (com.vladsch.flexmark.ext.escaped.character.EscapedCharacter)1 BasedSequence (com.vladsch.flexmark.util.sequence.BasedSequence)1 ReplacedTextMapper (com.vladsch.flexmark.util.sequence.ReplacedTextMapper)1 ReplacedTextRegion (com.vladsch.flexmark.util.sequence.ReplacedTextRegion)1