Search in sources :

Example 1 with Abbreviation

use of com.vladsch.flexmark.ext.abbreviation.Abbreviation in project flexmark-java by vsch.

the class AbbreviationNodePostProcessor method process.

@Override
public void process(NodeTracker state, Node node) {
    if (abbreviations == null)
        return;
    BasedSequence original = node.getChars();
    ReplacedTextMapper textMapper = new ReplacedTextMapper(original);
    BasedSequence literal = Escaping.unescape(original, textMapper);
    Matcher m = abbreviations.matcher(literal);
    int lastEscaped = 0;
    boolean wrapInTextBase = !(node.getParent() instanceof TextBase);
    TextBase textBase = wrapInTextBase ? null : (TextBase) node.getParent();
    while (m.find()) {
        // String found = m.group();
        if (abbreviationMap.containsKey(m.group(0))) {
            BasedSequence abbreviation = abbreviationMap.get(m.group(0));
            BasedSequence toDecorateText = literal.subSequence(m.start(0), m.end(0));
            int startOffset = textMapper.originalOffset(m.start(0));
            int endOffset = textMapper.originalOffset(m.end(0));
            if (wrapInTextBase) {
                wrapInTextBase = false;
                textBase = new TextBase(original);
                node.insertBefore(textBase);
                state.nodeAdded(textBase);
            }
            if (startOffset != lastEscaped) {
                BasedSequence escapedChars = original.subSequence(lastEscaped, startOffset);
                Node node1 = new Text(escapedChars);
                textBase.appendChild(node1);
                state.nodeAdded(node1);
            }
            BasedSequence origToDecorateText = original.subSequence(startOffset, endOffset);
            Abbreviation decorationNode = new Abbreviation(origToDecorateText, abbreviation);
            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 : Abbreviation(com.vladsch.flexmark.ext.abbreviation.Abbreviation) ReplacedTextMapper(com.vladsch.flexmark.util.sequence.ReplacedTextMapper) Matcher(java.util.regex.Matcher) BasedSequence(com.vladsch.flexmark.util.sequence.BasedSequence)

Aggregations

Abbreviation (com.vladsch.flexmark.ext.abbreviation.Abbreviation)1 BasedSequence (com.vladsch.flexmark.util.sequence.BasedSequence)1 ReplacedTextMapper (com.vladsch.flexmark.util.sequence.ReplacedTextMapper)1 Matcher (java.util.regex.Matcher)1