| Index: localeTools.py | 
| diff --git a/localeTools.py b/localeTools.py | 
| index 36c2f51f93e8b5c778ac292f21021af96c0f3327..b6554e0aa52461a7347c843a3b251d035ec34652 100644 | 
| --- a/localeTools.py | 
| +++ b/localeTools.py | 
| @@ -65,148 +65,6 @@ def crowdin_request(project_name, action, key, get={}, post_data=None, | 
| return result | 
|  | 
|  | 
| -class OrderedDict(dict): | 
| -    def __init__(self): | 
| -        self.__order = [] | 
| - | 
| -    def __setitem__(self, key, value): | 
| -        self.__order.append(key) | 
| -        dict.__setitem__(self, key, value) | 
| - | 
| -    def iteritems(self): | 
| -        done = set() | 
| -        for key in self.__order: | 
| -            if not key in done and key in self: | 
| -                yield (key, self[key]) | 
| -                done.add(key) | 
| - | 
| - | 
| -def escapeEntity(value): | 
| -    return value.replace('&', '&').replace('<', '<').replace('>', '>').replace('"', '"') | 
| - | 
| - | 
| -def unescapeEntity(value): | 
| -    return value.replace('&', '&').replace('<', '<').replace('>', '>').replace('"', '"') | 
| - | 
| - | 
| -def parseDTDString(data, path): | 
| -    result = [] | 
| -    currentComment = [None] | 
| - | 
| -    parser = ParserCreate() | 
| -    parser.UseForeignDTD(True) | 
| -    parser.SetParamEntityParsing(XML_PARAM_ENTITY_PARSING_ALWAYS) | 
| - | 
| -    def ExternalEntityRefHandler(context, base, systemId, publicId): | 
| -        subparser = parser.ExternalEntityParserCreate(context, 'utf-8') | 
| -        subparser.Parse(data.encode('utf-8'), True) | 
| -        return 1 | 
| - | 
| -    def CommentHandler(data): | 
| -        currentComment[0] = data.strip() | 
| - | 
| -    def EntityDeclHandler(entityName, is_parameter_entity, value, base, systemId, publicId, notationName): | 
| -        result.append((unescapeEntity(entityName), currentComment[0], unescapeEntity(value.strip()))) | 
| -        currentComment[0] = None | 
| - | 
| -    parser.ExternalEntityRefHandler = ExternalEntityRefHandler | 
| -    parser.CommentHandler = CommentHandler | 
| -    parser.EntityDeclHandler = EntityDeclHandler | 
| -    parser.Parse('<!DOCTYPE root SYSTEM "foo"><root/>', True) | 
| - | 
| -    for entry in result: | 
| -        yield entry | 
| - | 
| - | 
| -def escapeProperty(value): | 
| -    return value.replace('\n', '\\n') | 
| - | 
| - | 
| -def unescapeProperty(value): | 
| -    return value.replace('\\n', '\n') | 
| - | 
| - | 
| -def parsePropertiesString(data, path): | 
| -    currentComment = None | 
| -    for line in data.splitlines(): | 
| -        match = re.search(r'^\s*[#!]\s*(.*)', line) | 
| -        if match: | 
| -            currentComment = match.group(1) | 
| -        elif '=' in line: | 
| -            key, value = line.split('=', 1) | 
| -            yield (unescapeProperty(key), currentComment, unescapeProperty(value)) | 
| -            currentComment = None | 
| -        elif re.search(r'\S', line): | 
| -            print >>sys.stderr, 'Unrecognized data in file %s: %s' % (path, line) | 
| - | 
| - | 
| -def parseString(data, path): | 
| -    result = {'_origData': data} | 
| -    if path.endswith('.dtd'): | 
| -        it = parseDTDString(data, path) | 
| -    elif path.endswith('.properties'): | 
| -        it = parsePropertiesString(data, path) | 
| -    else: | 
| -        return None | 
| - | 
| -    for name, comment, value in it: | 
| -        result[name] = value | 
| -    return result | 
| - | 
| - | 
| -def readFile(path): | 
| -    fileHandle = codecs.open(path, 'rb', encoding='utf-8') | 
| -    data = fileHandle.read() | 
| -    fileHandle.close() | 
| -    return parseString(data, path) | 
| - | 
| - | 
| -def generateStringEntry(key, value, path): | 
| -    if path.endswith('.dtd'): | 
| -        return '<!ENTITY %s "%s">\n' % (escapeEntity(key), escapeEntity(value)) | 
| -    else: | 
| -        return '%s=%s\n' % (escapeProperty(key), escapeProperty(value)) | 
| - | 
| - | 
| -def toJSON(path): | 
| -    fileHandle = codecs.open(path, 'rb', encoding='utf-8') | 
| -    data = fileHandle.read() | 
| -    fileHandle.close() | 
| - | 
| -    if path.endswith('.dtd'): | 
| -        it = parseDTDString(data, path) | 
| -    elif path.endswith('.properties'): | 
| -        it = parsePropertiesString(data, path) | 
| -    else: | 
| -        return None | 
| - | 
| -    result = OrderedDict() | 
| -    for name, comment, value in it: | 
| -        obj = {'message': value} | 
| -        if comment == None: | 
| -            obj['description'] = name | 
| -        else: | 
| -            obj['description'] = '%s: %s' % (name, comment) | 
| -        result[name] = obj | 
| -    return json.dumps(result, ensure_ascii=False, indent=2) | 
| - | 
| - | 
| -def fromJSON(path, data): | 
| -    data = json.loads(data) | 
| -    if not data: | 
| -        if os.path.exists(path): | 
| -            os.remove(path) | 
| -        return | 
| - | 
| -    dir = os.path.dirname(path) | 
| -    if not os.path.exists(dir): | 
| -        os.makedirs(dir) | 
| -    file = codecs.open(path, 'wb', encoding='utf-8') | 
| -    for key, value in data.iteritems(): | 
| -        file.write(generateStringEntry(key, value['message'], path)) | 
| -    file.close() | 
| - | 
| - | 
| def preprocessChromeLocale(path, metadata, isMaster): | 
| fileHandle = codecs.open(path, 'rb', encoding='utf-8') | 
| data = json.load(fileHandle) | 
| @@ -325,17 +183,14 @@ def updateTranslationMaster(localeConfig, metadata, dir, projectName, key): | 
| for file in os.listdir(dir): | 
| path = os.path.join(dir, file) | 
| if os.path.isfile(path): | 
| -            if localeConfig['file_format'] == 'chrome-json' and file.endswith('.json'): | 
| +            if file.endswith('.json'): | 
| data = preprocessChromeLocale(path, metadata, True) | 
| newName = file | 
| -            elif localeConfig['file_format'] == 'chrome-json': | 
| +            else: | 
| fileHandle = codecs.open(path, 'rb', encoding='utf-8') | 
| data = json.dumps({file: {'message': fileHandle.read()}}) | 
| fileHandle.close() | 
| newName = file + '.json' | 
| -            else: | 
| -                data = toJSON(path) | 
| -                newName = file + '.json' | 
|  | 
| if data: | 
| if newName in existing: | 
| @@ -364,17 +219,14 @@ def uploadTranslations(localeConfig, metadata, dir, locale, projectName, key): | 
| for file in os.listdir(dir): | 
| path = os.path.join(dir, file) | 
| if os.path.isfile(path): | 
| -            if localeConfig['file_format'] == 'chrome-json' and file.endswith('.json'): | 
| +            if file.endswith('.json'): | 
| data = preprocessChromeLocale(path, metadata, False) | 
| newName = file | 
| -            elif localeConfig['file_format'] == 'chrome-json': | 
| +            else: | 
| fileHandle = codecs.open(path, 'rb', encoding='utf-8') | 
| data = json.dumps({file: {'message': fileHandle.read()}}) | 
| fileHandle.close() | 
| newName = file + '.json' | 
| -            else: | 
| -                data = toJSON(path) | 
| -                newName = file + '.json' | 
|  | 
| if data: | 
| files.append((newName, data)) | 
| @@ -398,9 +250,7 @@ def getTranslations(localeConfig, projectName, key): | 
| zip = ZipFile(StringIO(result)) | 
| dirs = {} | 
|  | 
| -    normalizedDefaultLocale = localeConfig['default_locale'] | 
| -    if localeConfig['name_format'] == 'ISO-15897': | 
| -        normalizedDefaultLocale = normalizedDefaultLocale.replace('_', '-') | 
| +    normalizedDefaultLocale = localeConfig['default_locale'].replace('_', '-') | 
| normalizedDefaultLocale = CROWDIN_LANG_MAPPING.get(normalizedDefaultLocale, | 
| normalizedDefaultLocale) | 
|  | 
| @@ -411,20 +261,14 @@ def getTranslations(localeConfig, projectName, key): | 
| dir, file = os.path.split(info.filename) | 
| if not re.match(r'^[\w\-]+$', dir) or dir == normalizedDefaultLocale: | 
| continue | 
| -        if localeConfig['file_format'] == 'chrome-json' and file.count('.') == 1: | 
| +        if file.count('.') == 1: | 
| origFile = file | 
| else: | 
| -            origFile = re.sub(r'\.json$', '', file) | 
| -        if (localeConfig['file_format'] == 'gecko-dtd' and | 
| -            not origFile.endswith('.dtd') and | 
| -            not origFile.endswith('.properties')): | 
| -            continue | 
| +            origFile = os.path.splitext(file)[0] | 
|  | 
| for key, value in CROWDIN_LANG_MAPPING.iteritems(): | 
| if value == dir: | 
| dir = key | 
| -        if localeConfig['name_format'] == 'ISO-15897': | 
| -            dir = dir.replace('-', '_') | 
|  | 
| data = zip.open(info.filename).read() | 
| if data == '[]': | 
| @@ -437,16 +281,14 @@ def getTranslations(localeConfig, projectName, key): | 
| path = os.path.join(localeConfig['base_path'], dir, origFile) | 
| if not os.path.exists(os.path.dirname(path)): | 
| os.makedirs(os.path.dirname(path)) | 
| -        if localeConfig['file_format'] == 'chrome-json' and file.endswith('.json'): | 
| +        if file.endswith('.json'): | 
| postprocessChromeLocale(path, data) | 
| -        elif localeConfig['file_format'] == 'chrome-json': | 
| +        else: | 
| data = json.loads(data) | 
| if origFile in data: | 
| fileHandle = codecs.open(path, 'wb', encoding='utf-8') | 
| fileHandle.write(data[origFile]['message']) | 
| fileHandle.close() | 
| -        else: | 
| -            fromJSON(path, data) | 
|  | 
| # Remove any extra files | 
| for dir, files in dirs.iteritems(): | 
| @@ -455,5 +297,6 @@ def getTranslations(localeConfig, projectName, key): | 
| continue | 
| for file in os.listdir(baseDir): | 
| path = os.path.join(baseDir, file) | 
| -            if os.path.isfile(path) and (file.endswith('.json') or file.endswith('.properties') or file.endswith('.dtd')) and not file in files: | 
| +            valid_extension = file.endswith('.json') | 
| +            if os.path.isfile(path) and valid_extension and not file in files: | 
| os.remove(path) | 
|  |