summaryrefslogtreecommitdiff
path: root/packages/markdown-it-14.1.0/lib/rules_inline/fragments_join.mjs
diff options
context:
space:
mode:
Diffstat (limited to 'packages/markdown-it-14.1.0/lib/rules_inline/fragments_join.mjs')
-rw-r--r--packages/markdown-it-14.1.0/lib/rules_inline/fragments_join.mjs38
1 files changed, 38 insertions, 0 deletions
diff --git a/packages/markdown-it-14.1.0/lib/rules_inline/fragments_join.mjs b/packages/markdown-it-14.1.0/lib/rules_inline/fragments_join.mjs
new file mode 100644
index 0000000..e89ef9e
--- /dev/null
+++ b/packages/markdown-it-14.1.0/lib/rules_inline/fragments_join.mjs
@@ -0,0 +1,38 @@
+// Clean up tokens after emphasis and strikethrough postprocessing:
+// merge adjacent text nodes into one and re-calculate all token levels
+//
+// This is necessary because initially emphasis delimiter markers (*, _, ~)
+// are treated as their own separate text tokens. Then emphasis rule either
+// leaves them as text (needed to merge with adjacent text) or turns them
+// into opening/closing tags (which messes up levels inside).
+//
+
+export default function fragments_join (state) {
+ let curr, last
+ let level = 0
+ const tokens = state.tokens
+ const max = state.tokens.length
+
+ for (curr = last = 0; curr < max; curr++) {
+ // re-calculate levels after emphasis/strikethrough turns some text nodes
+ // into opening/closing tags
+ if (tokens[curr].nesting < 0) level-- // closing tag
+ tokens[curr].level = level
+ if (tokens[curr].nesting > 0) level++ // opening tag
+
+ if (tokens[curr].type === 'text' &&
+ curr + 1 < max &&
+ tokens[curr + 1].type === 'text') {
+ // collapse two adjacent text nodes
+ tokens[curr + 1].content = tokens[curr].content + tokens[curr + 1].content
+ } else {
+ if (curr !== last) { tokens[last] = tokens[curr] }
+
+ last++
+ }
+ }
+
+ if (curr !== last) {
+ tokens.length = last
+ }
+}