Skip to content

Commit

Permalink
More efficient resolution of joiner contexts
Browse files Browse the repository at this point in the history
In some pathological cases, this would out eligibility under
CONTEXTJ rules much faster.
  • Loading branch information
kjd committed Apr 2, 2024
1 parent 1b12148 commit 5beb28b
Show file tree
Hide file tree
Showing 3 changed files with 2,164 additions and 62 deletions.
16 changes: 8 additions & 8 deletions idna/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -150,9 +150,11 @@ def valid_contextj(label: str, pos: int) -> bool:
joining_type = idnadata.joining_types.get(ord(label[i]))
if joining_type == ord('T'):
continue
if joining_type in [ord('L'), ord('D')]:
elif joining_type in [ord('L'), ord('D')]:
ok = True
break
else:
break

if not ok:
return False
Expand All @@ -162,9 +164,11 @@ def valid_contextj(label: str, pos: int) -> bool:
joining_type = idnadata.joining_types.get(ord(label[i]))
if joining_type == ord('T'):
continue
if joining_type in [ord('R'), ord('D')]:
elif joining_type in [ord('R'), ord('D')]:
ok = True
break
else:
break
return ok

if cp_value == 0x200d:
Expand Down Expand Up @@ -236,12 +240,8 @@ def check_label(label: Union[str, bytes, bytearray]) -> None:
if intranges_contain(cp_value, idnadata.codepoint_classes['PVALID']):
continue
elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTJ']):
try:
if not valid_contextj(label, pos):
raise InvalidCodepointContext('Joiner {} not allowed at position {} in {}'.format(
_unot(cp_value), pos+1, repr(label)))
except ValueError:
raise IDNAError('Unknown codepoint adjacent to joiner {} at position {} in {}'.format(
if not valid_contextj(label, pos):
raise InvalidCodepointContext('Joiner {} not allowed at position {} in {}'.format(
_unot(cp_value), pos+1, repr(label)))
elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTO']):
if not valid_contexto(label, pos):
Expand Down

0 comments on commit 5beb28b

Please sign in to comment.