78 lines
2.2 KiB
Java
78 lines
2.2 KiB
Java
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() {
|
|
}
|
|
}
|