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)
|