diff options
author | lovetox <philipp@hoerist.com> | 2021-12-18 16:20:08 +0300 |
---|---|---|
committer | lovetox <philipp@hoerist.com> | 2021-12-18 16:54:55 +0300 |
commit | 8eef14071d55cef3dd353ca7c749ed72d66465b3 (patch) | |
tree | d42f297bc487337f5005399ce5773dc5a81f5513 /scripts | |
parent | 17b370035ffa64aa78d210f3e58209b83d4a7c00 (diff) |
Add helper script for ui file type generation
Diffstat (limited to 'scripts')
-rwxr-xr-x | scripts/dev/generate_ui_types.py | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/scripts/dev/generate_ui_types.py b/scripts/dev/generate_ui_types.py new file mode 100755 index 000000000..7c0d817dd --- /dev/null +++ b/scripts/dev/generate_ui_types.py @@ -0,0 +1,103 @@ +#!/usr/bin/env python3 + +import sys +from pathlib import Path + +from xml.etree import ElementTree as ET + +try: + path = sys.argv[1] +except Exception: + print('path to file/folder missing') + exit() + +path = Path(path) + +if path.is_dir(): + paths = list(path.iterdir()) + +elif path.is_file(): + paths = [path] + +else: + print('Path must be folder or file:', path) + exit() + + +IMPORTS = ''' +from typing import Literal +from typing import overload + +from gi.repository import Atk +from gi.repository import Gtk +from gi.repository import GtkSource +from gi.repository import GObject + + +class Builder: ... +''' + +CLASS_DEF = ''' +class %s(Builder): +''' + +OVERLOAD = ''' + @overload + def get(self, name: Literal['%s']) -> %s: ...''' + +METHOD = ''' + def get(self, name: str) -> GObject.Object: ...''' + + +GET_BUILDER_OVERLOAD = ''' +@overload +def get_builder(file_name: Literal['%s'], widgets: list[str] = ...) -> %s: ...''' + +GET_BUILDER = ''' +def get_builder(file_name: str, widgets: list[str] = ...) -> Builder: ...''' + + +def make_class_name(path): + name = path.name.removesuffix('.ui') + names = name.split('_') + names = map(lambda x: x.capitalize(), names) + return ''.join(names) + 'Builder' + + +def parse(path, file): + print('read', path) + klass_name = make_class_name(path) + file.write(CLASS_DEF % klass_name) + tree = ET.parse(path) + for node in tree.iter(tag='object'): + id_ = node.attrib.get('id') + if id_ is None: + continue + klass = node.attrib.get('class') + if klass.startswith('GtkSource'): + klass = f'GtkSource.{klass.removeprefix("GtkSource")}' + elif klass.startswith('Atk'): + klass = f'Atk.{klass.removeprefix("Atk")}' + else: + klass = f'Gtk.{klass.removeprefix("Gtk")}' + file.write(OVERLOAD % (id_, klass)) + file.write(METHOD) + file.write('\n\n') + return klass_name + + +builder_names = [] + +current_dir = Path('./builder.pyi') +with current_dir.open(mode='w') as file: + file.write(IMPORTS) + for path in paths: + if path.name.endswith('~'): + continue + name = parse(path, file) + builder_names.append((name, path.name)) + + for name, file_name in builder_names: + file.write(GET_BUILDER_OVERLOAD % (file_name, name)) + file.write(GET_BUILDER) + file.write('\n') |