diff options
Diffstat (limited to 'misc/character-set/gen-enum.py')
-rwxr-xr-x | misc/character-set/gen-enum.py | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/misc/character-set/gen-enum.py b/misc/character-set/gen-enum.py new file mode 100755 index 0000000..ccb6f95 --- /dev/null +++ b/misc/character-set/gen-enum.py @@ -0,0 +1,101 @@ +#!/usr/bin/env python3 +######################################################################## +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +######################################################################## + +import argparse +import csv +import io +from pathlib import Path + + +def _cleanse_symbol(s): + s = s.replace("-", "_") + s = s.replace(":", "_") + s = s.replace(".", "_") + s = s.replace("(", "") + s = s.replace(")", "") + return s.lower() + + +def _generate_enum(enum_symbols, outpath): + enum_symbols = sorted(enum_symbols) + buf = list() + buf.append("enum class character_set_t") + buf.append("{") + buf.append(" unspecified = 0,") + + for entry in enum_symbols: + buf.append(f" {entry[0]},") + + buf.append("};") + + outpath.write_text("\n".join(buf)) + + +def _generate_map_entries(aliases, outpath): + entries = list() + for symbol, mapped_strs in aliases.items(): + for mapped_str in mapped_strs: + entries.append((mapped_str.lower(), symbol)) + + entries = sorted(entries, key=lambda x: x[0]) + buf = ["constexpr map_type::entry entries[] = {",] + + for entry in entries: + buf.append(f' {{ "{entry[0]}", character_set_t::{entry[1]} }},') + + buf.append("};") + + outpath.write_text("\n".join(buf)) + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("--enum-out", type=Path, default=Path("./enum.inl")) + parser.add_argument("--map-out", type=Path, default=Path("./map-entries.inl")) + parser.add_argument("filepath", type=Path) + args = parser.parse_args() + + content = args.filepath.read_text() + stream = io.StringIO(content) + + reader = csv.reader(stream) + next(reader) # skip the header row + aliases = dict() + enum_symbols = list() + symbol = None + for row in reader: + mime_name, name, alias = row + + if mime_name: + # Take the MIME name as new symbol. + symbol = _cleanse_symbol(mime_name) + aliases[symbol] = set([mime_name, name]) + enum_symbols.append((symbol, mime_name, name)) + if alias: + aliases[symbol].add(alias) + elif name: + # Take the name as new symbol. + symbol = _cleanse_symbol(name) + aliases[symbol] = set([name,]) + enum_symbols.append((symbol, name)) + if alias: + aliases[symbol].add(alias) + else: + # the row only contains an alias for the current symbol. + if not alias: + raise RuntimeError("alias must be present.") + aliases[symbol].add(alias) + + _generate_enum(enum_symbols, args.enum_out) + _generate_map_entries(aliases, args.map_out) + + +if __name__ == "__main__": + main() + |