summaryrefslogtreecommitdiffstats
path: root/contrib/python/markdown-it-py/markdown_it/helpers/parse_link_title.py
diff options
context:
space:
mode:
authoreivanov89 <[email protected]>2025-08-29 10:12:02 +0300
committereivanov89 <[email protected]>2025-08-29 10:27:27 +0300
commit140ced4d34c422c9f3cbe096f8dd35243b67d6e4 (patch)
treeb7373341f64151c0ab9839ee692dc919366590d5 /contrib/python/markdown-it-py/markdown_it/helpers/parse_link_title.py
parent136471c8b2f3ab8cd7993200c0de0456b7018118 (diff)
Add python/textual to YDB
commit_hash:eda16a869229724fec5479fa27fa5cdbccbe0395
Diffstat (limited to 'contrib/python/markdown-it-py/markdown_it/helpers/parse_link_title.py')
-rw-r--r--contrib/python/markdown-it-py/markdown_it/helpers/parse_link_title.py75
1 files changed, 75 insertions, 0 deletions
diff --git a/contrib/python/markdown-it-py/markdown_it/helpers/parse_link_title.py b/contrib/python/markdown-it-py/markdown_it/helpers/parse_link_title.py
new file mode 100644
index 00000000000..a38ff0d98ac
--- /dev/null
+++ b/contrib/python/markdown-it-py/markdown_it/helpers/parse_link_title.py
@@ -0,0 +1,75 @@
+"""Parse link title"""
+
+from ..common.utils import charCodeAt, unescapeAll
+
+
+class _State:
+ __slots__ = ("can_continue", "marker", "ok", "pos", "str")
+
+ def __init__(self) -> None:
+ self.ok = False
+ """if `true`, this is a valid link title"""
+ self.can_continue = False
+ """if `true`, this link can be continued on the next line"""
+ self.pos = 0
+ """if `ok`, it's the position of the first character after the closing marker"""
+ self.str = ""
+ """if `ok`, it's the unescaped title"""
+ self.marker = 0
+ """expected closing marker character code"""
+
+ def __str__(self) -> str:
+ return self.str
+
+
+def parseLinkTitle(
+ string: str, start: int, maximum: int, prev_state: _State | None = None
+) -> _State:
+ """Parse link title within `str` in [start, max] range,
+ or continue previous parsing if `prev_state` is defined (equal to result of last execution).
+ """
+ pos = start
+ state = _State()
+
+ if prev_state is not None:
+ # this is a continuation of a previous parseLinkTitle call on the next line,
+ # used in reference links only
+ state.str = prev_state.str
+ state.marker = prev_state.marker
+ else:
+ if pos >= maximum:
+ return state
+
+ marker = charCodeAt(string, pos)
+
+ # /* " */ /* ' */ /* ( */
+ if marker != 0x22 and marker != 0x27 and marker != 0x28:
+ return state
+
+ start += 1
+ pos += 1
+
+ # if opening marker is "(", switch it to closing marker ")"
+ if marker == 0x28:
+ marker = 0x29
+
+ state.marker = marker
+
+ while pos < maximum:
+ code = charCodeAt(string, pos)
+ if code == state.marker:
+ state.pos = pos + 1
+ state.str += unescapeAll(string[start:pos])
+ state.ok = True
+ return state
+ elif code == 0x28 and state.marker == 0x29: # /* ( */ /* ) */
+ return state
+ elif code == 0x5C and pos + 1 < maximum: # /* \ */
+ pos += 1
+
+ pos += 1
+
+ # no closing marker found, but this link title may continue on the next line (for references)
+ state.can_continue = True
+ state.str += unescapeAll(string[start:pos])
+ return state