1d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert#!/usr/bin/python2.4
2d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert#
3d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert# Copyright (C) 2010 The Android Open Source Project
4d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert#
5d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert# Licensed under the Apache License, Version 2.0 (the "License");
6d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert# you may not use this file except in compliance with the License.
7d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert# You may obtain a copy of the License at
8d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert#
9d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert#      http://www.apache.org/licenses/LICENSE-2.0
10d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert#
11d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert# Unless required by applicable law or agreed to in writing, software
12d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert# distributed under the License is distributed on an "AS IS" BASIS,
13d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert# See the License for the specific language governing permissions and
15d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert# limitations under the License.
16d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert#
17d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert"""
18d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn BringertCreates the list of search engines
19d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert
20d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn BringertThe created list is placed in the res/values-<locale> directory. Also updates
21d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringertres/values/all_search_engines.xml if required with new data.
22d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert
23d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn BringertUsage: get_search_engines.py
24d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert
25d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn BringertCopyright (C) 2010 The Android Open Source Project
26d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert"""
27d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert
28d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringertimport os
29d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringertimport re
30d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringertimport sys
31d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringertimport urllib
32d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringertfrom xml.dom import minidom
33d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert
34d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert# Locales to generate search engine lists for
35d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringertlocales = ["cs-CZ", "da-DK", "de-AT", "de-CH", "de-DE", "el-GR", "en-AU",
36d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    "en-GB", "en-IE", "en-NZ", "en-SG", "en-ZA", "es-ES", "fr-BE", "fr-FR",
37d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    "it-IT", "ja-JP", "ko-KR", "nb-NO", "nl-BE", "nl-NL", "pl-PL", "pt-PT",
38d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    "pt-BR", "ru-RU", "sv-SE", "tr-TR", "zh-CN", "zh-HK", "zh-MO", "zh-TW"]
39d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert
404346564c1f6faefff5e0d3fdc7f189ec2e948019Bjorn Bringertgoogle_data = ["google", "Google", "google.com",
414346564c1f6faefff5e0d3fdc7f189ec2e948019Bjorn Bringert  "http://www.google.com/favicon.ico",
42e5ce1bc4792003844b2ad60fbe2078f2ab8e1ebeVictoria Lease  "http://www.google.com/search?ie={inputEncoding}&amp;source=android-browser&amp;q={searchTerms}",
434346564c1f6faefff5e0d3fdc7f189ec2e948019Bjorn Bringert  "UTF-8",
44e5ce1bc4792003844b2ad60fbe2078f2ab8e1ebeVictoria Lease  "http://www.google.com/complete/search?client=android&q={searchTerms}"]
454346564c1f6faefff5e0d3fdc7f189ec2e948019Bjorn Bringert
46d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringertclass SearchEngineManager(object):
47d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert  """Manages list of search engines and creates locale specific lists.
48d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert
49d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert  The main method useful for the caller is generateListForLocale(), which
50534c607748f4a008974cf0e9c030d378c3177e4bBjorn Bringert  creates a locale specific donottranslate-search_engines.xml file.
51d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert  """
52d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert
53d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert  def __init__(self):
54d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    """Inits SearchEngineManager with relevant search engine data.
55d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert
56d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    The search engine data is downloaded from the Chrome source repository.
57d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    """
58d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    self.chrome_data = urllib.urlopen(
59d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert        'http://src.chromium.org/viewvc/chrome/trunk/src/chrome/'
60d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert        'browser/search_engines/template_url_prepopulate_data.cc').read()
61d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    if self.chrome_data.lower().find('repository not found') != -1:
62d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert      print 'Unable to get Chrome source data for search engine list.\nExiting.'
63d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert      sys.exit(2)
64d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert
65d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    self.resdir = os.path.normpath(os.path.join(sys.path[0], '../res'))
66d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert
67d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    self.all_engines = set()
68d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert
69d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert  def getXmlString(self, str):
70d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    """Returns an XML-safe string for the given string.
71d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert
72d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    Given a string from the search engine data structure, convert it to a
73d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    string suitable to write to our XML data file by stripping away NULLs,
74d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    unwanted quotes, wide-string declarations (L"") and replacing C-style
75d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    unicode characters with XML equivalents.
76d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    """
77d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    str = str.strip()
78d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    if str.upper() == 'NULL':
79d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert      return ''
80d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert
81d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    if str.startswith('L"'):
82d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert      str = str[2:]
83d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    if str.startswith('@') or str.startswith('?'):
84d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert      str = '\\' + str
85d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert
86d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    str = str.strip('"')
87d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    str = str.replace('&', '&amp;').replace('<', '&lt;').replace('>', '&gt;')
88d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    str = str.replace('"', '&quot;').replace('\'', '&apos;')
89fa6c2b54d71342eee5ca478fb5f1c2ba27ae6d1bHenrik Baard    str = re.sub(r'\\x([a-fA-F0-9]{1,4})', r'&#x\1;', str)
90d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert
91d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    return str
92d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert
93d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert  def getEngineData(self, name):
94d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    """Returns an array of strings describing the specified search engine.
95d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert
96d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    The returned strings are in the same order as in the Chrome source data file
97d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    except that the internal name of the search engine is inserted at the
98d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    beginning of the list.
99d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    """
1004346564c1f6faefff5e0d3fdc7f189ec2e948019Bjorn Bringert
1014346564c1f6faefff5e0d3fdc7f189ec2e948019Bjorn Bringert    if name == "google":
1024346564c1f6faefff5e0d3fdc7f189ec2e948019Bjorn Bringert      return google_data
1034346564c1f6faefff5e0d3fdc7f189ec2e948019Bjorn Bringert
104d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    # Find the first occurance of this search engine name in the form
105d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    # " <name> =" in the chrome data file.
106d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    re_exp = '\s' + name + '\s*='
107d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    search_obj = re.search(re_exp, self.chrome_data)
108d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    if not search_obj:
109d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert      print ('Unable to find data for search engine ' + name +
110d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert             '. Please check the chrome data file for format changes.')
111d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert      return None
112d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert
113d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    # Extract the struct declaration between the curly braces.
114d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    start_pos = self.chrome_data.find('{', search_obj.start()) + 1;
115d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    end_pos = self.chrome_data.find('};', start_pos);
116d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    engine_data_str = self.chrome_data[start_pos:end_pos]
117d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert
118d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    # Remove c++ style '//' comments at the ends of each line
119d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    engine_data_lines = engine_data_str.split('\n')
120d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    engine_data_str = ""
121d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    for line in engine_data_lines:
122d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert        start_pos = line.find(' // ')
123d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert        if start_pos != -1:
124d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert            line = line[:start_pos]
125d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert        engine_data_str = engine_data_str + line + '\n'
126d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert
127d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    # Join multiple line strings into a single string.
128d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    engine_data_str = re.sub('\"\s+\"', '', engine_data_str)
129d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    engine_data_str = re.sub('\"\s+L\"', '', engine_data_str)
130d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    engine_data_str = engine_data_str.replace('"L"', '')
131d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert
132d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    engine_data = engine_data_str.split(',')
133d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    for i in range(len(engine_data)):
134d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert      engine_data[i] = self.getXmlString(engine_data[i])
135d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert
136d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    # If the last element was an empty string (due to an extra comma at the
137d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    # end), ignore it.
138d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    if not engine_data[len(engine_data) - 1]:
139d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert      engine_data.pop()
140d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert
141d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    engine_data.insert(0, name)
142d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert
143d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    return engine_data
144d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert
145d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert  def getSearchEnginesForCountry(self, country):
146d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    """Returns the list of search engine names for the given country.
147d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert
148d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    The data comes from the Chrome data file.
149d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    """
150d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    # The Chrome data file has an array defined with the name 'engines_XX'
151d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    # where XX = country.
152d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    pos = self.chrome_data.find('engines_' + country)
153d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    if pos == -1:
154d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert      print ('Unable to find search engine data for country ' + country + '.')
155d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert      return
156d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert
157d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    # Extract the text between the curly braces for this array declaration
158d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    engines_start = self.chrome_data.find('{', pos) + 1;
159d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    engines_end = self.chrome_data.find('}', engines_start);
160d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    engines_str = self.chrome_data[engines_start:engines_end]
161d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert
162d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    # Remove embedded /**/ style comments, white spaces, address-of operators
163d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    # and the trailing comma if any.
164d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    engines_str = re.sub('\/\*.+\*\/', '', engines_str)
165d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    engines_str = re.sub('\s+', '', engines_str)
166d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    engines_str = engines_str.replace('&','')
167d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    engines_str = engines_str.rstrip(',')
168d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert
169d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    # Split the array into it's elements
170d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    engines = engines_str.split(',')
171d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert
172d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    return engines
173d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert
174d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert  def writeAllEngines(self):
175d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    """Writes all search engines to the all_search_engines.xml file.
176d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    """
177d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert
178d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    all_search_engines_path = os.path.join(self.resdir, 'values/all_search_engines.xml')
179d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert
180d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    text = []
181d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert
182d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    for engine_name in self.all_engines:
183d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert      engine_data = self.getEngineData(engine_name)
184d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert      text.append('  <string-array name="%s" translatable="false">\n' % (engine_data[0]))
185d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert      for i in range(1, 7):
186d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert        text.append('    <item>%s</item>\n' % (engine_data[i]))
187d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert      text.append('  </string-array>\n')
188d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert      print engine_data[1] + " added to all_search_engines.xml"
189d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert
190d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    self.generateXmlFromTemplate(os.path.join(sys.path[0], 'all_search_engines.template.xml'),
191d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert        all_search_engines_path, text)
192d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert
193d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert  def generateDefaultList(self):
194d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    self.writeEngineList(os.path.join(self.resdir, 'values'), "default")
195d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert
196d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert  def generateListForLocale(self, locale):
197534c607748f4a008974cf0e9c030d378c3177e4bBjorn Bringert    """Creates a new locale specific donottranslate-search_engines.xml file.
198d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert
199d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    The new file contains search engines specific to that country. If required
200d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    this function updates all_search_engines.xml file with any new search
201d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    engine data necessary.
202d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    """
203d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    separator_pos = locale.find('-')
204d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    if separator_pos == -1:
205d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert      print ('Locale must be of format <language>-<country>. For e.g.'
206d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert             ' "es-US" or "en-GB"')
207d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert      return
208d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert
209d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    language = locale[0:separator_pos]
210d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    country = locale[separator_pos + 1:].upper()
211d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    dir_path = os.path.join(self.resdir, 'values-' + language + '-r' + country)
212d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert
213d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    self.writeEngineList(dir_path, country)
214d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert
215d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert  def writeEngineList(self, dir_path, country):
216d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    if os.path.exists(dir_path) and not os.path.isdir(dir_path):
217d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert      print "File exists in output directory path " + dir_path + ". Please remove it and try again."
218d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert      return
219d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert
220d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    engines = self.getSearchEnginesForCountry(country)
221d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    if not engines:
222d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert      return
223d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    for engine in engines:
224d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert      self.all_engines.add(engine)
225d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert
226d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    # Create the locale specific search_engines.xml file. Each
227d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    # search_engines.xml file has a hardcoded list of 7 items. If there are less
228d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    # than 7 search engines for this country, the remaining items are marked as
229d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    # enabled=false.
230d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    text = []
231d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    text.append('  <string-array name="search_engines" translatable="false">\n');
232d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    for engine in engines:
233d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert      engine_data = self.getEngineData(engine)
234d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert      name = engine_data[0]
235d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert      text.append('    <item>%s</item>\n' % (name))
236d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    text.append('  </string-array>\n');
237d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert
238d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    self.generateXmlFromTemplate(os.path.join(sys.path[0], 'search_engines.template.xml'),
239534c607748f4a008974cf0e9c030d378c3177e4bBjorn Bringert        os.path.join(dir_path, 'donottranslate-search_engines.xml'),
240d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert        text)
241d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert
242d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert  def generateXmlFromTemplate(self, template_path, out_path, text):
243d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    # Load the template file and insert the new contents before the last line.
244d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    template_text = open(template_path).read()
245d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    pos = template_text.rfind('\n', 0, -2) + 1
246d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    contents = template_text[0:pos] + ''.join(text) + template_text[pos:]
247d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert
248d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    # Make sure what we have created is valid XML :) No need to check for errors
249d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    # as the script will terminate with an exception if the XML was malformed.
250d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    engines_dom = minidom.parseString(contents)
251d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert
252d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    dir_path = os.path.dirname(out_path)
253d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    if not os.path.exists(dir_path):
254d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert      os.makedirs(dir_path)
255d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert      print 'Created directory ' + dir_path
256d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    file = open(out_path, 'w')
257d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    file.write(contents)
258d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    file.close()
259d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    print 'Wrote ' + out_path
260d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert
261d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringertif __name__ == "__main__":
262d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert  manager = SearchEngineManager()
263d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert  manager.generateDefaultList()
264d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert  for locale in locales:
265d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert    manager.generateListForLocale(locale)
266d26706538834e0ed58bf28f08d9a2885c0e7efcbBjorn Bringert  manager.writeAllEngines()
267