diff options
author | Peng Wu <alexepico@gmail.com> | 2024-12-03 10:35:32 +0800 |
---|---|---|
committer | Peng Wu <alexepico@gmail.com> | 2024-12-11 16:17:02 +0800 |
commit | cce110f3d31031fc5fbbea2f54277def1ee6e4c2 (patch) | |
tree | d93d42fc87a11959ef427205bd133d9c2586e470 | |
parent | cf16040d4a7db02412e0ec63184ef63e66179ebc (diff) | |
download | ibus-libpinyin-cce110f3d31031fc5fbbea2f54277def1ee6e4c2.tar.gz ibus-libpinyin-cce110f3d31031fc5fbbea2f54277def1ee6e4c2.tar.xz ibus-libpinyin-cce110f3d31031fc5fbbea2f54277def1ee6e4c2.zip |
Write enginefile.py
-rw-r--r-- | setup/enginefile.py | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/setup/enginefile.py b/setup/enginefile.py new file mode 100644 index 0000000..9e48ca2 --- /dev/null +++ b/setup/enginefile.py @@ -0,0 +1,92 @@ +# vim:set et ts=4 sts=4: +# -*- coding: utf-8 -*- +# +# ibus-libpinyin - Intelligent Pinyin engine based on libpinyin for IBus +# +# Copyright (c) 2024 Peng Wu <alexepico@gmail.com> +# +# 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; either version 2, or (at your option) +# any later version. +# +# 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, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +import os +import xml.dom.minidom +import codecs + +from gi import require_version as gi_require_version +gi_require_version('GLib', '2.0') +gi_require_version('Gio', '2.0') + +from gi.repository import GLib +from gi.repository import Gio + +pkgdatadir = os.getenv("IBUS_PKGDATADIR") or "." + +def save_layout(): + # assume the name and layout tag has the same order, + # save both libpinyin and libbopomofo value here. + system_config = os.path.join(pkgdatadir, 'default.xml') + + dom = xml.dom.minidom.parse(system_config) + names = dom.getElementsByTagName('name') + layouts = dom.getElementsByTagName('layout') + assert len(names) == len(layouts) + for i, name in enumerate(names): + engine = name.childNodes[0].data + config_namespace = "com.github.libpinyin.ibus-libpinyin." + engine + config = Gio.Settings.new(config_namespace) + var = config.get_value("keyboard-layout") + assert 's' == var.get_type_string() + layout = var.get_string() + layouts[i].childNodes[0].data = layout + + user_config = os.path.join(GLib.get_user_config_dir(), + 'ibus', 'libpinyin', 'engines.xml') + dir = os.path.dirname(user_config) + os.path.exists(dir) or os.makedirs(dir, 0o700) + # io.open() causes TypeError for unicode. + f = codecs.open(user_config, 'w', 'utf-8') + dom.writexml(f, '', '', '', 'utf-8') + f.close() + os.chmod(user_config, 0o600) + +def resync_engine_file(): + user_config = os.path.join(GLib.get_user_config_dir(), + 'ibus', 'libpinyin', 'engines.xml') + system_config = os.path.join(pkgdatadir, 'default.xml') + if not os.path.exists(user_config): + return + if not os.path.exists(system_config): + os.unlink(user_config) + return + + # path.getmtime depends on the build time rather than install time. + def __get_engine_file_version(engine_file): + version_str = '' + dom = xml.dom.minidom.parse(engine_file) + # there are two versions in the engines.xml, only use the first one + elements = dom.getElementsByTagName('version') + nodes = [] + if len(elements) > 0: + nodes = elements[0].childNodes + if len(nodes) > 0: + version_str = nodes[0].data + if version_str != '': + version_str = version_str.strip() + return version_str + + user_config_version = __get_engine_file_version(user_config) + system_config_version = __get_engine_file_version(system_config) + if system_config_version != user_config_version: + # generate the user config from gsettings + save_layout() |