package io.noties.markwon.inlineparser; import org.commonmark.node.Node; import org.commonmark.node.Text; /** * @since 4.2.0 */ public abstract class InlineParserUtils { public static void mergeTextNodesBetweenExclusive(Node fromNode, Node toNode) { // No nodes between them if (fromNode == toNode || fromNode.getNext() == toNode) { return; } mergeTextNodesInclusive(fromNode.getNext(), toNode.getPrevious()); } public static void mergeChildTextNodes(Node node) { // No children or just one child node, no need for merging if (node.getFirstChild() == node.getLastChild()) { return; } mergeTextNodesInclusive(node.getFirstChild(), node.getLastChild()); } public static void mergeTextNodesInclusive(Node fromNode, Node toNode) { Text first = null; Text last = null; int length = 0; Node node = fromNode; while (node != null) { if (node instanceof Text) { Text text = (Text) node; if (first == null) { first = text; } length += text.getLiteral().length(); last = text; } else { mergeIfNeeded(first, last, length); first = null; last = null; length = 0; } if (node == toNode) { break; } node = node.getNext(); } mergeIfNeeded(first, last, length); } public static void mergeIfNeeded(Text first, Text last, int textLength) { if (first != null && last != null && first != last) { StringBuilder sb = new StringBuilder(textLength); sb.append(first.getLiteral()); Node node = first.getNext(); Node stop = last.getNext(); while (node != stop) { sb.append(((Text) node).getLiteral()); Node unlink = node; node = node.getNext(); unlink.unlink(); } String literal = sb.toString(); first.setLiteral(literal); } } private InlineParserUtils() { } }