~chromium-team/chromium-browser/translations-pump

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import re
import logging

COND_DEFINES = frozenset("is_posix/is_linux/linux/use_third_party_translations/_google_chrome/enable_plugins/enable_print_preview/enable_notifications/enable_extensions/enable_task_manager/enable_service_discovery/use_aura/enable_printing".split("/"))
COND_UNDEFINED_BUT_KNOWN = frozenset("is_ios/is_win/is_macosx/chromeos/is_android/use_ash/enable_settings_app/use_titlecase/use_title_case/enable_media_router/toolkit_views/enable_app_list/is_macosx".split("/"))
def evaluate_grd_condition(expression_string, lang=None):
    """Evaluate a expression in string form that we got from a GRD file, after
    we rewrite all lang-referencing subexpressions to Truthness.  Return true
    or false.
    
    >>> evaluate_grd_condition("not use_title_case")
    True
    >>> evaluate_grd_condition("False")
    False
    >>> evaluate_grd_condition("lang   =='ar'")
    True
    >>> evaluate_grd_condition("lang != 'ar'")
    True
    >>> evaluate_grd_condition("lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']")
    True
    >>> evaluate_grd_condition(" lang  in[ 'zh-CN',  'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn'] ")
    True
    """
    def  pp_ifdef(n):
        """GRIT function we reimplement for use by evaluator."""
        if n in COND_DEFINES:
            return True
        if not n in COND_UNDEFINED_BUT_KNOWN:
            logging.warn("name %r might be new. Define it or add it to undefined_but_known in conditions", n)
        return False

    # munge conditions here to convert all "lang"-referencing expressions terms to true.
    expression_string = re.sub(r"\blang\s*(?:!|=)=\s*'\w+'", "True", expression_string)
    expression_string = re.sub(r"\blang(\s+not)?\s+in\s*\[\s*('[^']+',?\s*)*\]", "True", expression_string)

    global_variables = { "__builtins__": { "True":True, "False":False } }
    local_variables = dict(pp_ifdef=pp_ifdef, lang=lang)
    local_variables.update(dict((k, True) for k in COND_DEFINES))
    local_variables.update(dict((k, False) for k in COND_UNDEFINED_BUT_KNOWN))
    try:
        condition_result = eval(expression_string, global_variables, local_variables)
    except NameError:
        logging.warn("A name used in condition %r is unknown! You have to define it. I only know of %s", expression_string, local_variables.keys())
        return False
    return condition_result


from xml.etree import ElementTree as ET
from collections import OrderedDict

ET.Element =ET._Element_Py

class _L(list):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        print("init _L")

    def sort(self):
        print("Ignoring request to sort.")
        pass

class _OrderedDictWithItemsNoSort(OrderedDict):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

    def items(self):
        return _L(super().items())

class OrderedXMLParser(ET.XMLParser):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

    def _start(self, tag, attr_list):
        # Handler for expat's StartElementHandler. Since ordered_attributes
        # is set, the attributes are reported as a list of alternating
        # attribute name,value.
        fixname = self._fixname
        tag = fixname(tag)
        attrib = _OrderedDictWithItemsNoSort()
        if attr_list:
            for i in range(0, len(attr_list), 2):
                attrib[fixname(attr_list[i])] = attr_list[i+1]
        return self.target.start(tag, attrib)