| 1046 | |
| 1047 | |
| 1048 | def _iter_line_matches( |
| 1049 | lines: Sequence[str], |
| 1050 | compiled_regex: Optional[re.Pattern[str]], |
| 1051 | literal_lower: str, |
| 1052 | original_pattern: str, |
| 1053 | case_sensitive: bool, |
| 1054 | use_regex: bool, |
| 1055 | ) -> Iterable[Dict[str, Any]]: |
| 1056 | for idx, raw_line in enumerate(lines): |
| 1057 | line_number = idx + 1 |
| 1058 | line_text = raw_line |
| 1059 | if use_regex and compiled_regex is not None: |
| 1060 | for match in compiled_regex.finditer(line_text): |
| 1061 | yield { |
| 1062 | "line_number": line_number, |
| 1063 | "column": match.start() + 1, |
| 1064 | "line_text": line_text, |
| 1065 | } |
| 1066 | else: |
| 1067 | if not original_pattern: |
| 1068 | continue |
| 1069 | haystack = line_text if case_sensitive else line_text.lower() |
| 1070 | needle = original_pattern if case_sensitive else literal_lower |
| 1071 | start = haystack.find(needle) |
| 1072 | while start != -1: |
| 1073 | yield { |
| 1074 | "line_number": line_number, |
| 1075 | "column": start + 1, |
| 1076 | "line_text": line_text, |
| 1077 | } |
| 1078 | start = haystack.find(needle, start + max(len(needle), 1)) |
| 1079 | |
| 1080 | |
| 1081 | def _slice_context( |