diff options
Diffstat (limited to 'chromeos/ime/gen_input_methods.py')
-rwxr-xr-x | chromeos/ime/gen_input_methods.py | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/chromeos/ime/gen_input_methods.py b/chromeos/ime/gen_input_methods.py new file mode 100755 index 0000000..a9f90bf --- /dev/null +++ b/chromeos/ime/gen_input_methods.py @@ -0,0 +1,123 @@ +#!/usr/bin/env python +# Copyright (c) 2012 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +"""Generate a C++ header from ibus_input_methods.txt. + +This program generates a C++ header file containing the information on +available input methods. It parses input_methods.txt, and then generates a +static array definition from the information extracted. The input and output +file names are specified on the command line. + +Run it like: + gen_input_methods.py input_methods.txt input_methods.h + +It will produce output that looks like: + +// This file is automatically generated by gen_input_methods.py +#ifndef CHROME_BROWSER_CHROMEOS_INPUT_METHOD_INPUT_METHODS_H_ +#define CHROME_BROWSER_CHROMEOS_INPUT_METHOD_INPUT_METHODS_H_ + +namespace chromeos { +namespace input_method { + +struct InputMethodsInfo { + const char* input_method_id; + const char* language_code; + const char* xkb_keyboard_id; +}; +const InputMethodsInfo kInputMethods[] = { + {"mozc-chewing", "zh-TW", "us"}, + {"xkb:us::eng", "en-US", "us"}, + {"xkb:us:dvorak:eng", "en-US", "us(dvorak)"}, + {"xkb:be::fra", "fr", "be"}, + {"xkb:br::por", "pt-BR", "br"}, +}; + +} // namespace input_method +} // namespace chromeos + +#endif // CHROME_BROWSER_CHROMEOS_INPUT_METHOD_INPUT_METHODS_H_ + +""" + +import fileinput +import re +import sys + +OUTPUT_HEADER = """// Automatically generated by gen_input_methods.py +#ifndef CHROME_BROWSER_CHROMEOS_INPUT_METHOD_INPUT_METHODS_H_ +#define CHROME_BROWSER_CHROMEOS_INPUT_METHOD_INPUT_METHODS_H_ + +namespace chromeos { +namespace input_method { + +struct InputMethodsInfo { + const char* input_method_id; + const char* language_code; + const char* xkb_layout_id; +}; +const InputMethodsInfo kInputMethods[] = { +""" + +CPP_FORMAT = '#if %s\n' +ENGINE_FORMAT = (' {"%(input_method_id)s", "%(language_code)s", ' + + '"%(xkb_layout_id)s"},\n') + +OUTPUT_FOOTER = """ +}; + +} // namespace input_method +} // namespace chromeos + +#endif // CHROME_BROWSER_CHROMEOS_INPUT_METHOD_INPUT_METHODS_H_ +""" + +def CreateEngineHeader(engines): + """Create the header file from a list of engines. + + Arguments: + engines: list of engine objects + Returns: + The text of a C++ header file containing the engine data. + """ + output = [] + output.append(OUTPUT_HEADER) + for engine in engines: + if engine.has_key('if'): + output.append(CPP_FORMAT % engine['if']) + output.append(ENGINE_FORMAT % engine) + if engine.has_key('if'): + output.append('#endif\n') + output.append(OUTPUT_FOOTER) + + return "".join(output) + + +def main(argv): + if len(argv) != 3: + print 'Usage: gen_input_methods.py [whitelist] [output]' + sys.exit(1) + engines = [] + for line in fileinput.input(sys.argv[1]): + line = line.strip() + if not line or re.match(r'#', line): + continue + columns = line.split() + assert len(columns) == 3 or len(columns) == 4, "Invalid format: " + line + engine = {} + engine['input_method_id'] = columns[0] + engine['xkb_layout_id'] = columns[1] + engine['language_code'] = columns[2] + if len(columns) == 4: + engine['if'] = columns[3] + engines.append(engine) + + output = CreateEngineHeader(engines) + output_file = open(sys.argv[2], 'w') + output_file.write(output) + + +if __name__ == '__main__': + main(sys.argv) |