18def _get_browser_compat_data():
19 current_dir = os.path.dirname(__file__)
20
21 browser_compat_folder = os.path.abspath(
22 os.path.join(current_dir, '..', '..', '..', 'third_party', 'mdn',
23 'browser-compat-data', 'src'))
24
25 if not os.path.exists(browser_compat_folder):
26 raise RuntimeError('Browser compatibility data not found at %s' %
27 browser_compat_folder)
28
29 browser_compat_data = {}
30
31 INCLUDE_DIRS = [
32 'api',
33 'html',
34 'svg',
35
36 ]
37
38
39 INCLUDE_DIRS = [
40 os.path.join(browser_compat_folder, dir) for dir in INCLUDE_DIRS
41 ]
42
43 def process_json_dict(json_dict):
44
45
46 if 'api' in json_dict:
47
48 api_dict = json_dict['api']
49 interface_name =
next(iter(api_dict))
50 return (interface_name, api_dict[interface_name])
51 elif 'html' in json_dict:
52 html_dict = json_dict['html']
53 if 'elements' in html_dict:
54 elements_dict = html_dict['elements']
55 element_name =
next(iter(elements_dict))
56
57 interface = str('HTML' + element_name + 'Element')
58 return (interface, elements_dict[element_name])
59 elif 'svg' in json_dict:
60 svg_dict = json_dict['svg']
61 if 'elements' in svg_dict:
62 elements_dict = svg_dict['elements']
63 element_name =
next(iter(elements_dict))
64
65 interface = str('SVG' + element_name + 'Element')
66 return (interface, elements_dict[element_name])
67 return (None, None)
68
69
70
71
72 def _unify_compat(a, b):
73
74 def _has_compat_data(metadata):
75 return _COMPAT_KEY in metadata and _SUPPORT_KEY in metadata[_COMPAT_KEY]
76
77
78
79
80 def _unify_support(support_a, support_b):
81 for browser in support_a.keys():
82 if browser in support_b:
83 if _is_simple_support_statement(support_a[browser]) and _is_simple_support_statement(support_b[browser]):
84 support_a[browser][_VERSION_ADDED_KEY] = _unify_versions(
85 support_a[browser][_VERSION_ADDED_KEY],
86 support_b[browser][_VERSION_ADDED_KEY])
87 else:
88
89 support_a[browser] = {_VERSION_ADDED_KEY: None}
90 for browser in support_b.keys():
91 if not browser in support_a:
92 support_a[browser] = support_b[browser]
93
94 if not _has_compat_data(b):
95 return
96 if not _has_compat_data(a):
97 a[_COMPAT_KEY] = b[_COMPAT_KEY]
98 return
99
100 support_a = a[_COMPAT_KEY][_SUPPORT_KEY]
101 support_b = b[_COMPAT_KEY][_SUPPORT_KEY]
102
103 _unify_support(support_a, support_b)
104
105
106
107 def _unify_status(a, b):
108
109 def _has_status(metadata):
110 return _COMPAT_KEY in metadata and _STATUS_KEY in metadata[_COMPAT_KEY]
111
112
113 def _unify_experimental(status_a, status_b):
114
115
116 status_a[_EXPERIMENTAL_KEY] = status_a.get(
117 _EXPERIMENTAL_KEY, False) or status_b.get(_EXPERIMENTAL_KEY, False)
118
119 if not _has_status(b):
120 return
121 if not _has_status(a):
122 a[_COMPAT_KEY] = b[_COMPAT_KEY]
123 return
124
125 status_a = a[_COMPAT_KEY][_STATUS_KEY]
126 status_b = b[_COMPAT_KEY][_STATUS_KEY]
127
128 _unify_experimental(status_a, status_b)
129
130
131
132
133 def _unify_metadata(a, b):
134
135 _unify_compat(a, b)
136 _unify_status(a, b)
137
138 for attr in list(a.keys()):
139 if attr == _COMPAT_KEY:
140 continue
141 if attr in b:
142 _unify_compat(a[attr], b[attr])
143 _unify_status(a[attr], b[attr])
144 for attr in b.keys():
145 if not attr in a:
146 a[attr] = b[attr]
147
148 for (dir_path, dirs, files) in os.walk(browser_compat_folder):
149
150 def should_process_dir(dir_path):
151 if os.path.abspath(dir_path) == browser_compat_folder:
152 return True
153 for dir in INCLUDE_DIRS:
154 if dir_path.startswith(dir):
155 return True
156 return False
157
158 if should_process_dir(dir_path):
159 for name in files:
160 file_name = os.path.join(dir_path, name)
161 (interface_path, ext) = os.path.splitext(file_name)
162 if ext == '.json':
163 with open(file_name) as src:
164 json_dict = json.load(src)
165 interface, metadata = process_json_dict(json_dict)
166 if not interface is None:
167
168
169
170
171 interface = interface.lower()
172 metadata = {
173 member.lower(): info
174 for member, info in metadata.items()
175 }
176
177 if interface in browser_compat_data:
178 _unify_metadata(browser_compat_data[interface],
179 metadata)
180 else:
181 browser_compat_data[interface] = metadata
182 else:
183 dirs[:] = []
184
185 return browser_compat_data
186
187
188
static float next(float f)