summaryrefslogtreecommitdiff
path: root/packages/markdown-it-14.1.0/lib/rules_inline/fragments_join.mjs
diff options
context:
space:
mode:
authoraltaf-creator <dev@altafcreator.com>2024-05-12 12:14:02 +0700
committeraltaf-creator <dev@altafcreator.com>2024-05-12 12:14:02 +0700
commitd607ac12097afb5cb6f398a4e7b5cf4316efedc6 (patch)
tree6f4bc5b98a6ff3a1c3189f7ef9b570c0481e100d /packages/markdown-it-14.1.0/lib/rules_inline/fragments_join.mjs
parent7441f212967256ac4c9a93ba0b1f026308a8bfb6 (diff)
self host
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
+ }
+}