| OLD | NEW | 
|    1 # This Source Code Form is subject to the terms of the Mozilla Public |    1 # This Source Code Form is subject to the terms of the Mozilla Public | 
|    2 # License, v. 2.0. If a copy of the MPL was not distributed with this |    2 # License, v. 2.0. If a copy of the MPL was not distributed with this | 
|    3 # file, You can obtain one at http://mozilla.org/MPL/2.0/. |    3 # file, You can obtain one at http://mozilla.org/MPL/2.0/. | 
|    4  |    4  | 
|    5 import errno |    5 import errno | 
|    6 import io |    6 import io | 
|    7 import json |    7 import json | 
|    8 import os |    8 import os | 
|    9 import re |    9 import re | 
|   10 from StringIO import StringIO |   10 from StringIO import StringIO | 
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  184         ).encode('utf-8') |  184         ).encode('utf-8') | 
|  185  |  185  | 
|  186  |  186  | 
|  187 def toJson(data): |  187 def toJson(data): | 
|  188     return json.dumps( |  188     return json.dumps( | 
|  189         data, ensure_ascii=False, sort_keys=True, |  189         data, ensure_ascii=False, sort_keys=True, | 
|  190         indent=2, separators=(',', ': ') |  190         indent=2, separators=(',', ': ') | 
|  191     ).encode('utf-8') + '\n' |  191     ).encode('utf-8') + '\n' | 
|  192  |  192  | 
|  193  |  193  | 
|  194 def import_string_webext(data, key, source): |  | 
|  195     """Import a single translation from the source dictionary into data""" |  | 
|  196     data[key] = source |  | 
|  197  |  | 
|  198  |  | 
|  199 def import_string_gecko(data, key, value): |  | 
|  200     """Import Gecko-style locales into data. |  | 
|  201  |  | 
|  202     Only sets {'message': value} in the data-dictionary, after stripping |  | 
|  203     undesired Gecko-style access keys. |  | 
|  204     """ |  | 
|  205     match = re.search(r'^(.*?)\s*\(&.\)$', value) |  | 
|  206     if match: |  | 
|  207         value = match.group(1) |  | 
|  208     else: |  | 
|  209         index = value.find('&') |  | 
|  210         if index >= 0: |  | 
|  211             value = value[0:index] + value[index + 1:] |  | 
|  212  |  | 
|  213     data[key] = {'message': value} |  | 
|  214  |  | 
|  215  |  | 
|  216 def import_locales(params, files): |  194 def import_locales(params, files): | 
|  217     for item in params['metadata'].items('import_locales'): |  195     for item in params['metadata'].items('import_locales'): | 
|  218         filename, keys = item |  196         filename, keys = item | 
|  219         for sourceFile in glob.glob(os.path.join(os.path.dirname(item.source), |  197         for sourceFile in glob.glob(os.path.join(os.path.dirname(item.source), | 
|  220                                                  *filename.split('/'))): |  198                                                  *filename.split('/'))): | 
|  221             parts = sourceFile.split(os.path.sep) |  199             locale = sourceFile.split(os.path.sep)[-2] | 
|  222             locale = parts[-2].replace('-', '_') |  | 
|  223             targetFile = os.path.join('_locales', locale, 'messages.json') |  200             targetFile = os.path.join('_locales', locale, 'messages.json') | 
|  224             data = json.loads(files.get(targetFile, '{}').decode('utf-8')) |  201             data = json.loads(files.get(targetFile, '{}').decode('utf-8')) | 
|  225  |  202  | 
|  226             try: |  203             try: | 
|  227                 # The WebExtensions (.json) and Gecko format provide |  204                 with io.open(sourceFile, 'r', encoding='utf-8') as handle: | 
|  228                 # translations differently and/or provide additional |  205                     sourceData = json.load(handle) | 
|  229                 # information like e.g. "placeholders". We want to adhere to |  | 
|  230                 # that and preserve the addtional info. |  | 
|  231                 if sourceFile.endswith('.json'): |  | 
|  232                     with io.open(sourceFile, 'r', encoding='utf-8') as handle: |  | 
|  233                         sourceData = json.load(handle) |  | 
|  234                     import_string = import_string_webext |  | 
|  235                 else: |  | 
|  236                     import localeTools |  | 
|  237                     sourceData = localeTools.readFile(sourceFile) |  | 
|  238                     import_string = import_string_gecko |  | 
|  239  |  206  | 
|  240                 # Resolve wildcard imports |  207                 # Resolve wildcard imports | 
|  241                 if keys == '*' or keys == '=*': |  208                 if keys == '*': | 
|  242                     importList = sourceData.keys() |  209                     importList = sourceData.keys() | 
|  243                     importList = filter(lambda k: not k.startswith('_'), importL
     ist) |  210                     importList = filter(lambda k: not k.startswith('_'), importL
     ist) | 
