codekingpro/portable-devtools
114k
1"""2Parse link destination3"""4 5from ..common.utils import charCodeAt, unescapeAll6 7 8class _Result:9 __slots__ = ("ok", "pos", "str")10 11 def __init__(self) -> None:12 self.ok = False13 self.pos = 014 self.str = ""15 16 17def parseLinkDestination(string: str, pos: int, maximum: int) -> _Result:18 start = pos19 result = _Result()20 21 if charCodeAt(string, pos) == 0x3C: # /* < */22 pos += 123 while pos < maximum:24 code = charCodeAt(string, pos)25 if code == 0x0A: # /* \n */)26 return result27 if code == 0x3C: # / * < * /28 return result29 if code == 0x3E: # /* > */) {30 result.pos = pos + 131 result.str = unescapeAll(string[start + 1 : pos])32 result.ok = True33 return result34 35 if code == 0x5C and pos + 1 < maximum: # \36 pos += 237 continue38 39 pos += 140 41 # no closing '>'42 return result43 44 # this should be ... } else { ... branch45 46 level = 047 while pos < maximum:48 code = charCodeAt(string, pos)49 50 if code is None or code == 0x20:51 break52 53 # ascii control characters54 if code < 0x20 or code == 0x7F:55 break56 57 if code == 0x5C and pos + 1 < maximum:58 if charCodeAt(string, pos + 1) == 0x20:59 break60 pos += 261 continue62 63 if code == 0x28: # /* ( */)64 level += 165 if level > 32:66 return result67 68 if code == 0x29: # /* ) */)69 if level == 0:70 break71 level -= 172 73 pos += 174 75 if start == pos:76 return result77 if level != 0:78 return result79 80 result.str = unescapeAll(string[start:pos])81 result.pos = pos82 result.ok = True83 return result84 