#!/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 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. The header input_methods.h is used in input_method_whitelist.cc which is for testing purpose. 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 CHROMEOS_IME_INPUT_METHODS_H_ #define CHROMEOS_IME_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 char* indicator; bool is_login_keyboard; }; const InputMethodsInfo kInputMethods[] = { {"xkb:us::eng", "en-US", "us", "US", true}, {"xkb:us:dvorak:eng", "en-US", "us(dvorak)", "DV", true}, {"xkb:be::fra", "fr", "be", "BE", true}, {"xkb:br::por", "pt-BR", "br", "BR", true}, {"xkb:ru::rus", "ru", "ru", "RU", false}, }; } // namespace input_method } // namespace chromeos #endif // CHROMEOS_IME_INPUT_METHODS_H_ """ import fileinput import re import sys OUTPUT_HEADER = """// Automatically generated by gen_input_methods.py #ifndef CHROMEOS_IME_INPUT_METHODS_H_ #define CHROMEOS_IME_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 char* indicator; bool is_login_keyboard; }; const InputMethodsInfo kInputMethods[] = { """ CPP_FORMAT = '#if %s\n' ENGINE_FORMAT = (' {"%(input_method_id)s", "%(language_code)s", ' + '"%(xkb_layout_id)s", "%(indicator)s", ' + '%(is_login_keyboard)s},\n') OUTPUT_FOOTER = """ }; } // namespace input_method } // namespace chromeos #endif // CHROMEOS_IME_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) == 4 or len(columns) == 5, "Invalid format: " + line engine = {} engine['input_method_id'] = columns[0] engine['xkb_layout_id'] = columns[1] engine['language_code'] = columns[2] engine['indicator'] = columns[3] is_login_keyboard = "false" if len(columns) == 5: assert columns[4] == "login", "Invalid attribute: " + columns[4] is_login_keyboard = "true" engine['is_login_keyboard'] = is_login_keyboard engines.append(engine) output = CreateEngineHeader(engines) output_file = open(sys.argv[2], 'w') output_file.write(output) if __name__ == '__main__': main(sys.argv)