|  244                     if keys == '=*': |  | 
|  245                         importList = map(lambda k: '=' + k, importList) |  | 
|  246                     keys = ' '.join(importList) |  211                     keys = ' '.join(importList) | 
|  247  |  212  | 
|  248                 for stringID in keys.split(): |  213                 for stringID in keys.split(): | 
|  249                     noMangling = False |  214                     if stringID in sourceData: | 
|  250                     if stringID.startswith('='): |  215                         if stringID in data: | 
|  251                         stringID = stringID[1:] |  216                             print ('Warning: locale string {} defined multiple' | 
|  252                         noMangling = True |  217                                    ' times').format(stringID) | 
|  253  |  218  | 
|  254                     if stringID in sourceData: |  219                         data[stringID] = sourceData[stringID] | 
|  255                         if noMangling: |  | 
|  256                             key = re.sub(r'\W', '_', stringID) |  | 
|  257                         else: |  | 
|  258                             key = re.sub(r'\..*', '', parts[-1]) + '_' + re.sub(
     r'\W', '_', stringID) |  | 
|  259                         if key in data: |  | 
|  260                             print 'Warning: locale string %s defined multiple ti
     mes' % key |  | 
|  261  |  | 
|  262                         import_string(data, key, sourceData[stringID]) |  | 
|  263             except Exception as e: |  220             except Exception as e: | 
|  264                 print 'Warning: error importing locale data from %s: %s' % (sour
     ceFile, e) |  221                 print 'Warning: error importing locale data from %s: %s' % (sour
     ceFile, e) | 
|  265  |  222  | 
|  266             files[targetFile] = toJson(data) |  223             files[targetFile] = toJson(data) | 
|  267  |  224  | 
|  268  |  225  | 
|  269 def truncate(text, length_limit): |  226 def truncate(text, length_limit): | 
|  270     if len(text) <= length_limit: |  227     if len(text) <= length_limit: | 
|  271         return text |  228         return text | 
|  272     return text[:length_limit - 1].rstrip() + u'\u2026' |  229     return text[:length_limit - 1].rstrip() + u'\u2026' | 
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  402                 params, 'testIndex.html.tmpl', ('general', 'testScripts') |  359                 params, 'testIndex.html.tmpl', ('general', 'testScripts') | 
|  403             ) |  360             ) | 
|  404  |  361  | 
|  405     zipdata = files.zipToString() |  362     zipdata = files.zipToString() | 
|  406     signature = None |  363     signature = None | 
|  407     pubkey = None |  364     pubkey = None | 
|  408     if keyFile != None: |  365     if keyFile != None: | 
|  409         signature = signBinary(zipdata, keyFile) |  366         signature = signBinary(zipdata, keyFile) | 
|  410         pubkey = getPublicKey(keyFile) |  367         pubkey = getPublicKey(keyFile) | 
|  411     writePackage(outFile, pubkey, signature, zipdata) |  368     writePackage(outFile, pubkey, signature, zipdata) | 
| OLD | NEW |