def tokenize(cls, locator: str) -> List[TokenPair]: """Convert locator string to list of token pairs.""" scanner = cls.PATTERN.scanner(locator) tokens = [] for match in iter(scanner.match, None): name = match.lastgroup value = match.group() if name == "MISMATCH": raise InvalidSyntax(f"Unknown token: '{value}'") if name == "SKIP": continue if name == "LOCATOR": value = literal.parse(value) pair = TokenPair(Token[name], value) tokens.append(pair) if not tokens: raise InvalidSyntax("Empty expression") return tokens
def test_parse_size(self): locator = literal.parse("region:50,75,100,200") assert isinstance(locator, RegionLocator) assert locator.left == 50 assert locator.top == 75 assert locator.right == 100 assert locator.bottom == 200
def _part(cls, text: str) -> List[TokenPair]: # Exact lexeme match for key, values in cls.LEXEME.items(): if text in values: return [TokenPair(key, text)] # Prefixed with token for key, values in cls.PREFIX.items(): if text.startswith(values): prefix = [TokenPair(key, text[0])] return prefix + cls._part(text[1:]) # Suffixed with token for key, values in cls.SUFFIX.items(): if text.endswith(values): suffix = [TokenPair(key, text[-1])] return cls._part(text[:-1]) + suffix # No matches -> must be valid locator literal locator = literal.parse(text) return [TokenPair(Token.LOCATOR, locator)]
def test_parse_size(self): locator = literal.parse("size:100,200") assert isinstance(locator, SizeLocator) assert locator.width == 100 assert locator.height == 200
def test_parse_offset(self): locator = literal.parse("offset:100,200") assert isinstance(locator, OffsetLocator) assert locator.x == 100 assert locator.y == 200
def test_parse_coordinates(self): # Kept for backwards compatibility locator = literal.parse("coordinates:100,200") assert isinstance(locator, PointLocator) assert locator.x == 100 assert locator.y == 200
def test_parse_point(self): locator = literal.parse("point:100,200") assert isinstance(locator, PointLocator) assert locator.x == 100 assert locator.y == 200
def test_parse_image_args(self): locator = literal.parse("image:path/to/file.png,80.0") assert isinstance(locator, ImageLocator) assert locator.path == "path/to/file.png" assert locator.confidence == 80.0