| # |
| # This program is free software; you can redistribute it and/or modify |
| # it under the terms of the GNU General Public License as published by |
| # the Free Software Foundation; version 2 of the License. |
| # |
| # This program is distributed in the hope that it will be useful, |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| # GNU General Public License for more details. |
| # |
| # You should have received a copy of the GNU General Public License |
| # along with this program; if not, see |
| # https://www.gnu.org/licenses/old-licenses/gpl-2.0.html. |
| """ |
| Copyright (C) 2010-2011 Lucas De Marchi <lucas.de.marchi@gmail.com> |
| Copyright (C) 2011 ProFUSION embedded systems |
| """ |
| |
| # Pass all misspellings through this translation table to generate |
| # alternative misspellings and fixes. |
| alt_chars = (("'", "’"),) # noqa: RUF001 |
| |
| |
| class Misspelling: |
| def __init__(self, data: str, fix: bool, reason: str) -> None: |
| self.data = data |
| self.fix = fix |
| self.reason = reason |
| |
| |
| def add_misspelling( |
| key: str, |
| data: str, |
| misspellings: dict[str, Misspelling], |
| ) -> None: |
| data = data.strip() |
| |
| if "," in data: |
| fix = False |
| data, reason = data.rsplit(",", 1) |
| reason = reason.lstrip() |
| else: |
| fix = True |
| reason = "" |
| |
| misspellings[key] = Misspelling(data, fix, reason) |
| |
| |
| def build_dict( |
| filename: str, |
| misspellings: dict[str, Misspelling], |
| ignore_words: set[str], |
| ) -> None: |
| with open(filename, encoding="utf-8") as f: |
| translate_tables = [(x, str.maketrans(x, y)) for x, y in alt_chars] |
| for line in f: |
| [key, data] = line.split("->") |
| # TODO: For now, convert both to lower. |
| # Someday we can maybe add support for fixing caps. |
| key = key.lower() |
| data = data.lower() |
| if key not in ignore_words: |
| add_misspelling(key, data, misspellings) |
| # generate alternative misspellings/fixes |
| for x, table in translate_tables: |
| if x in key: |
| alt_key = key.translate(table) |
| alt_data = data.translate(table) |
| if alt_key not in ignore_words: |
| add_misspelling(alt_key, alt_data, misspellings) |