diff options
author | altaf-creator <dev@altafcreator.com> | 2024-05-12 12:14:02 +0700 |
---|---|---|
committer | altaf-creator <dev@altafcreator.com> | 2024-05-12 12:14:02 +0700 |
commit | d607ac12097afb5cb6f398a4e7b5cf4316efedc6 (patch) | |
tree | 6f4bc5b98a6ff3a1c3189f7ef9b570c0481e100d /packages/markdown-it-14.1.0/lib/helpers/parse_link_destination.mjs | |
parent | 7441f212967256ac4c9a93ba0b1f026308a8bfb6 (diff) |
self host
Diffstat (limited to 'packages/markdown-it-14.1.0/lib/helpers/parse_link_destination.mjs')
-rw-r--r-- | packages/markdown-it-14.1.0/lib/helpers/parse_link_destination.mjs | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/packages/markdown-it-14.1.0/lib/helpers/parse_link_destination.mjs b/packages/markdown-it-14.1.0/lib/helpers/parse_link_destination.mjs new file mode 100644 index 0000000..6a723a6 --- /dev/null +++ b/packages/markdown-it-14.1.0/lib/helpers/parse_link_destination.mjs @@ -0,0 +1,77 @@ +// Parse link destination +// + +import { unescapeAll } from '../common/utils.mjs' + +export default function parseLinkDestination (str, start, max) { + let code + let pos = start + + const result = { + ok: false, + pos: 0, + str: '' + } + + if (str.charCodeAt(pos) === 0x3C /* < */) { + pos++ + while (pos < max) { + code = str.charCodeAt(pos) + if (code === 0x0A /* \n */) { return result } + if (code === 0x3C /* < */) { return result } + if (code === 0x3E /* > */) { + result.pos = pos + 1 + result.str = unescapeAll(str.slice(start + 1, pos)) + result.ok = true + return result + } + if (code === 0x5C /* \ */ && pos + 1 < max) { + pos += 2 + continue + } + + pos++ + } + + // no closing '>' + return result + } + + // this should be ... } else { ... branch + + let level = 0 + while (pos < max) { + code = str.charCodeAt(pos) + + if (code === 0x20) { break } + + // ascii control characters + if (code < 0x20 || code === 0x7F) { break } + + if (code === 0x5C /* \ */ && pos + 1 < max) { + if (str.charCodeAt(pos + 1) === 0x20) { break } + pos += 2 + continue + } + + if (code === 0x28 /* ( */) { + level++ + if (level > 32) { return result } + } + + if (code === 0x29 /* ) */) { + if (level === 0) { break } + level-- + } + + pos++ + } + + if (start === pos) { return result } + if (level !== 0) { return result } + + result.str = unescapeAll(str.slice(start, pos)) + result.pos = pos + result.ok = true + return result +} |