| # -*- coding: utf-8 -*- |
| # Copyright 2010-2015, Google Inc. |
| # All rights reserved. |
| # |
| # Redistribution and use in source and binary forms, with or without |
| # modification, are permitted provided that the following conditions are |
| # met: |
| # |
| # * Redistributions of source code must retain the above copyright |
| # notice, this list of conditions and the following disclaimer. |
| # * Redistributions in binary form must reproduce the above |
| # copyright notice, this list of conditions and the following disclaimer |
| # in the documentation and/or other materials provided with the |
| # distribution. |
| # * Neither the name of Google Inc. nor the names of its |
| # contributors may be used to endorse or promote products derived from |
| # this software without specific prior written permission. |
| # |
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| |
| """Pre-generate XML data of ibus-mozc engines. |
| |
| We don't support --xml command line option in the ibus-engines-mozc command |
| since it could make start-up time of ibus-daemon slow when XML cache of the |
| daemon in ~/.cache/ibus/bus/ is not ready or is expired. |
| """ |
| |
| __author__ = "yusukes" |
| |
| import optparse |
| import os |
| import subprocess |
| import sys |
| |
| # Information to generate <component> part of mozc.xml. %s will be replaced with |
| # a product name, 'Mozc' or 'Google Japanese Input'. |
| IBUS_COMPONENT_PROPS = { |
| 'name': 'com.google.IBus.Mozc', |
| 'description': '%(product_name)s Component', |
| 'exec': '%(ibus_mozc_path)s --ibus', |
| # TODO(mazda): Generate the version number. |
| 'version': '0.0.0.0', |
| 'author': 'Google Inc.', |
| 'license': 'New BSD', |
| 'homepage': 'http://code.google.com/p/mozc/', |
| 'textdomain': 'ibus-mozc', |
| } |
| |
| # Information to generate <engines> part of mozc.xml. |
| IBUS_ENGINE_COMMON_PROPS = { |
| 'description': '%(product_name)s (Japanese Input Method)', |
| 'language': 'ja', |
| 'icon': '%(ibus_mozc_icon_path)s', |
| 'rank': '80', |
| } |
| |
| # Information to generate <engines> part of mozc.xml for IBus 1.5 or later. |
| IBUS_1_5_ENGINE_COMMON_PROPS = { |
| 'description': '%(product_name)s (Japanese Input Method)', |
| 'language': 'ja', |
| 'icon': '%(ibus_mozc_icon_path)s', |
| 'rank': '80', |
| 'symbol': 'あ', |
| } |
| |
| # A dictionary from platform to engines that are used in the platform. The |
| # information is used to generate <engines> part of mozc.xml. |
| IBUS_ENGINES_PROPS = { |
| # On Linux, we provide only one engine for the Japanese keyboard layout. |
| 'Linux': { |
| # DO NOT change the engine name 'mozc-jp'. The names is referenced by |
| # unix/ibus/mozc_engine.cc. |
| 'name': ['mozc-jp'], |
| 'longname': ['%(product_name)s'], |
| 'layout': ['jp'], |
| }, |
| # On Linux (IBus >= 1.5), we use special label 'default' for the keyboard |
| # layout. |
| 'Linux-IBus1.5': { |
| # DO NOT change the engine name 'mozc-jp'. The names is referenced by |
| # unix/ibus/mozc_engine.cc. |
| 'name': ['mozc-jp'], |
| 'longname': ['%(product_name)s'], |
| 'layout': ['default'], |
| }, |
| } |
| |
| # A dictionary from --branding to a product name which is embedded into the |
| # properties above. |
| PRODUCT_NAMES = { |
| 'Mozc': 'Mozc', |
| 'GoogleJapaneseInput': 'Google Japanese Input', |
| } |
| |
| CPP_HEADER = """// Copyright 2010 Google Inc. All Rights Reserved. |
| |
| #ifndef %s |
| #define %s |
| namespace {""" |
| |
| CPP_FOOTER = """} // namespace |
| #endif // %s""" |
| |
| |
| def OutputXmlElement(param_dict, element_name, value): |
| print ' <%s>%s</%s>' % (element_name, (value % param_dict), element_name) |
| |
| |
| def OutputXml(param_dict, component, engine_common, engines, setup_arg): |
| """Outputs a XML data for ibus-daemon. |
| |
| Args: |
| param_dict: A dictionary to embed options into output string. |
| For example, {'product_name': 'Mozc'}. |
| component: A dictionary from a property name to a property value of the |
| ibus-mozc component. For example, {'name': 'com.google.IBus.Mozc'}. |
| engine_common: A dictionary from a property name to a property value that |
| are commonly used in all engines. For example, {'language': 'ja'}. |
| engines: A dictionary from a property name to a list of property values of |
| engines. For example, {'name': ['mozc-jp', 'mozc', 'mozc-dv']}. |
| """ |
| print '<component>' |
| for key in component: |
| OutputXmlElement(param_dict, key, component[key]) |
| print '<engines>' |
| for i in range(len(engines['name'])): |
| print '<engine>' |
| for key in engine_common: |
| OutputXmlElement(param_dict, key, engine_common[key]) |
| if setup_arg: |
| OutputXmlElement(param_dict, 'setup', ' '.join(setup_arg)) |
| for key in engines: |
| OutputXmlElement(param_dict, key, engines[key][i]) |
| print '</engine>' |
| print '</engines>' |
| print '</component>' |
| |
| |
| def OutputCppVariable(param_dict, prefix, variable_name, value): |
| print 'const char k%s%s[] = "%s";' % (prefix, variable_name.capitalize(), |
| (value % param_dict)) |
| |
| |
| def OutputCpp(param_dict, component, engine_common, engines): |
| """Outputs a C++ header file for mozc/unix/ibus/main.cc. |
| |
| Args: |
| param_dict: see OutputXml. |
| component: ditto. |
| engine_common: ditto. |
| engines: ditto. |
| """ |
| guard_name = 'MOZC_UNIX_IBUS_MAIN_H_' |
| print CPP_HEADER % (guard_name, guard_name) |
| for key in component: |
| OutputCppVariable(param_dict, 'Component', key, component[key]) |
| for key in engine_common: |
| OutputCppVariable(param_dict, 'Engine', key, engine_common[key]) |
| for key in engines: |
| print 'const char* kEngine%sArray[] = {' % key.capitalize() |
| for i in range(len(engines[key])): |
| print '"%s",' % (engines[key][i] % param_dict) |
| print '};' |
| print 'const size_t kEngineArrayLen = %s;' % len(engines['name']) |
| print CPP_FOOTER % guard_name |
| |
| |
| def IsIBus15OrGreater(options): |
| """Returns True when the version of ibus-1.0 is 1.5 or greater.""" |
| command_line = [options.pkg_config_command, '--exists', |
| 'ibus-1.0 >= 1.5.0'] |
| return_code = subprocess.call(command_line) |
| if return_code == 0: |
| return True |
| else: |
| return False |
| |
| |
| def main(): |
| """The main function.""" |
| parser = optparse.OptionParser(usage='Usage: %prog [options]') |
| parser.add_option('--output_cpp', action='store_true', |
| dest='output_cpp', default=False, |
| help='If specified, output a C++ header. Otherwise, output ' |
| 'XML.') |
| parser.add_option('--branding', dest='branding', default=None, |
| help='GoogleJapaneseInput for the official build. ' |
| 'Otherwise, Mozc.') |
| parser.add_option('--ibus_mozc_path', dest='ibus_mozc_path', default='', |
| help='The absolute path of ibus_mozc executable.') |
| parser.add_option('--ibus_mozc_icon_path', dest='ibus_mozc_icon_path', |
| default='', help='The absolute path of ibus_mozc icon.') |
| parser.add_option('--server_dir', dest='server_dir', default='', |
| help='The absolute directory path to be installed the ' |
| 'server executable.') |
| parser.add_option('--pkg_config_command', dest='pkg_config_command', |
| default='pkg-config', |
| help='The path to pkg-config command.') |
| (options, unused_args) = parser.parse_args() |
| |
| setup_arg = [] |
| setup_arg.append(os.path.join(options.server_dir, 'mozc_tool')) |
| setup_arg.append('--mode=config_dialog') |
| if IsIBus15OrGreater(options): |
| # A tentative workaround against IBus 1.5 |
| platform = 'Linux-IBus1.5' |
| common_props = IBUS_1_5_ENGINE_COMMON_PROPS |
| else: |
| platform = 'Linux' |
| common_props = IBUS_ENGINE_COMMON_PROPS |
| |
| param_dict = {'product_name': PRODUCT_NAMES[options.branding], |
| 'ibus_mozc_path': options.ibus_mozc_path, |
| 'ibus_mozc_icon_path': options.ibus_mozc_icon_path} |
| |
| if options.output_cpp: |
| OutputCpp(param_dict, IBUS_COMPONENT_PROPS, common_props, |
| IBUS_ENGINES_PROPS[platform]) |
| else: |
| OutputXml(param_dict, IBUS_COMPONENT_PROPS, common_props, |
| IBUS_ENGINES_PROPS[platform], setup_arg) |
| return 0 |
| |
| if __name__ == '__main__': |
| sys.exit(main()) |