• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/env python
2# Copyright (c) 2012 The Chromium Authors. All rights reserved.
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
6"""Generate a C++ header from input_methods.txt.
7
8This program generates a C++ header file containing the information on
9available input methods.  It parses input_methods.txt, and then generates a
10static array definition from the information extracted. The input and output
11file names are specified on the command line.
12
13Run it like:
14  gen_input_methods.py input_methods.txt input_methods.h
15
16It will produce output that looks like:
17
18// This file is automatically generated by gen_input_methods.py
19#ifndef CHROMEOS_IME_INPUT_METHODS_H_
20#define CHROMEOS_IME_INPUT_METHODS_H_
21
22namespace chromeos {
23namespace input_method {
24
25struct InputMethodsInfo {
26  const char* input_method_id;
27  const char* language_code;
28  const char* xkb_keyboard_id;
29  const char* indicator;
30  bool is_login_keyboard;
31};
32const InputMethodsInfo kInputMethods[] = {
33  {"xkb:us::eng", "en-US", "us", "US", true},
34  {"xkb:us:dvorak:eng", "en-US", "us(dvorak)", "DV", true},
35  {"xkb:be::fra", "fr", "be", "BE", true},
36  {"xkb:br::por", "pt-BR", "br", "BR", true},
37  {"xkb:ru::rus", "ru", "ru", "RU", false},
38};
39
40}  // namespace input_method
41}  // namespace chromeos
42
43#endif  // CHROMEOS_IME_INPUT_METHODS_H_
44
45"""
46
47import fileinput
48import re
49import sys
50
51OUTPUT_HEADER = """// Automatically generated by gen_input_methods.py
52#ifndef CHROMEOS_IME_INPUT_METHODS_H_
53#define CHROMEOS_IME_INPUT_METHODS_H_
54
55namespace chromeos {
56namespace input_method {
57
58struct InputMethodsInfo {
59  const char* input_method_id;
60  const char* language_code;
61  const char* xkb_layout_id;
62  const char* indicator;
63  bool is_login_keyboard;
64};
65const InputMethodsInfo kInputMethods[] = {
66"""
67
68CPP_FORMAT = '#if %s\n'
69ENGINE_FORMAT = ('  {"%(input_method_id)s", "%(language_code)s", ' +
70                 '"%(xkb_layout_id)s", "%(indicator)s", ' +
71                 '%(is_login_keyboard)s},\n')
72
73OUTPUT_FOOTER = """
74};
75
76}  // namespace input_method
77}  // namespace chromeos
78
79#endif  // CHROMEOS_IME_INPUT_METHODS_H_
80"""
81
82def CreateEngineHeader(engines):
83  """Create the header file from a list of engines.
84
85  Arguments:
86    engines: list of engine objects
87  Returns:
88    The text of a C++ header file containing the engine data.
89  """
90  output = []
91  output.append(OUTPUT_HEADER)
92  for engine in engines:
93    if engine.has_key('if'):
94      output.append(CPP_FORMAT % engine['if'])
95    output.append(ENGINE_FORMAT % engine)
96    if engine.has_key('if'):
97      output.append('#endif\n')
98  output.append(OUTPUT_FOOTER)
99
100  return "".join(output)
101
102
103def main(argv):
104  if len(argv) != 3:
105    print 'Usage: gen_input_methods.py [whitelist] [output]'
106    sys.exit(1)
107  engines = []
108  for line in fileinput.input(sys.argv[1]):
109    line = line.strip()
110    if not line or re.match(r'#', line):
111      continue
112    columns = line.split()
113    assert len(columns) == 4 or len(columns) == 5, "Invalid format: " + line
114    engine = {}
115    engine['input_method_id'] = columns[0]
116    engine['xkb_layout_id'] = columns[1]
117    engine['language_code'] = columns[2]
118    engine['indicator'] = columns[3]
119    is_login_keyboard = "false"
120    if len(columns) == 5:
121      assert columns[4] == "login", "Invalid attribute: " + columns[4]
122      is_login_keyboard = "true"
123    engine['is_login_keyboard'] = is_login_keyboard
124    engines.append(engine)
125
126  output = CreateEngineHeader(engines)
127  output_file = open(sys.argv[2], 'w')
128  output_file.write(output)
129
130
131if __name__ == '__main__':
132  main(sys.argv)
133