| 1166 | |
| 1167 | |
| 1168 | def math_render_issues(text: str) -> list[dict[str, object]]: |
| 1169 | issues: list[dict[str, object]] = [] |
| 1170 | blocks, delimiter_issues = _extract_math_blocks(text) |
| 1171 | issues.extend(delimiter_issues) |
| 1172 | |
| 1173 | for block in blocks: |
| 1174 | content = str(block["content"]) |
| 1175 | line_number = int(block["line_number"]) |
| 1176 | snippet = str(block["snippet"]) |
| 1177 | |
| 1178 | if _has_double_escaped_tex_command(content): |
| 1179 | issues.append( |
| 1180 | { |
| 1181 | "line_number": line_number, |
| 1182 | "snippet": snippet, |
| 1183 | "reason": "double_escaped_tex_command", |
| 1184 | } |
| 1185 | ) |
| 1186 | if _find_unbalanced_braces(content): |
| 1187 | issues.append( |
| 1188 | { |
| 1189 | "line_number": line_number, |
| 1190 | "snippet": snippet, |
| 1191 | "reason": "unbalanced_braces", |
| 1192 | } |
| 1193 | ) |
| 1194 | if _has_environment_mismatch(content): |
| 1195 | issues.append( |
| 1196 | { |
| 1197 | "line_number": line_number, |
| 1198 | "snippet": snippet, |
| 1199 | "reason": "environment_mismatch", |
| 1200 | } |
| 1201 | ) |
| 1202 | if _has_left_right_mismatch(content): |
| 1203 | issues.append( |
| 1204 | { |
| 1205 | "line_number": line_number, |
| 1206 | "snippet": snippet, |
| 1207 | "reason": "left_right_mismatch", |
| 1208 | } |
| 1209 | ) |
| 1210 | if _has_invalid_frac_arguments(content): |
| 1211 | issues.append( |
| 1212 | { |
| 1213 | "line_number": line_number, |
| 1214 | "snippet": snippet, |
| 1215 | "reason": "invalid_frac_arguments", |
| 1216 | } |
| 1217 | ) |
| 1218 | |
| 1219 | deduped: list[dict[str, object]] = [] |
| 1220 | seen: set[tuple[int, str, str]] = set() |
| 1221 | for issue in issues: |
| 1222 | key = (int(issue["line_number"]), str(issue["snippet"]), str(issue["reason"])) |
| 1223 | if key in seen: |
| 1224 | continue |
| 1225 | seen.add(key) |