|
<!doctype html> |
|
<html lang="en"> |
|
<head> |
|
<title>Code coverage report for ./given.js</title> |
|
<meta charset="utf-8"> |
|
|
|
<link rel="stylesheet" href="../prettify.css"> |
|
|
|
<style> |
|
body, html { |
|
margin:0; padding: 0; |
|
} |
|
body { |
|
font-family: Helvetica Neue, Helvetica,Arial; |
|
font-size: 10pt; |
|
} |
|
div.header, div.footer { |
|
background: #eee; |
|
padding: 1em; |
|
} |
|
div.header { |
|
z-index: 100; |
|
position: fixed; |
|
top: 0; |
|
border-bottom: 1px solid #666; |
|
width: 100%; |
|
} |
|
div.footer { |
|
border-top: 1px solid #666; |
|
} |
|
div.body { |
|
margin-top: 10em; |
|
} |
|
div.meta { |
|
font-size: 90%; |
|
text-align: center; |
|
} |
|
h1, h2, h3 { |
|
font-weight: normal; |
|
} |
|
h1 { |
|
font-size: 12pt; |
|
} |
|
h2 { |
|
font-size: 10pt; |
|
} |
|
pre { |
|
font-family: Consolas, Menlo, Monaco, monospace; |
|
margin: 0; |
|
padding: 0; |
|
line-height: 14px; |
|
font-size: 14px; |
|
-moz-tab-size: 2; |
|
-o-tab-size: 2; |
|
tab-size: 2; |
|
} |
|
|
|
div.path { font-size: 110%; } |
|
div.path a:link, div.path a:visited { color: #000; } |
|
table.coverage { border-collapse: collapse; margin:0; padding: 0 } |
|
|
|
table.coverage td { |
|
margin: 0; |
|
padding: 0; |
|
color: #111; |
|
vertical-align: top; |
|
} |
|
table.coverage td.line-count { |
|
width: 50px; |
|
text-align: right; |
|
padding-right: 5px; |
|
} |
|
table.coverage td.line-coverage { |
|
color: #777 !important; |
|
text-align: right; |
|
border-left: 1px solid #666; |
|
border-right: 1px solid #666; |
|
} |
|
|
|
table.coverage td.text { |
|
} |
|
|
|
table.coverage td span.cline-any { |
|
display: inline-block; |
|
padding: 0 5px; |
|
width: 40px; |
|
} |
|
table.coverage td span.cline-neutral { |
|
background: #eee; |
|
} |
|
table.coverage td span.cline-yes { |
|
background: #b5d592; |
|
color: #999; |
|
} |
|
table.coverage td span.cline-no { |
|
background: #fc8c84; |
|
} |
|
|
|
.cstat-yes { color: #111; } |
|
.cstat-no { background: #fc8c84; color: #111; } |
|
.fstat-no { background: #ffc520; color: #111 !important; } |
|
.cbranch-no { background: yellow !important; color: #111; } |
|
.missing-if-branch { |
|
display: inline-block; |
|
margin-right: 10px; |
|
position: relative; |
|
padding: 0 4px; |
|
background: black; |
|
color: yellow; |
|
xtext-decoration: line-through; |
|
} |
|
.missing-if-branch .typ { |
|
color: inherit !important; |
|
} |
|
|
|
.entity, .metric { font-weight: bold; } |
|
.metric { display: inline-block; border: 1px solid #333; padding: 0.3em; background: white; } |
|
.metric small { font-size: 80%; font-weight: normal; color: #666; } |
|
|
|
div.coverage-summary table { border-collapse: collapse; margin: 3em; font-size: 110%; } |
|
div.coverage-summary td, div.coverage-summary table th { margin: 0; padding: 0.25em 1em; border-top: 1px solid #666; border-bottom: 1px solid #666; } |
|
div.coverage-summary th { text-align: left; border: 1px solid #666; background: #eee; font-weight: normal; } |
|
div.coverage-summary th.file { border-right: none !important; } |
|
div.coverage-summary th.pic { border-left: none !important; text-align: right; } |
|
div.coverage-summary th.pct { border-right: none !important; } |
|
div.coverage-summary th.abs { border-left: none !important; text-align: right; } |
|
div.coverage-summary td.pct { text-align: right; border-left: 1px solid #666; } |
|
div.coverage-summary td.abs { text-align: right; font-size: 90%; color: #444; border-right: 1px solid #666; } |
|
div.coverage-summary td.file { text-align: right; border-left: 1px solid #666; white-space: nowrap; } |
|
div.coverage-summary td.pic { min-width: 120px !important; } |
|
div.coverage-summary a:link { text-decoration: none; color: #000; } |
|
div.coverage-summary a:visited { text-decoration: none; color: #333; } |
|
div.coverage-summary a:hover { text-decoration: underline; } |
|
div.coverage-summary tfoot td { border-top: 1px solid #666; } |
|
|
|
div.coverage-summary .yui3-datatable-sort-indicator, div.coverage-summary .dummy-sort-indicator { |
|
height: 10px; |
|
width: 7px; |
|
display: inline-block; |
|
margin-left: 0.5em; |
|
} |
|
div.coverage-summary .yui3-datatable-sort-indicator { |
|
background: url("http://yui.yahooapis.com/3.6.0/build/datatable-sort/assets/skins/sam/sort-arrow-sprite.png") no-repeat scroll 0 0 transparent; |
|
} |
|
div.coverage-summary .yui3-datatable-sorted .yui3-datatable-sort-indicator { |
|
background-position: 0 -20px; |
|
} |
|
div.coverage-summary .yui3-datatable-sorted-desc .yui3-datatable-sort-indicator { |
|
background-position: 0 -10px; |
|
} |
|
|
|
.high { background: #b5d592 !important; } |
|
.medium { background: #ffe87c !important; } |
|
.low { background: #fc8c84 !important; } |
|
|
|
span.cover-fill, span.cover-empty { |
|
display:inline-block; |
|
border:1px solid #444; |
|
background: white; |
|
height: 12px; |
|
} |
|
span.cover-fill { |
|
background: #ccc; |
|
border-right: 1px solid #444; |
|
} |
|
span.cover-empty { |
|
background: white; |
|
border-left: none; |
|
} |
|
span.cover-full { |
|
border-right: none !important; |
|
} |
|
pre.prettyprint { |
|
border: none !important; |
|
padding: 0 !important; |
|
margin: 0 !important; |
|
} |
|
.com { color: #999 !important; } |
|
</style> |
|
</head> |
|
<body> |
|
<div class="header medium"> |
|
<h1>Code coverage report for <span class="entity">./given.js</span></h1> |
|
<h2> |
|
|
|
Statements: <span class="metric">73.76% <small>(149 / 202)</small></span> |
|
|
|
|
|
Branches: <span class="metric">66.67% <small>(92 / 138)</small></span> |
|
|
|
|
|
Functions: <span class="metric">75% <small>(24 / 32)</small></span> |
|
|
|
|
|
Lines: <span class="metric">75% <small>(120 / 160)</small></span> |
|
|
|
</h2> |
|
<div class="path"><a href="../index.html">All files</a> » <a href="index.html">./</a> » given.js</div> |
|
</div> |
|
<div class="body"> |
|
<pre><table class="coverage"> |
|
<tr><td class="line-count">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 |
|
85 |
|
86 |
|
87 |
|
88 |
|
89 |
|
90 |
|
91 |
|
92 |
|
93 |
|
94 |
|
95 |
|
96 |
|
97 |
|
98 |
|
99 |
|
100 |
|
101 |
|
102 |
|
103 |
|
104 |
|
105 |
|
106 |
|
107 |
|
108 |
|
109 |
|
110 |
|
111 |
|
112 |
|
113 |
|
114 |
|
115 |
|
116 |
|
117 |
|
118 |
|
119 |
|
120 |
|
121 |
|
122 |
|
123 |
|
124 |
|
125 |
|
126 |
|
127 |
|
128 |
|
129 |
|
130 |
|
131 |
|
132 |
|
133 |
|
134 |
|
135 |
|
136 |
|
137 |
|
138 |
|
139 |
|
140 |
|
141 |
|
142 |
|
143 |
|
144 |
|
145 |
|
146 |
|
147 |
|
148 |
|
149 |
|
150 |
|
151 |
|
152 |
|
153 |
|
154 |
|
155 |
|
156 |
|
157 |
|
158 |
|
159 |
|
160 |
|
161 |
|
162 |
|
163 |
|
164 |
|
165 |
|
166 |
|
167 |
|
168 |
|
169 |
|
170 |
|
171 |
|
172 |
|
173 |
|
174 |
|
175 |
|
176 |
|
177 |
|
178 |
|
179 |
|
180 |
|
181 |
|
182 |
|
183 |
|
184 |
|
185 |
|
186 |
|
187 |
|
188 |
|
189 |
|
190 |
|
191 |
|
192 |
|
193 |
|
194 |
|
195 |
|
196 |
|
197 |
|
198 |
|
199 |
|
200 |
|
201 |
|
202 |
|
203 |
|
204 |
|
205 |
|
206 |
|
207 |
|
208 |
|
209 |
|
210 |
|
211 |
|
212 |
|
213 |
|
214 |
|
215 |
|
216 |
|
217 |
|
218 |
|
219 |
|
220 |
|
221 |
|
222 |
|
223 |
|
224 |
|
225 |
|
226 |
|
227 |
|
228 |
|
229 |
|
230 |
|
231 |
|
232 |
|
233 |
|
234 |
|
235 |
|
236 |
|
237 |
|
238 |
|
239 |
|
240 |
|
241 |
|
242 |
|
243 |
|
244 |
|
245 |
|
246 |
|
247 |
|
248 |
|
249 |
|
250 |
|
251 |
|
252 |
|
253 |
|
254 |
|
255 |
|
256 |
|
257 |
|
258 |
|
259 |
|
260 |
|
261 |
|
262 |
|
263 |
|
264 |
|
265 |
|
266 |
|
267 |
|
268 |
|
269 |
|
270 |
|
271 |
|
272 |
|
273 |
|
274 |
|
275 |
|
276 |
|
277 |
|
278 |
|
279 |
|
280 |
|
281 |
|
282 |
|
283 |
|
284 |
|
285 |
|
286 |
|
287 |
|
288 |
|
289 |
|
290 |
|
291 |
|
292 |
|
293 |
|
294 |
|
295 |
|
296 |
|
297 |
|
298 |
|
299 |
|
300 |
|
301 |
|
302 |
|
303 |
|
304 |
|
305 |
|
306 |
|
307 |
|
308 |
|
309 |
|
310 |
|
311 |
|
312 |
|
313 |
|
314 |
|
315 |
|
316 |
|
317 |
|
318 |
|
319 |
|
320 |
|
321 |
|
322 |
|
323 |
|
324 |
|
325 |
|
326 |
|
327 |
|
328 |
|
329 |
|
330 |
|
331 |
|
332 |
|
333 |
|
334 |
|
335 |
|
336 |
|
337 |
|
338 |
|
339 |
|
340 |
|
341 |
|
342 |
|
343 |
|
344 |
|
345 |
|
346 |
|
347 |
|
348 |
|
349 |
|
350 |
|
351 |
|
352 |
|
353 |
|
354 |
|
355 |
|
356 |
|
357 |
|
358 |
|
359 |
|
360 |
|
361 |
|
362 |
|
363 |
|
364 |
|
365 |
|
366 |
|
367 |
|
368 |
|
369 |
|
370 |
|
371 |
|
372 |
|
373 |
|
374 |
|
375 |
|
376 |
|
377 |
|
378 |
|
379 |
|
380 |
|
381</td><td class="line-coverage"><span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-yes">1</span> |
|
<span class="cline-any cline-yes">7</span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-yes">1</span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-yes">1</span> |
|
<span class="cline-any cline-yes">4</span> |
|
<span class="cline-any cline-yes">4</span> |
|
<span class="cline-any cline-yes">4</span> |
|
<span class="cline-any cline-yes">1</span> |
|
<span class="cline-any cline-yes">9</span> |
|
<span class="cline-any cline-yes">4</span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-yes">2</span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-no"> </span> |
|
<span class="cline-any cline-no"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-yes">2</span> |
|
<span class="cline-any cline-yes">1</span> |
|
<span class="cline-any cline-yes">1</span> |
|
<span class="cline-any cline-yes">1</span> |
|
<span class="cline-any cline-yes">1</span> |
|
<span class="cline-any cline-yes">1</span> |
|
<span class="cline-any cline-yes">1</span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-yes">2</span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-no"> </span> |
|
<span class="cline-any cline-no"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-yes">2</span> |
|
<span class="cline-any cline-yes">2</span> |
|
<span class="cline-any cline-yes">16</span> |
|
<span class="cline-any cline-yes">16</span> |
|
<span class="cline-any cline-yes">4</span> |
|
<span class="cline-any cline-yes">4</span> |
|
<span class="cline-any cline-yes">4</span> |
|
<span class="cline-any cline-yes">4</span> |
|
<span class="cline-any cline-yes">4</span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-no"> </span> |
|
<span class="cline-any cline-no"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-yes">2</span> |
|
<span class="cline-any cline-yes">2</span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-yes">2</span> |
|
<span class="cline-any cline-no"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-yes">2</span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-yes">12</span> |
|
<span class="cline-any cline-yes">105</span> |
|
<span class="cline-any cline-yes">13</span> |
|
<span class="cline-any cline-yes">10</span> |
|
<span class="cline-any cline-yes">1</span> |
|
<span class="cline-any cline-yes">1</span> |
|
<span class="cline-any cline-no"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-no"> </span> |
|
<span class="cline-any cline-no"> </span> |
|
<span class="cline-any cline-no"> </span> |
|
<span class="cline-any cline-no"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-yes">1</span> |
|
<span class="cline-any cline-no"> </span> |
|
<span class="cline-any cline-no"> </span> |
|
<span class="cline-any cline-yes">1</span> |
|
<span class="cline-any cline-no"> </span> |
|
<span class="cline-any cline-no"> </span> |
|
<span class="cline-any cline-no"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-no"> </span> |
|
<span class="cline-any cline-no"> </span> |
|
<span class="cline-any cline-no"> </span> |
|
<span class="cline-any cline-no"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-no"> </span> |
|
<span class="cline-any cline-no"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-no"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-no"> </span> |
|
<span class="cline-any cline-no"> </span> |
|
<span class="cline-any cline-no"> </span> |
|
<span class="cline-any cline-no"> </span> |
|
<span class="cline-any cline-no"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-no"> </span> |
|
<span class="cline-any cline-no"> </span> |
|
<span class="cline-any cline-no"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-yes">1</span> |
|
<span class="cline-any cline-yes">5</span> |
|
<span class="cline-any cline-yes">5</span> |
|
<span class="cline-any cline-no"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-yes">1</span> |
|
<span class="cline-any cline-yes">5</span> |
|
<span class="cline-any cline-yes">5</span> |
|
<span class="cline-any cline-yes">6</span> |
|
<span class="cline-any cline-yes">6</span> |
|
<span class="cline-any cline-yes">6</span> |
|
<span class="cline-any cline-yes">6</span> |
|
<span class="cline-any cline-yes">6</span> |
|
<span class="cline-any cline-yes">2</span> |
|
<span class="cline-any cline-yes">6</span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-yes">5</span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-yes">1</span> |
|
<span class="cline-any cline-yes">1</span> |
|
<span class="cline-any cline-yes">1</span> |
|
<span class="cline-any cline-yes">1</span> |
|
<span class="cline-any cline-yes">1</span> |
|
<span class="cline-any cline-no"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-yes">1</span> |
|
<span class="cline-any cline-yes">1</span> |
|
<span class="cline-any cline-yes">1</span> |
|
<span class="cline-any cline-no"> </span> |
|
<span class="cline-any cline-no"> </span> |
|
<span class="cline-any cline-no"> </span> |
|
<span class="cline-any cline-no"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-yes">1</span> |
|
<span class="cline-any cline-yes">9</span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-yes">2</span> |
|
<span class="cline-any cline-yes">32</span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-yes">2</span> |
|
<span class="cline-any cline-yes">6</span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-yes">10</span> |
|
<span class="cline-any cline-yes">13</span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-yes">1</span> |
|
<span class="cline-any cline-yes">39</span> |
|
<span class="cline-any cline-yes">39</span> |
|
<span class="cline-any cline-yes">39</span> |
|
<span class="cline-any cline-yes">7</span> |
|
<span class="cline-any cline-yes">11</span> |
|
<span class="cline-any cline-yes">5</span> |
|
<span class="cline-any cline-yes">16</span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-yes">1</span> |
|
<span class="cline-any cline-yes">26</span> |
|
<span class="cline-any cline-yes">26</span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-yes">19</span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-yes">1</span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-yes">1</span> |
|
<span class="cline-any cline-yes">67</span> |
|
<span class="cline-any cline-yes">65</span> |
|
<span class="cline-any cline-yes">2</span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-no"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-yes">65</span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-yes">65</span> |
|
<span class="cline-any cline-yes">65</span> |
|
<span class="cline-any cline-yes">65</span> |
|
<span class="cline-any cline-yes">65</span> |
|
<span class="cline-any cline-yes">65</span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-yes">65</span> |
|
<span class="cline-any cline-yes">65</span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-yes">82</span> |
|
<span class="cline-any cline-yes">82</span> |
|
<span class="cline-any cline-yes">82</span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-yes">82</span> |
|
<span class="cline-any cline-yes">82</span> |
|
<span class="cline-any cline-yes">2</span> |
|
<span class="cline-any cline-yes">7</span> |
|
<span class="cline-any cline-yes">7</span> |
|
<span class="cline-any cline-yes">7</span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-yes">2</span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-yes">80</span> |
|
<span class="cline-any cline-no"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-yes">80</span> |
|
<span class="cline-any cline-yes">21</span> |
|
<span class="cline-any cline-yes">8</span> |
|
<span class="cline-any cline-yes">8</span> |
|
<span class="cline-any cline-yes">7</span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-yes">13</span> |
|
<span class="cline-any cline-yes">12</span> |
|
<span class="cline-any cline-yes">12</span> |
|
<span class="cline-any cline-yes">14</span> |
|
<span class="cline-any cline-yes">14</span> |
|
<span class="cline-any cline-yes">11</span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-yes">9</span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-yes">1</span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-neutral"> </span> |
|
<span class="cline-any cline-yes">1</span> |
|
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">/* coffee-script example usage - at https://github.com/johan/dotjs/commits/johan |
|
|
|
given path_re: ['^/([^/]+)/([^/]+)(/?.*)', 'user', 'repo', 'rest'] |
|
query: true |
|
dom: |
|
keyboard: 'css .keyboard-shortcuts' |
|
branches: 'css+ .js-filter-branches h4 a' |
|
dates: 'css* .commit-group-heading' |
|
tracker: 'css? #gauges-tracker[defer]' |
|
johan_ci: 'xpath* //li[contains(@class,"commit")][.//a[.="johan"]]' |
|
ready: (path, query, dom) -> |
|
|
|
...would make something like this call, as the path regexp matched, and there |
|
were DOM matches for the two mandatory "keyboard" and "branches" selectors: |
|
|
|
ready( { user: 'johan', repo: 'dotjs', rest: '/commits/johan' } |
|
, {} // would contain all query args (if any were present) |
|
, { keyboard: Node<a href="#keyboard_shortcuts_pane"> |
|
, branches: [ Node<a href="/johan/dotjs/commits/coffee"> |
|
, Node<a href="/johan/dotjs/commits/dirs"> |
|
, Node<a href="/johan/dotjs/commits/gh-pages"> |
|
, Node<a href="/johan/dotjs/commits/johan"> |
|
, Node<a href="/johan/dotjs/commits/jquery-1.8.2"> |
|
, Node<a href="/johan/dotjs/commits/master"> |
|
] |
|
, dates: [ Node<h3 class="commit-group-heading">Oct 07, 2012</h3> |
|
, Node<h3 class="commit-group-heading">Aug 29, 2012</h3> |
|
, ... |
|
] |
|
, tracker: null |
|
, johan_ci: [ Node<li class="commit">, ... ] |
|
} |
|
) |
|
|
|
A selector returns an array of matches prefixed for "css*" and "css+" (ditto |
|
xpath), and a single result if it is prefixed "css" or "css?": |
|
|
|
If your script should only run on pages with a particular DOM node (or set of |
|
nodes), use the 'css' or 'css+' (ditto xpath) forms - and your callback won't |
|
get fired on pages that lack them. The 'css?' and 'css*' forms would run your |
|
callback but pass null or [] respectively, on not finding such nodes. You may |
|
recognize the semantics of x, x?, x* and x+ from regular expressions. |
|
|
|
(see http://goo.gl/ejtMD for a more thorough discussion of something similar) |
|
|
|
The dom property is recursively defined so you can make nested structures. |
|
If you want a property that itself is an object full of matched things, pass |
|
an object of sub-dom-spec:s, instead of a string selector: |
|
|
|
given dom: |
|
meta: |
|
base: 'xpath? /head/base |
|
title: 'xpath string(/head/title)' |
|
commits: 'css* li.commit' |
|
ready: (dom) -> |
|
|
|
You can also deconstruct repeated templated sections of a page into subarrays |
|
scraped as per your specs, by picking a context node for a dom spec. This is |
|
done by passing a two-element array: a selector resolving what node/nodes you |
|
look at and a dom spec describing how you want it/them deconstructed for you: |
|
|
|
given dom: |
|
meta: |
|
[ 'xpath /head', |
|
base: 'xpath? base |
|
title: 'xpath string(title)' |
|
] |
|
commits: |
|
[ 'css* li.commit', |
|
avatar_url: ['css img.gravatar', 'xpath string(@src)'] |
|
author_name: 'xpath string(.//*[@class="author-name"])' |
|
] |
|
ready: (dom) -> |
|
|
|
The mandatory/optional selector rules defined above behave as you'd expect as |
|
used for context selectors too: a mandatory node or array of nodes will limit |
|
what pages your script gets called on to those that match it, so your code is |
|
free to assume it will always be there when it runs. An optional context node |
|
that is not found will instead result in that part of your DOM being null, or |
|
an empty array, in the case of a * selector. |
|
|
|
Finally, there is the xpath! keyword, which is similar to xpath, but it also |
|
mandates that whatever is returned is truthy. This is useful when you use the |
|
xpath functions returning strings, numbers and of course booleans, to assert |
|
things about the pages you want to run on, like 'xpath! count(//img) = 0', if |
|
you never want the script to run on pages with inline images, say. |
|
|
|
Once you called given(), you may call given.dom to do page scraping later on, |
|
returning whatever matched your selector(s) passed. Mandatory selectors which |
|
failed to match at this point will return undefined, optional selectors null: |
|
|
|
given.dom('xpath //a[@id]') => undefined or <a id="..."> |
|
given.dom('xpath? //a[@id]') => null or <a id="..."> |
|
given.dom('xpath+ //a[@id]') => undefined or [<a id="...">, <a id>, ...] |
|
given.dom('xpath* //a[@id]') => [] or [<a id="...">, <a id>, ...] |
|
|
|
To detect a failed mandatory match, you can use given.dom(...) === given.FAIL |
|
|
|
Github pjax hook: to re-run the script's given() block for every pjax request |
|
to a site - add a pushstate hook as per http://goo.gl/LNSv1 -- and be sure to |
|
make your script reentrant, so that it won't try to process the same elements |
|
again, if they are still sitting around in the page (see ':not([augmented])') |
|
|
|
*/ |
|
|
|
function given(opts, plugins) { |
|
var Object_toString = Object.prototype.toString |
|
, Array_slice = Array.prototype.slice |
|
, FAIL = 'dom' in given ? undefined : (function() { |
|
var tests = |
|
{ path_re: { fn: test_regexp } |
|
, query: { fn: test_query } |
|
, dom: { fn: test_dom |
|
, my: { 'css*': $c |
|
, 'css+': one_or_more($c) |
|
, 'css?': $C |
|
, 'css': not_null($C) |
|
, 'xpath*': $x |
|
, 'xpath+': one_or_more($x) |
|
, 'xpath?': $X |
|
, 'xpath!': truthy($x) |
|
, 'xpath': not_null($X) |
|
} |
|
} |
|
, inject: { fn: inject } |
|
} |
|
, name, test, me, my, mine |
|
; |
|
|
|
for (name in tests) { |
|
test = tests[name]; |
|
me = test.fn; |
|
if ((my = test.my)) |
|
for (mine in my) |
|
me[mine] = my[mine]; |
|
given[name] = me; |
|
} |
|
})() |
|
|
|
, input = [] // args for the callback(s?) the script wants to run |
|
, rules = Object.create(opts) // wraps opts in a pokeable inherit layer |
|
, debug = get('debug') |
|
, script = get('name') |
|
, ready = get('ready') |
|
, load = get('load') |
|
, pushState = get('pushstate') |
|
, pjax_event = get('pjaxevent') |
|
, name, rule, test, result, retry, plugin |
|
; |
|
|
|
<span class="missing-if-branch" title="if path not taken"" >I</span>if (typeof ready !== 'function' && |
|
<span class="branch-1 cbranch-no" title="branch not covered" > typeof load !== 'function' </span>&& |
|
<span class="branch-2 cbranch-no" title="branch not covered" > typeof pushState !== 'function')</span> { |
|
<span class="cstat-no" title="statement not covered" > alert('no given function');</span> |
|
<span class="cstat-no" title="statement not covered" > throw new Error('given() needs at least a "ready" or "load" function!');</span> |
|
} |
|
|
|
if (plugins) |
|
for (name in plugins) |
|
<span class="missing-if-branch" title="else path not taken"" >E</span>if ((rule = plugins[name]) && (test = given[name])) |
|
for (plugin in rule) |
|
<span class="missing-if-branch" title="else path not taken"" >E</span>if (!(test[plugin])) { |
|
given._parse_dom_rule = null; |
|
test[plugin] = rule[plugin]; |
|
} |
|
|
|
<span class="missing-if-branch" title="if path not taken"" >I</span>if (pushState && <span class="branch-1 cbranch-no" title="branch not covered" >history.pushState </span>&& |
|
<span class="branch-2 cbranch-no" title="branch not covered" > (given.pushState = given.pushState || []).indexOf(opts) === -1)</span> { |
|
<span class="cstat-no" title="statement not covered" > given.pushState.push(opts); </span>// make sure we don't reregister post-navigation |
|
<span class="cstat-no" title="statement not covered" > initPushState(pushState, pjax_event);</span> |
|
} |
|
|
|
try { |
|
for (name in rules) { |
|
rule = rules[name]; |
|
if (rule === undefined) continue; // was some callback or other non-rule |
|
test = given[name]; |
|
<span class="missing-if-branch" title="if path not taken"" >I</span>if (!test) <span class="cstat-no" title="statement not covered" >throw new Error('did not grok rule "'+ name +'"!');</span> |
|
result = test(rule); |
|
<span class="missing-if-branch" title="if path not taken"" >I</span>if (result === FAIL) <span class="cstat-no" title="statement not covered" >return false; </span>// the page doesn't satisfy all rules |
|
input.push(result); |
|
} |
|
} |
|
catch(e) { |
|
<span class="cstat-no" title="statement not covered" > if (debug) <span class="cstat-no" title="statement not covered" >console.warn("given(debug): we didn't run because " + e.message);</span></span> |
|
<span class="cstat-no" title="statement not covered" > return false;</span> |
|
} |
|
|
|
<span class="missing-if-branch" title="else path not taken"" >E</span>if (ready) { |
|
ready.apply(opts, input.concat()); |
|
} |
|
<span class="missing-if-branch" title="if path not taken"" >I</span>if (load) <span class="cstat-no" title="statement not covered" >window.addEventListener('load', <span class="fstat-no" title="function not covered" >function() {</span></span> |
|
<span class="cstat-no" title="statement not covered" > load.apply(opts, input.concat());</span> |
|
}); |
|
return input.concat(opts); |
|
|
|
function get(x) { rules[x] = undefined; return opts[x]; } |
|
function isArray(x) { return Object_toString.call(x) === '[object Array]'; } |
|
function isObject(x) { return Object_toString.call(x) === '[object Object]'; } |
|
function array(a) { return Array_slice.call(a, 0); } // array:ish => Array |
|
function arrayify(x) { return isArray(x) ? <span class="branch-0 cbranch-no" title="branch not covered" >x </span>: [x]; } // non-array? => Array |
|
<span class="fstat-no" title="function not covered" > function inject(fn, args) {</span> |
|
<span class="cstat-no" title="statement not covered" > var script = document.createElement('script')</span> |
|
, parent = document.documentElement; |
|
<span class="cstat-no" title="statement not covered" > args = JSON.stringify(args || []).slice(1, -1);</span> |
|
<span class="cstat-no" title="statement not covered" > script.textContent = '('+ fn +')('+ args +');';</span> |
|
<span class="cstat-no" title="statement not covered" > parent.appendChild(script);</span> |
|
<span class="cstat-no" title="statement not covered" > parent.removeChild(script);</span> |
|
} |
|
|
|
<span class="fstat-no" title="function not covered" > function initPushState(callback, pjax_event) {</span> |
|
<span class="cstat-no" title="statement not covered" > if (!history.pushState.armed) {</span> |
|
<span class="cstat-no" title="statement not covered" > inject(<span class="fstat-no" title="function not covered" >function(pjax_event) {</span></span> |
|
<span class="fstat-no" title="function not covered" > function reportBack() {</span> |
|
<span class="cstat-no" title="statement not covered" > var e = document.createEvent('Events');</span> |
|
<span class="cstat-no" title="statement not covered" > e.initEvent('history.pushState', !'bubbles', !'cancelable');</span> |
|
<span class="cstat-no" title="statement not covered" > document.dispatchEvent(e);</span> |
|
} |
|
<span class="cstat-no" title="statement not covered" > var pushState = history.pushState;</span> |
|
<span class="cstat-no" title="statement not covered" > history.pushState = <span class="fstat-no" title="function not covered" >function given_pushState() {</span></span> |
|
<span class="cstat-no" title="statement not covered" > if (pjax_event && window.$ && $.pjax)</span> |
|
<span class="cstat-no" title="statement not covered" > $(document).one(pjax_event, reportBack);</span> |
|
else |
|
<span class="cstat-no" title="statement not covered" > setTimeout(reportBack, 0);</span> |
|
<span class="cstat-no" title="statement not covered" > return pushState.apply(this, arguments);</span> |
|
}; |
|
}, [pjax_event]); |
|
<span class="cstat-no" title="statement not covered" > history.pushState.armed = pjax_event;</span> |
|
} |
|
|
|
<span class="cstat-no" title="statement not covered" > retry = <span class="fstat-no" title="function not covered" >function after_pushState() {</span></span> |
|
<span class="cstat-no" title="statement not covered" > rules = Object.create(opts);</span> |
|
<span class="cstat-no" title="statement not covered" > rules.load = rules.pushstate = undefined;</span> |
|
<span class="cstat-no" title="statement not covered" > rules.ready = callback;</span> |
|
<span class="cstat-no" title="statement not covered" > given(rules);</span> |
|
}; |
|
|
|
<span class="cstat-no" title="statement not covered" > document.addEventListener('history.pushState', <span class="fstat-no" title="function not covered" >function() {</span></span> |
|
<span class="cstat-no" title="statement not covered" > if (debug) <span class="cstat-no" title="statement not covered" >console.log('given.pushstate', location.pathname);</span></span> |
|
<span class="cstat-no" title="statement not covered" > retry();</span> |
|
}, false); |
|
} |
|
|
|
function test_query(spec) { |
|
var q = unparam(this === given || this === window ? location.search : <span class="branch-1 cbranch-no" title="branch not covered" >this)</span>; |
|
<span class="missing-if-branch" title="else path not taken"" >E</span>if (spec === true || spec == null) return q; // decode the query for me! |
|
<span class="cstat-no" title="statement not covered" > throw new Error('bad query type '+ (typeof spec) +': '+ spec);</span> |
|
} |
|
|
|
function unparam(query) { |
|
var data = {}; |
|
(query || '').replace(/\+/g, '%20').split('&').forEach(function(kv) { |
|
kv = /^\??([^=&]*)(?:=(.*))?/.exec(kv); |
|
<span class="missing-if-branch" title="if path not taken"" >I</span>if (!kv) <span class="cstat-no" title="statement not covered" >return;</span> |
|
var prop, val, k = kv[1], v = kv[2], e, m; |
|
try { prop = decodeURIComponent(k); } catch (e) { <span class="cstat-no" title="statement not covered" >prop = unescape(k); </span>} |
|
if ((val = v) != null) |
|
try { val = decodeURIComponent(v); } catch (e) { <span class="cstat-no" title="statement not covered" >val = unescape(v); </span>} |
|
data[prop] = val; |
|
}); |
|
return data; |
|
} |
|
|
|
function test_regexp(spec) { |
|
<span class="missing-if-branch" title="else path not taken"" >E</span>if (!isArray(spec)) spec = arrayify(spec); |
|
var re = spec.shift(); |
|
<span class="missing-if-branch" title="else path not taken"" >E</span>if (typeof re === 'string') re = new RegExp(re); |
|
<span class="missing-if-branch" title="if path not taken"" >I</span>if (!(re instanceof RegExp)) |
|
<span class="cstat-no" title="statement not covered" > throw new Error((typeof re) +' was not a regexp: '+ re);</span> |
|
|
|
var ok = re.exec(this===given || this===window ? location.pathname : <span class="branch-1 cbranch-no" title="branch not covered" >this)</span>; |
|
<span class="missing-if-branch" title="if path not taken"" >I</span>if (ok === null) <span class="cstat-no" title="statement not covered" >return FAIL;</span> |
|
<span class="missing-if-branch" title="else path not taken"" >E</span>if (!spec.length) return ok; |
|
<span class="cstat-no" title="statement not covered" > var named = {};</span> |
|
<span class="cstat-no" title="statement not covered" > ok.shift(); </span>// drop matching-whole-regexp part |
|
<span class="cstat-no" title="statement not covered" > while (spec.length) <span class="cstat-no" title="statement not covered" >named[spec.shift()] = ok.shift();</span></span> |
|
<span class="cstat-no" title="statement not covered" > return named;</span> |
|
} |
|
|
|
function truthy(fn) { return function(s) { |
|
var x = fn.apply(this, arguments); return x || FAIL; |
|
}; } |
|
|
|
function not_null(fn) { return function(s) { |
|
var x = fn.apply(this, arguments); return x !== null ? x : FAIL; |
|
}; } |
|
|
|
function one_or_more(fn) { return function(s) { |
|
var x = fn.apply(this, arguments); return x.length ? x : FAIL; |
|
}; } |
|
|
|
function $c(css) { return array(this.querySelectorAll(css)); } |
|
function $C(css) { return this.querySelector(css); } |
|
|
|
function $x(xpath) { |
|
var doc = this.evaluate ? this : this.ownerDocument, next; |
|
var got = doc.evaluate(xpath, this, null, 0, null), all = []; |
|
switch (got.resultType) { |
|
case 1/*XPathResult.NUMBER_TYPE*/: return got.numberValue; |
|
case 2/*XPathResult.STRING_TYPE*/: return got.stringValue; |
|
case 3/*XPathResult.BOOLEAN_TYPE*/: return got.booleanValue; |
|
default: while ((next = got.iterateNext())) all.push(next); return all; |
|
} |
|
} |
|
function $X(xpath) { |
|
var got = $x.call(this, xpath); |
|
return got instanceof Array ? got[0] || null : got; |
|
} |
|
|
|
function quoteRe(s) { return (s+'').replace(/([-$(-+.?[-^{|}])/g, '\\$1'); } |
|
|
|
// DOM constraint tester / scraper facility: |
|
// "this" is the context Node(s) - initially the document |
|
// "spec" is either of: |
|
// * css / xpath Selector "selector_type selector" |
|
// * resolved for context [ context Selector, spec ] |
|
// * an Object of spec(s) { property_name: spec, ... } |
|
function test_dom(spec, context) { |
|
// returns FAIL if it turned out it wasn't a mandated match at this level |
|
// returns null if it didn't find optional matches at this level |
|
// returns Node or an Array of nodes, or a basic type from some XPath query |
|
function lookup(rule) { |
|
switch (typeof rule) { |
|
case 'string': break; // main case - rest of function |
|
case 'object': <span class="missing-if-branch" title="else path not taken"" >E</span>if ('nodeType' in rule || rule.length) return rule; |
|
// fall-through |
|
<span class="branch-2 cbranch-no" title="branch not covered" > default: <span class="cstat-no" title="statement not covered" >throw new Error('non-String dom match rule: '+ rule);</span></span> |
|
} |
|
if (!given._parse_dom_rule) given._parse_dom_rule = new RegExp('^(' + |
|
Object.keys(given.dom).map(quoteRe).join('|') + ')\\s*(.*)'); |
|
var match = given._parse_dom_rule.exec(rule), type, func; |
|
<span class="missing-if-branch" title="else path not taken"" >E</span>if (match) { |
|
type = match[1]; |
|
rule = match[2]; |
|
func = test_dom[type]; |
|
} |
|
<span class="missing-if-branch" title="if path not taken"" >I</span>if (!func) <span class="cstat-no" title="statement not covered" >throw new Error('unknown dom match rule '+ type +': '+ rule);</span> |
|
return func.call(this, rule); |
|
} |
|
|
|
var results, result, i, property_name; |
|
<span class="missing-if-branch" title="else path not taken"" >E</span>if (context === undefined) { |
|
context = this === given || this === window ? document : this; |
|
} |
|
|
|
// validate context: |
|
<span class="missing-if-branch" title="if path not taken"" >I</span>if (context === null || context === FAIL) <span class="cstat-no" title="statement not covered" >return FAIL;</span> |
|
if (isArray(context)) { |
|
for (results = [], i = 0; i < context.length; i++) { |
|
result = test_dom.call(context[i], spec); |
|
<span class="missing-if-branch" title="else path not taken"" >E</span>if (result !== FAIL) |
|
results.push(result); |
|
} |
|
return results; |
|
} |
|
<span class="missing-if-branch" title="if path not taken"" >I</span>if (typeof context !== 'object' || !('nodeType' in context)) |
|
<span class="cstat-no" title="statement not covered" > throw new Error('illegal context: '+ context);</span> |
|
|
|
// handle input spec format: |
|
if (typeof spec === 'string') return lookup.call(context, spec); |
|
if (isArray(spec)) { |
|
context = lookup.call(context, spec[0]); |
|
if (context === null || context === FAIL) return context; |
|
return test_dom.call(context, spec[1]); |
|
} |
|
if (isObject(spec)) { |
|
results = {}; |
|
for (property_name in spec) { |
|
result = test_dom.call(context, spec[property_name]); |
|
if (result === FAIL) return FAIL; |
|
results[property_name] = result; |
|
} |
|
return results; |
|
} |
|
|
|
throw new Error("dom spec was neither a String, Object nor Array: "+ spec); |
|
} |
|
}; |
|
|
|
<span class="missing-if-branch" title="if path not taken"" >I</span>if ('module' in this) <span class="cstat-no" title="statement not covered" >module.exports = given;</span> |
|
</pre></td></tr> |
|
</table></pre> |
|
|
|
</div> |
|
<div class="footer"> |
|
<div class="meta">Generated by <a href="http://istanbul-js.org/" target="_blank">istanbul</a> at Sat Jul 06 2013 22:41:58 GMT-0700 (PDT)</div> |
|
</div> |
|
|
|
<script src="../prettify.js"></script> |
|
|
|
<script src="http://yui.yahooapis.com/3.6.0/build/yui/yui-min.js"></script> |
|
<script> |
|
|
|
YUI().use('datatable', function (Y) { |
|
|
|
var formatters = { |
|
pct: function (o) { |
|
o.className += o.record.get('classes')[o.column.key]; |
|
try { |
|
return o.value.toFixed(2) + '%'; |
|
} catch (ex) { return o.value + '%'; } |
|
}, |
|
html: function (o) { |
|
o.className += o.record.get('classes')[o.column.key]; |
|
return o.record.get(o.column.key + '_html'); |
|
} |
|
}, |
|
defaultFormatter = function (o) { |
|
o.className += o.record.get('classes')[o.column.key]; |
|
return o.value; |
|
}; |
|
|
|
function getColumns(theadNode) { |
|
var colNodes = theadNode.all('tr th'), |
|
cols = [], |
|
col; |
|
colNodes.each(function (colNode) { |
|
col = { |
|
key: colNode.getAttribute('data-col'), |
|
label: colNode.get('innerHTML') || ' ', |
|
sortable: !colNode.getAttribute('data-nosort'), |
|
className: colNode.getAttribute('class'), |
|
type: colNode.getAttribute('data-type'), |
|
allowHTML: colNode.getAttribute('data-html') === 'true' || colNode.getAttribute('data-fmt') === 'html' |
|
}; |
|
col.formatter = formatters[colNode.getAttribute('data-fmt')] || defaultFormatter; |
|
cols.push(col); |
|
}); |
|
return cols; |
|
} |
|
|
|
function getRowData(trNode, cols) { |
|
var tdNodes = trNode.all('td'), |
|
i, |
|
row = { classes: {} }, |
|
node, |
|
name; |
|
for (i = 0; i < cols.length; i += 1) { |
|
name = cols[i].key; |
|
node = tdNodes.item(i); |
|
row[name] = node.getAttribute('data-value') || node.get('innerHTML'); |
|
row[name + '_html'] = node.get('innerHTML'); |
|
row.classes[name] = node.getAttribute('class'); |
|
//Y.log('Name: ' + name + '; Value: ' + row[name]); |
|
if (cols[i].type === 'number') { row[name] = row[name] * 1; } |
|
} |
|
//Y.log(row); |
|
return row; |
|
} |
|
|
|
function getData(tbodyNode, cols) { |
|
var data = []; |
|
tbodyNode.all('tr').each(function (trNode) { |
|
data.push(getRowData(trNode, cols)); |
|
}); |
|
return data; |
|
} |
|
|
|
function replaceTable(node) { |
|
if (!node) { return; } |
|
var cols = getColumns(node.one('thead')), |
|
data = getData(node.one('tbody'), cols), |
|
table, |
|
parent = node.get('parentNode'); |
|
|
|
table = new Y.DataTable({ |
|
columns: cols, |
|
data: data, |
|
sortBy: 'file' |
|
}); |
|
parent.set('innerHTML', ''); |
|
table.render(parent); |
|
} |
|
|
|
Y.on('domready', function () { |
|
replaceTable(Y.one('div.coverage-summary table')); |
|
if (typeof prettyPrint === 'function') { |
|
prettyPrint(); |
|
} |
|
}); |
|
}); |
|
</script> |
|
</body> |
|
</html> |