]> git.openstreetmap.org Git - nominatim.git/blob - nominatim/tokenizer/place_sanitizer.py
add type annotations for ICU tokenizer
[nominatim.git] / nominatim / tokenizer / place_sanitizer.py
1 # SPDX-License-Identifier: GPL-2.0-only
2 #
3 # This file is part of Nominatim. (https://nominatim.org)
4 #
5 # Copyright (C) 2022 by the Nominatim developer community.
6 # For a full list of authors see the git log.
7 """
8 Handler for cleaning name and address tags in place information before it
9 is handed to the token analysis.
10 """
11 from typing import Optional, List, Mapping, Sequence, Callable, Any, Tuple
12 import importlib
13
14 from nominatim.errors import UsageError
15 from nominatim.tokenizer.sanitizers.config import SanitizerConfig
16 from nominatim.tokenizer.sanitizers.base import SanitizerHandler, ProcessInfo, PlaceName
17 from nominatim.data.place_info import PlaceInfo
18
19
20 class PlaceSanitizer:
21     """ Controller class which applies sanitizer functions on the place
22         names and address before they are used by the token analysers.
23     """
24
25     def __init__(self, rules: Optional[Sequence[Mapping[str, Any]]]) -> None:
26         self.handlers: List[Callable[[ProcessInfo], None]] = []
27
28         if rules:
29             for func in rules:
30                 if 'step' not in func:
31                     raise UsageError("Sanitizer rule is missing the 'step' attribute.")
32                 module_name = 'nominatim.tokenizer.sanitizers.' + func['step'].replace('-', '_')
33                 handler_module: SanitizerHandler = importlib.import_module(module_name)
34                 self.handlers.append(handler_module.create(SanitizerConfig(func)))
35
36
37     def process_names(self, place: PlaceInfo) -> Tuple[List[PlaceName], List[PlaceName]]:
38         """ Extract a sanitized list of names and address parts from the
39             given place. The function returns a tuple
40             (list of names, list of address names)
41         """
42         obj = ProcessInfo(place)
43
44         for func in self.handlers:
45             func(obj)
46
47         return obj.names, obj.address