diff options
| author | eivanov89 <[email protected]> | 2025-08-29 10:12:02 +0300 |
|---|---|---|
| committer | eivanov89 <[email protected]> | 2025-08-29 10:27:27 +0300 |
| commit | 140ced4d34c422c9f3cbe096f8dd35243b67d6e4 (patch) | |
| tree | b7373341f64151c0ab9839ee692dc919366590d5 /contrib/python/markdown-it-py/markdown_it/helpers/parse_link_destination.py | |
| parent | 136471c8b2f3ab8cd7993200c0de0456b7018118 (diff) | |
Add python/textual to YDB
commit_hash:eda16a869229724fec5479fa27fa5cdbccbe0395
Diffstat (limited to 'contrib/python/markdown-it-py/markdown_it/helpers/parse_link_destination.py')
| -rw-r--r-- | contrib/python/markdown-it-py/markdown_it/helpers/parse_link_destination.py | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/contrib/python/markdown-it-py/markdown_it/helpers/parse_link_destination.py b/contrib/python/markdown-it-py/markdown_it/helpers/parse_link_destination.py new file mode 100644 index 00000000000..c98323c056e --- /dev/null +++ b/contrib/python/markdown-it-py/markdown_it/helpers/parse_link_destination.py @@ -0,0 +1,83 @@ +""" +Parse link destination +""" + +from ..common.utils import charCodeAt, unescapeAll + + +class _Result: + __slots__ = ("ok", "pos", "str") + + def __init__(self) -> None: + self.ok = False + self.pos = 0 + self.str = "" + + +def parseLinkDestination(string: str, pos: int, maximum: int) -> _Result: + start = pos + result = _Result() + + if charCodeAt(string, pos) == 0x3C: # /* < */ + pos += 1 + while pos < maximum: + code = charCodeAt(string, pos) + if code == 0x0A: # /* \n */) + return result + if code == 0x3C: # / * < * / + return result + if code == 0x3E: # /* > */) { + result.pos = pos + 1 + result.str = unescapeAll(string[start + 1 : pos]) + result.ok = True + return result + + if code == 0x5C and pos + 1 < maximum: # \ + pos += 2 + continue + + pos += 1 + + # no closing '>' + return result + + # this should be ... } else { ... branch + + level = 0 + while pos < maximum: + code = charCodeAt(string, pos) + + if code is None or code == 0x20: + break + + # ascii control characters + if code < 0x20 or code == 0x7F: + break + + if code == 0x5C and pos + 1 < maximum: + if charCodeAt(string, pos + 1) == 0x20: + break + pos += 2 + continue + + if code == 0x28: # /* ( */) + level += 1 + if level > 32: + return result + + if code == 0x29: # /* ) */) + if level == 0: + break + level -= 1 + + pos += 1 + + if start == pos: + return result + if level != 0: + return result + + result.str = unescapeAll(string[start:pos]) + result.pos = pos + result.ok = True + return result |
