diff options
| author | altaf-creator <dev@altafcreator.com> | 2026-04-30 22:01:53 +0800 |
|---|---|---|
| committer | altaf-creator <dev@altafcreator.com> | 2026-04-30 22:01:53 +0800 |
| commit | db1c6676a13798ee57dbac429a1d5045b60356fb (patch) | |
| tree | 5ff305c09686de50bbcac404c1954e42c26ba494 /packages/markdown-it-14.1.0/lib/rules_core | |
| parent | 97fa8f57fbefcbfa6b3e56c31a1e5b60ef1a9e37 (diff) | |
quite a big commit
Diffstat (limited to 'packages/markdown-it-14.1.0/lib/rules_core')
8 files changed, 0 insertions, 529 deletions
diff --git a/packages/markdown-it-14.1.0/lib/rules_core/block.mjs b/packages/markdown-it-14.1.0/lib/rules_core/block.mjs deleted file mode 100644 index 526cb48..0000000 --- a/packages/markdown-it-14.1.0/lib/rules_core/block.mjs +++ /dev/null @@ -1,13 +0,0 @@ -export default function block (state) { - let token - - if (state.inlineMode) { - token = new state.Token('inline', '', 0) - token.content = state.src - token.map = [0, 1] - token.children = [] - state.tokens.push(token) - } else { - state.md.block.parse(state.src, state.md, state.env, state.tokens) - } -} diff --git a/packages/markdown-it-14.1.0/lib/rules_core/inline.mjs b/packages/markdown-it-14.1.0/lib/rules_core/inline.mjs deleted file mode 100644 index efd6c07..0000000 --- a/packages/markdown-it-14.1.0/lib/rules_core/inline.mjs +++ /dev/null @@ -1,11 +0,0 @@ -export default function inline (state) { - const tokens = state.tokens - - // Parse inlines - for (let i = 0, l = tokens.length; i < l; i++) { - const tok = tokens[i] - if (tok.type === 'inline') { - state.md.inline.parse(tok.content, state.md, state.env, tok.children) - } - } -} diff --git a/packages/markdown-it-14.1.0/lib/rules_core/linkify.mjs b/packages/markdown-it-14.1.0/lib/rules_core/linkify.mjs deleted file mode 100644 index a225280..0000000 --- a/packages/markdown-it-14.1.0/lib/rules_core/linkify.mjs +++ /dev/null @@ -1,134 +0,0 @@ -// Replace link-like texts with link nodes. -// -// Currently restricted by `md.validateLink()` to http/https/ftp -// - -import { arrayReplaceAt } from '../common/utils.mjs' - -function isLinkOpen (str) { - return /^<a[>\s]/i.test(str) -} -function isLinkClose (str) { - return /^<\/a\s*>/i.test(str) -} - -export default function linkify (state) { - const blockTokens = state.tokens - - if (!state.md.options.linkify) { return } - - for (let j = 0, l = blockTokens.length; j < l; j++) { - if (blockTokens[j].type !== 'inline' || - !state.md.linkify.pretest(blockTokens[j].content)) { - continue - } - - let tokens = blockTokens[j].children - - let htmlLinkLevel = 0 - - // We scan from the end, to keep position when new tags added. - // Use reversed logic in links start/end match - for (let i = tokens.length - 1; i >= 0; i--) { - const currentToken = tokens[i] - - // Skip content of markdown links - if (currentToken.type === 'link_close') { - i-- - while (tokens[i].level !== currentToken.level && tokens[i].type !== 'link_open') { - i-- - } - continue - } - - // Skip content of html tag links - if (currentToken.type === 'html_inline') { - if (isLinkOpen(currentToken.content) && htmlLinkLevel > 0) { - htmlLinkLevel-- - } - if (isLinkClose(currentToken.content)) { - htmlLinkLevel++ - } - } - if (htmlLinkLevel > 0) { continue } - - if (currentToken.type === 'text' && state.md.linkify.test(currentToken.content)) { - const text = currentToken.content - let links = state.md.linkify.match(text) - - // Now split string to nodes - const nodes = [] - let level = currentToken.level - let lastPos = 0 - - // forbid escape sequence at the start of the string, - // this avoids http\://example.com/ from being linkified as - // http:<a href="//example.com/">//example.com/</a> - if (links.length > 0 && - links[0].index === 0 && - i > 0 && - tokens[i - 1].type === 'text_special') { - links = links.slice(1) - } - - for (let ln = 0; ln < links.length; ln++) { - const url = links[ln].url - const fullUrl = state.md.normalizeLink(url) - if (!state.md.validateLink(fullUrl)) { continue } - - let urlText = links[ln].text - - // Linkifier might send raw hostnames like "example.com", where url - // starts with domain name. So we prepend http:// in those cases, - // and remove it afterwards. - // - if (!links[ln].schema) { - urlText = state.md.normalizeLinkText('http://' + urlText).replace(/^http:\/\//, '') - } else if (links[ln].schema === 'mailto:' && !/^mailto:/i.test(urlText)) { - urlText = state.md.normalizeLinkText('mailto:' + urlText).replace(/^mailto:/, '') - } else { - urlText = state.md.normalizeLinkText(urlText) - } - - const pos = links[ln].index - - if (pos > lastPos) { - const token = new state.Token('text', '', 0) - token.content = text.slice(lastPos, pos) - token.level = level - nodes.push(token) - } - - const token_o = new state.Token('link_open', 'a', 1) - token_o.attrs = [['href', fullUrl]] - token_o.level = level++ - token_o.markup = 'linkify' - token_o.info = 'auto' - nodes.push(token_o) - - const token_t = new state.Token('text', '', 0) - token_t.content = urlText - token_t.level = level - nodes.push(token_t) - - const token_c = new state.Token('link_close', 'a', -1) - token_c.level = --level - token_c.markup = 'linkify' - token_c.info = 'auto' - nodes.push(token_c) - - lastPos = links[ln].lastIndex - } - if (lastPos < text.length) { - const token = new state.Token('text', '', 0) - token.content = text.slice(lastPos) - token.level = level - nodes.push(token) - } - - // replace current node - blockTokens[j].children = tokens = arrayReplaceAt(tokens, i, nodes) - } - } - } -} diff --git a/packages/markdown-it-14.1.0/lib/rules_core/normalize.mjs b/packages/markdown-it-14.1.0/lib/rules_core/normalize.mjs deleted file mode 100644 index dfb67ef..0000000 --- a/packages/markdown-it-14.1.0/lib/rules_core/normalize.mjs +++ /dev/null @@ -1,17 +0,0 @@ -// Normalize input string - -// https://spec.commonmark.org/0.29/#line-ending -const NEWLINES_RE = /\r\n?|\n/g -const NULL_RE = /\0/g - -export default function normalize (state) { - let str - - // Normalize newlines - str = state.src.replace(NEWLINES_RE, '\n') - - // Replace NULL characters - str = str.replace(NULL_RE, '\uFFFD') - - state.src = str -} diff --git a/packages/markdown-it-14.1.0/lib/rules_core/replacements.mjs b/packages/markdown-it-14.1.0/lib/rules_core/replacements.mjs deleted file mode 100644 index b18ecd9..0000000 --- a/packages/markdown-it-14.1.0/lib/rules_core/replacements.mjs +++ /dev/null @@ -1,101 +0,0 @@ -// Simple typographic replacements -// -// (c) (C) → © -// (tm) (TM) → ™ -// (r) (R) → ® -// +- → ± -// ... → … (also ?.... → ?.., !.... → !..) -// ???????? → ???, !!!!! → !!!, `,,` → `,` -// -- → –, --- → — -// - -// TODO: -// - fractionals 1/2, 1/4, 3/4 -> ½, ¼, ¾ -// - multiplications 2 x 4 -> 2 × 4 - -const RARE_RE = /\+-|\.\.|\?\?\?\?|!!!!|,,|--/ - -// Workaround for phantomjs - need regex without /g flag, -// or root check will fail every second time -const SCOPED_ABBR_TEST_RE = /\((c|tm|r)\)/i - -const SCOPED_ABBR_RE = /\((c|tm|r)\)/ig -const SCOPED_ABBR = { - c: '©', - r: '®', - tm: '™' -} - -function replaceFn (match, name) { - return SCOPED_ABBR[name.toLowerCase()] -} - -function replace_scoped (inlineTokens) { - let inside_autolink = 0 - - for (let i = inlineTokens.length - 1; i >= 0; i--) { - const token = inlineTokens[i] - - if (token.type === 'text' && !inside_autolink) { - token.content = token.content.replace(SCOPED_ABBR_RE, replaceFn) - } - - if (token.type === 'link_open' && token.info === 'auto') { - inside_autolink-- - } - - if (token.type === 'link_close' && token.info === 'auto') { - inside_autolink++ - } - } -} - -function replace_rare (inlineTokens) { - let inside_autolink = 0 - - for (let i = inlineTokens.length - 1; i >= 0; i--) { - const token = inlineTokens[i] - - if (token.type === 'text' && !inside_autolink) { - if (RARE_RE.test(token.content)) { - token.content = token.content - .replace(/\+-/g, '±') - // .., ..., ....... -> … - // but ?..... & !..... -> ?.. & !.. - .replace(/\.{2,}/g, '…').replace(/([?!])…/g, '$1..') - .replace(/([?!]){4,}/g, '$1$1$1').replace(/,{2,}/g, ',') - // em-dash - .replace(/(^|[^-])---(?=[^-]|$)/mg, '$1\u2014') - // en-dash - .replace(/(^|\s)--(?=\s|$)/mg, '$1\u2013') - .replace(/(^|[^-\s])--(?=[^-\s]|$)/mg, '$1\u2013') - } - } - - if (token.type === 'link_open' && token.info === 'auto') { - inside_autolink-- - } - - if (token.type === 'link_close' && token.info === 'auto') { - inside_autolink++ - } - } -} - -export default function replace (state) { - let blkIdx - - if (!state.md.options.typographer) { return } - - for (blkIdx = state.tokens.length - 1; blkIdx >= 0; blkIdx--) { - if (state.tokens[blkIdx].type !== 'inline') { continue } - - if (SCOPED_ABBR_TEST_RE.test(state.tokens[blkIdx].content)) { - replace_scoped(state.tokens[blkIdx].children) - } - - if (RARE_RE.test(state.tokens[blkIdx].content)) { - replace_rare(state.tokens[blkIdx].children) - } - } -} diff --git a/packages/markdown-it-14.1.0/lib/rules_core/smartquotes.mjs b/packages/markdown-it-14.1.0/lib/rules_core/smartquotes.mjs deleted file mode 100644 index 3b990ed..0000000 --- a/packages/markdown-it-14.1.0/lib/rules_core/smartquotes.mjs +++ /dev/null @@ -1,193 +0,0 @@ -// Convert straight quotation marks to typographic ones -// - -import { isWhiteSpace, isPunctChar, isMdAsciiPunct } from '../common/utils.mjs' - -const QUOTE_TEST_RE = /['"]/ -const QUOTE_RE = /['"]/g -const APOSTROPHE = '\u2019' /* ’ */ - -function replaceAt (str, index, ch) { - return str.slice(0, index) + ch + str.slice(index + 1) -} - -function process_inlines (tokens, state) { - let j - - const stack = [] - - for (let i = 0; i < tokens.length; i++) { - const token = tokens[i] - - const thisLevel = tokens[i].level - - for (j = stack.length - 1; j >= 0; j--) { - if (stack[j].level <= thisLevel) { break } - } - stack.length = j + 1 - - if (token.type !== 'text') { continue } - - let text = token.content - let pos = 0 - let max = text.length - - /* eslint no-labels:0,block-scoped-var:0 */ - OUTER: - while (pos < max) { - QUOTE_RE.lastIndex = pos - const t = QUOTE_RE.exec(text) - if (!t) { break } - - let canOpen = true - let canClose = true - pos = t.index + 1 - const isSingle = (t[0] === "'") - - // Find previous character, - // default to space if it's the beginning of the line - // - let lastChar = 0x20 - - if (t.index - 1 >= 0) { - lastChar = text.charCodeAt(t.index - 1) - } else { - for (j = i - 1; j >= 0; j--) { - if (tokens[j].type === 'softbreak' || tokens[j].type === 'hardbreak') break // lastChar defaults to 0x20 - if (!tokens[j].content) continue // should skip all tokens except 'text', 'html_inline' or 'code_inline' - - lastChar = tokens[j].content.charCodeAt(tokens[j].content.length - 1) - break - } - } - - // Find next character, - // default to space if it's the end of the line - // - let nextChar = 0x20 - - if (pos < max) { - nextChar = text.charCodeAt(pos) - } else { - for (j = i + 1; j < tokens.length; j++) { - if (tokens[j].type === 'softbreak' || tokens[j].type === 'hardbreak') break // nextChar defaults to 0x20 - if (!tokens[j].content) continue // should skip all tokens except 'text', 'html_inline' or 'code_inline' - - nextChar = tokens[j].content.charCodeAt(0) - break - } - } - - const isLastPunctChar = isMdAsciiPunct(lastChar) || isPunctChar(String.fromCharCode(lastChar)) - const isNextPunctChar = isMdAsciiPunct(nextChar) || isPunctChar(String.fromCharCode(nextChar)) - - const isLastWhiteSpace = isWhiteSpace(lastChar) - const isNextWhiteSpace = isWhiteSpace(nextChar) - - if (isNextWhiteSpace) { - canOpen = false - } else if (isNextPunctChar) { - if (!(isLastWhiteSpace || isLastPunctChar)) { - canOpen = false - } - } - - if (isLastWhiteSpace) { - canClose = false - } else if (isLastPunctChar) { - if (!(isNextWhiteSpace || isNextPunctChar)) { - canClose = false - } - } - - if (nextChar === 0x22 /* " */ && t[0] === '"') { - if (lastChar >= 0x30 /* 0 */ && lastChar <= 0x39 /* 9 */) { - // special case: 1"" - count first quote as an inch - canClose = canOpen = false - } - } - - if (canOpen && canClose) { - // Replace quotes in the middle of punctuation sequence, but not - // in the middle of the words, i.e.: - // - // 1. foo " bar " baz - not replaced - // 2. foo-"-bar-"-baz - replaced - // 3. foo"bar"baz - not replaced - // - canOpen = isLastPunctChar - canClose = isNextPunctChar - } - - if (!canOpen && !canClose) { - // middle of word - if (isSingle) { - token.content = replaceAt(token.content, t.index, APOSTROPHE) - } - continue - } - - if (canClose) { - // this could be a closing quote, rewind the stack to get a match - for (j = stack.length - 1; j >= 0; j--) { - let item = stack[j] - if (stack[j].level < thisLevel) { break } - if (item.single === isSingle && stack[j].level === thisLevel) { - item = stack[j] - - let openQuote - let closeQuote - if (isSingle) { - openQuote = state.md.options.quotes[2] - closeQuote = state.md.options.quotes[3] - } else { - openQuote = state.md.options.quotes[0] - closeQuote = state.md.options.quotes[1] - } - - // replace token.content *before* tokens[item.token].content, - // because, if they are pointing at the same token, replaceAt - // could mess up indices when quote length != 1 - token.content = replaceAt(token.content, t.index, closeQuote) - tokens[item.token].content = replaceAt( - tokens[item.token].content, item.pos, openQuote) - - pos += closeQuote.length - 1 - if (item.token === i) { pos += openQuote.length - 1 } - - text = token.content - max = text.length - - stack.length = j - continue OUTER - } - } - } - - if (canOpen) { - stack.push({ - token: i, - pos: t.index, - single: isSingle, - level: thisLevel - }) - } else if (canClose && isSingle) { - token.content = replaceAt(token.content, t.index, APOSTROPHE) - } - } - } -} - -export default function smartquotes (state) { - /* eslint max-depth:0 */ - if (!state.md.options.typographer) { return } - - for (let blkIdx = state.tokens.length - 1; blkIdx >= 0; blkIdx--) { - if (state.tokens[blkIdx].type !== 'inline' || - !QUOTE_TEST_RE.test(state.tokens[blkIdx].content)) { - continue - } - - process_inlines(state.tokens[blkIdx].children, state) - } -} diff --git a/packages/markdown-it-14.1.0/lib/rules_core/state_core.mjs b/packages/markdown-it-14.1.0/lib/rules_core/state_core.mjs deleted file mode 100644 index a96c8fb..0000000 --- a/packages/markdown-it-14.1.0/lib/rules_core/state_core.mjs +++ /dev/null @@ -1,17 +0,0 @@ -// Core state object -// - -import Token from '../token.mjs' - -function StateCore (src, md, env) { - this.src = src - this.env = env - this.tokens = [] - this.inlineMode = false - this.md = md // link to parser instance -} - -// re-export Token class to use in core rules -StateCore.prototype.Token = Token - -export default StateCore diff --git a/packages/markdown-it-14.1.0/lib/rules_core/text_join.mjs b/packages/markdown-it-14.1.0/lib/rules_core/text_join.mjs deleted file mode 100644 index ee8f872..0000000 --- a/packages/markdown-it-14.1.0/lib/rules_core/text_join.mjs +++ /dev/null @@ -1,43 +0,0 @@ -// Join raw text tokens with the rest of the text -// -// This is set as a separate rule to provide an opportunity for plugins -// to run text replacements after text join, but before escape join. -// -// For example, `\:)` shouldn't be replaced with an emoji. -// - -export default function text_join (state) { - let curr, last - const blockTokens = state.tokens - const l = blockTokens.length - - for (let j = 0; j < l; j++) { - if (blockTokens[j].type !== 'inline') continue - - const tokens = blockTokens[j].children - const max = tokens.length - - for (curr = 0; curr < max; curr++) { - if (tokens[curr].type === 'text_special') { - tokens[curr].type = 'text' - } - } - - for (curr = last = 0; curr < max; curr++) { - 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 - } - } -} |
