Avoid matching named aliases against ordinary lowercase words

This commit is contained in:
Kai Tan
2026-10-08 08:55:13 +08:00
parent dd5a99dc23
commit 3ca7e09b71
4 changed files with 32 additions and 3 deletions
+10 -3
View File
@@ -21,7 +21,14 @@ def matches(source, text):
escaped = r'(?<!\w)' + escaped
if source and source[-1].isascii() and source[-1].isalnum():
escaped += r'(?!\w)'
return re.search(escaped, text, re.IGNORECASE) is not None
return re.search(escaped, text, matching_flags(source)) is not None
def matching_flags(alias):
# WHO/who, US/us, Jobs/jobs and Arm/arm are different words. Single Latin
# named tokens keep their case; full phrases retain tolerant matching.
named_token = alias.isascii() and not re.search(r'\s', alias) and any(c.isupper() for c in alias)
return 0 if named_token else re.IGNORECASE
class BookGlossary:
@@ -59,7 +66,7 @@ class BookGlossary:
pattern = r'(?<!\w)' + pattern
if alias[-1].isascii() and alias[-1].isalnum():
pattern += r'(?!\w)'
for match in re.finditer(pattern, text, re.IGNORECASE):
for match in re.finditer(pattern, text, matching_flags(alias)):
start, end = match.span()
if any(start < right and end > left for left, right in excluded):
continue
@@ -98,7 +105,7 @@ class BookGlossary:
return errors
def fingerprint(self):
return hashlib.sha256(json.dumps(self.terms, sort_keys=True, ensure_ascii=False).encode()).hexdigest()
return hashlib.sha256(json.dumps(['case-sensitive-named-tokens-v3', self.terms], sort_keys=True, ensure_ascii=False).encode()).hexdigest()
def merge_proposal(terms, proposal, conflicts, ambiguous_aliases):