| #!/usr/bin/env python |
| # Copyright 2012 The Chromium Authors |
| # 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 login XKB |
| layout IDs. 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: |
| |
| // Automatically generated by gen_input_methods.py |
| #ifndef CHROMEOS_IME_INPUT_METHODS_H_ |
| #define CHROMEOS_IME_INPUT_METHODS_H_ |
| |
| namespace chromeos { |
| namespace input_method { |
| |
| const char* const kLoginXkbLayoutIds[] = { |
| "us", |
| "us(dvorak)", |
| "be", |
| "br", |
| }; |
| |
| } // namespace input_method |
| } // namespace chromeos |
| |
| #endif // CHROMEOS_IME_INPUT_METHODS_H_ |
| |
| """ |
| |
| from __future__ import print_function |
| |
| 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 { |
| |
| const char* const kLoginXkbLayoutIds[] = { |
| """ |
| ENGINE_FORMAT = (' "%s",\n') |
| OUTPUT_FOOTER = """ |
| }; |
| |
| } // namespace input_method |
| } // namespace chromeos |
| |
| #endif // CHROMEOS_IME_INPUT_METHODS_H_ |
| """ |
| |
| def CreateEngineHeader(login_xkb_layout_ids): |
| """Create the header file from a list of login XKB layout IDs. |
| |
| Arguments: |
| login_xkb_layout_ids: list of login XKB layout IDs |
| Returns: |
| The text of a C++ header file containing the login XKB layout IDs. |
| """ |
| output = [] |
| output.append(OUTPUT_HEADER) |
| for login_xkb_layout_id in login_xkb_layout_ids: |
| output.append(ENGINE_FORMAT % login_xkb_layout_id) |
| output.append(OUTPUT_FOOTER) |
| |
| return "".join(output) |
| |
| |
| def main(argv): |
| if len(argv) != 3: |
| print('Usage: gen_input_methods.py [input_methods.txt] [output]') |
| sys.exit(1) |
| login_xkb_layout_ids = [] |
| 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 |
| if len(columns) == 5: |
| assert columns[4] == "login", "Invalid attribute: " + columns[4] |
| login_xkb_layout_ids.append(columns[1]) |
| |
| output = CreateEngineHeader(login_xkb_layout_ids) |
| output_file = open(sys.argv[2], 'w') |
| output_file.write(output) |
| |
| |
| if __name__ == '__main__': |
| main(sys.argv) |