Line | Source Code | Coverage |
---|
1 | /**************************************************************************** | - |
2 | ** | - |
3 | ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). | - |
4 | ** Contact: http://www.qt-project.org/legal | - |
5 | ** | - |
6 | ** This file is part of the QtGui module of the Qt Toolkit. | - |
7 | ** | - |
8 | ** $QT_BEGIN_LICENSE:LGPL$ | - |
9 | ** Commercial License Usage | - |
10 | ** Licensees holding valid commercial Qt licenses may use this file in | - |
11 | ** accordance with the commercial license agreement provided with the | - |
12 | ** Software or, alternatively, in accordance with the terms contained in | - |
13 | ** a written agreement between you and Digia. For licensing terms and | - |
14 | ** conditions see http://qt.digia.com/licensing. For further information | - |
15 | ** use the contact form at http://qt.digia.com/contact-us. | - |
16 | ** | - |
17 | ** GNU Lesser General Public License Usage | - |
18 | ** Alternatively, this file may be used under the terms of the GNU Lesser | - |
19 | ** General Public License version 2.1 as published by the Free Software | - |
20 | ** Foundation and appearing in the file LICENSE.LGPL included in the | - |
21 | ** packaging of this file. Please review the following information to | - |
22 | ** ensure the GNU Lesser General Public License version 2.1 requirements | - |
23 | ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. | - |
24 | ** | - |
25 | ** In addition, as a special exception, Digia gives you certain additional | - |
26 | ** rights. These rights are described in the Digia Qt LGPL Exception | - |
27 | ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. | - |
28 | ** | - |
29 | ** GNU General Public License Usage | - |
30 | ** Alternatively, this file may be used under the terms of the GNU | - |
31 | ** General Public License version 3.0 as published by the Free Software | - |
32 | ** Foundation and appearing in the file LICENSE.GPL included in the | - |
33 | ** packaging of this file. Please review the following information to | - |
34 | ** ensure the GNU General Public License version 3.0 requirements will be | - |
35 | ** met: http://www.gnu.org/copyleft/gpl.html. | - |
36 | ** | - |
37 | ** | - |
38 | ** $QT_END_LICENSE$ | - |
39 | ** | - |
40 | ****************************************************************************/ | - |
41 | | - |
42 | #include "qtexthtmlparser_p.h" | - |
43 | | - |
44 | #include <qbytearray.h> | - |
45 | #include <qtextcodec.h> | - |
46 | #include <qstack.h> | - |
47 | #include <qdebug.h> | - |
48 | #include <qthread.h> | - |
49 | #include <qcoreapplication.h> | - |
50 | | - |
51 | #include "qtextdocument.h" | - |
52 | #include "qtextformat_p.h" | - |
53 | #include "qtextdocument_p.h" | - |
54 | #include "qtextcursor.h" | - |
55 | #include "qfont_p.h" | - |
56 | #include "private/qfunctions_p.h" | - |
57 | | - |
58 | #ifndef QT_NO_TEXTHTMLPARSER | - |
59 | | - |
60 | QT_BEGIN_NAMESPACE | - |
61 | | - |
62 | // see also tst_qtextdocumentfragment.cpp | - |
63 | #define MAX_ENTITY 258 | - |
64 | static const struct QTextHtmlEntity { const char *name; quint16 code; } entities[MAX_ENTITY]= { | - |
65 | { "AElig", 0x00c6 }, | - |
66 | { "AMP", 38 }, | - |
67 | { "Aacute", 0x00c1 }, | - |
68 | { "Acirc", 0x00c2 }, | - |
69 | { "Agrave", 0x00c0 }, | - |
70 | { "Alpha", 0x0391 }, | - |
71 | { "Aring", 0x00c5 }, | - |
72 | { "Atilde", 0x00c3 }, | - |
73 | { "Auml", 0x00c4 }, | - |
74 | { "Beta", 0x0392 }, | - |
75 | { "Ccedil", 0x00c7 }, | - |
76 | { "Chi", 0x03a7 }, | - |
77 | { "Dagger", 0x2021 }, | - |
78 | { "Delta", 0x0394 }, | - |
79 | { "ETH", 0x00d0 }, | - |
80 | { "Eacute", 0x00c9 }, | - |
81 | { "Ecirc", 0x00ca }, | - |
82 | { "Egrave", 0x00c8 }, | - |
83 | { "Epsilon", 0x0395 }, | - |
84 | { "Eta", 0x0397 }, | - |
85 | { "Euml", 0x00cb }, | - |
86 | { "GT", 62 }, | - |
87 | { "Gamma", 0x0393 }, | - |
88 | { "Iacute", 0x00cd }, | - |
89 | { "Icirc", 0x00ce }, | - |
90 | { "Igrave", 0x00cc }, | - |
91 | { "Iota", 0x0399 }, | - |
92 | { "Iuml", 0x00cf }, | - |
93 | { "Kappa", 0x039a }, | - |
94 | { "LT", 60 }, | - |
95 | { "Lambda", 0x039b }, | - |
96 | { "Mu", 0x039c }, | - |
97 | { "Ntilde", 0x00d1 }, | - |
98 | { "Nu", 0x039d }, | - |
99 | { "OElig", 0x0152 }, | - |
100 | { "Oacute", 0x00d3 }, | - |
101 | { "Ocirc", 0x00d4 }, | - |
102 | { "Ograve", 0x00d2 }, | - |
103 | { "Omega", 0x03a9 }, | - |
104 | { "Omicron", 0x039f }, | - |
105 | { "Oslash", 0x00d8 }, | - |
106 | { "Otilde", 0x00d5 }, | - |
107 | { "Ouml", 0x00d6 }, | - |
108 | { "Phi", 0x03a6 }, | - |
109 | { "Pi", 0x03a0 }, | - |
110 | { "Prime", 0x2033 }, | - |
111 | { "Psi", 0x03a8 }, | - |
112 | { "QUOT", 34 }, | - |
113 | { "Rho", 0x03a1 }, | - |
114 | { "Scaron", 0x0160 }, | - |
115 | { "Sigma", 0x03a3 }, | - |
116 | { "THORN", 0x00de }, | - |
117 | { "Tau", 0x03a4 }, | - |
118 | { "Theta", 0x0398 }, | - |
119 | { "Uacute", 0x00da }, | - |
120 | { "Ucirc", 0x00db }, | - |
121 | { "Ugrave", 0x00d9 }, | - |
122 | { "Upsilon", 0x03a5 }, | - |
123 | { "Uuml", 0x00dc }, | - |
124 | { "Xi", 0x039e }, | - |
125 | { "Yacute", 0x00dd }, | - |
126 | { "Yuml", 0x0178 }, | - |
127 | { "Zeta", 0x0396 }, | - |
128 | { "aacute", 0x00e1 }, | - |
129 | { "acirc", 0x00e2 }, | - |
130 | { "acute", 0x00b4 }, | - |
131 | { "aelig", 0x00e6 }, | - |
132 | { "agrave", 0x00e0 }, | - |
133 | { "alefsym", 0x2135 }, | - |
134 | { "alpha", 0x03b1 }, | - |
135 | { "amp", 38 }, | - |
136 | { "and", 0x22a5 }, | - |
137 | { "ang", 0x2220 }, | - |
138 | { "apos", 0x0027 }, | - |
139 | { "aring", 0x00e5 }, | - |
140 | { "asymp", 0x2248 }, | - |
141 | { "atilde", 0x00e3 }, | - |
142 | { "auml", 0x00e4 }, | - |
143 | { "bdquo", 0x201e }, | - |
144 | { "beta", 0x03b2 }, | - |
145 | { "brvbar", 0x00a6 }, | - |
146 | { "bull", 0x2022 }, | - |
147 | { "cap", 0x2229 }, | - |
148 | { "ccedil", 0x00e7 }, | - |
149 | { "cedil", 0x00b8 }, | - |
150 | { "cent", 0x00a2 }, | - |
151 | { "chi", 0x03c7 }, | - |
152 | { "circ", 0x02c6 }, | - |
153 | { "clubs", 0x2663 }, | - |
154 | { "cong", 0x2245 }, | - |
155 | { "copy", 0x00a9 }, | - |
156 | { "crarr", 0x21b5 }, | - |
157 | { "cup", 0x222a }, | - |
158 | { "curren", 0x00a4 }, | - |
159 | { "dArr", 0x21d3 }, | - |
160 | { "dagger", 0x2020 }, | - |
161 | { "darr", 0x2193 }, | - |
162 | { "deg", 0x00b0 }, | - |
163 | { "delta", 0x03b4 }, | - |
164 | { "diams", 0x2666 }, | - |
165 | { "divide", 0x00f7 }, | - |
166 | { "eacute", 0x00e9 }, | - |
167 | { "ecirc", 0x00ea }, | - |
168 | { "egrave", 0x00e8 }, | - |
169 | { "empty", 0x2205 }, | - |
170 | { "emsp", 0x2003 }, | - |
171 | { "ensp", 0x2002 }, | - |
172 | { "epsilon", 0x03b5 }, | - |
173 | { "equiv", 0x2261 }, | - |
174 | { "eta", 0x03b7 }, | - |
175 | { "eth", 0x00f0 }, | - |
176 | { "euml", 0x00eb }, | - |
177 | { "euro", 0x20ac }, | - |
178 | { "exist", 0x2203 }, | - |
179 | { "fnof", 0x0192 }, | - |
180 | { "forall", 0x2200 }, | - |
181 | { "frac12", 0x00bd }, | - |
182 | { "frac14", 0x00bc }, | - |
183 | { "frac34", 0x00be }, | - |
184 | { "frasl", 0x2044 }, | - |
185 | { "gamma", 0x03b3 }, | - |
186 | { "ge", 0x2265 }, | - |
187 | { "gt", 62 }, | - |
188 | { "hArr", 0x21d4 }, | - |
189 | { "harr", 0x2194 }, | - |
190 | { "hearts", 0x2665 }, | - |
191 | { "hellip", 0x2026 }, | - |
192 | { "iacute", 0x00ed }, | - |
193 | { "icirc", 0x00ee }, | - |
194 | { "iexcl", 0x00a1 }, | - |
195 | { "igrave", 0x00ec }, | - |
196 | { "image", 0x2111 }, | - |
197 | { "infin", 0x221e }, | - |
198 | { "int", 0x222b }, | - |
199 | { "iota", 0x03b9 }, | - |
200 | { "iquest", 0x00bf }, | - |
201 | { "isin", 0x2208 }, | - |
202 | { "iuml", 0x00ef }, | - |
203 | { "kappa", 0x03ba }, | - |
204 | { "lArr", 0x21d0 }, | - |
205 | { "lambda", 0x03bb }, | - |
206 | { "lang", 0x2329 }, | - |
207 | { "laquo", 0x00ab }, | - |
208 | { "larr", 0x2190 }, | - |
209 | { "lceil", 0x2308 }, | - |
210 | { "ldquo", 0x201c }, | - |
211 | { "le", 0x2264 }, | - |
212 | { "lfloor", 0x230a }, | - |
213 | { "lowast", 0x2217 }, | - |
214 | { "loz", 0x25ca }, | - |
215 | { "lrm", 0x200e }, | - |
216 | { "lsaquo", 0x2039 }, | - |
217 | { "lsquo", 0x2018 }, | - |
218 | { "lt", 60 }, | - |
219 | { "macr", 0x00af }, | - |
220 | { "mdash", 0x2014 }, | - |
221 | { "micro", 0x00b5 }, | - |
222 | { "middot", 0x00b7 }, | - |
223 | { "minus", 0x2212 }, | - |
224 | { "mu", 0x03bc }, | - |
225 | { "nabla", 0x2207 }, | - |
226 | { "nbsp", 0x00a0 }, | - |
227 | { "ndash", 0x2013 }, | - |
228 | { "ne", 0x2260 }, | - |
229 | { "ni", 0x220b }, | - |
230 | { "not", 0x00ac }, | - |
231 | { "notin", 0x2209 }, | - |
232 | { "nsub", 0x2284 }, | - |
233 | { "ntilde", 0x00f1 }, | - |
234 | { "nu", 0x03bd }, | - |
235 | { "oacute", 0x00f3 }, | - |
236 | { "ocirc", 0x00f4 }, | - |
237 | { "oelig", 0x0153 }, | - |
238 | { "ograve", 0x00f2 }, | - |
239 | { "oline", 0x203e }, | - |
240 | { "omega", 0x03c9 }, | - |
241 | { "omicron", 0x03bf }, | - |
242 | { "oplus", 0x2295 }, | - |
243 | { "or", 0x22a6 }, | - |
244 | { "ordf", 0x00aa }, | - |
245 | { "ordm", 0x00ba }, | - |
246 | { "oslash", 0x00f8 }, | - |
247 | { "otilde", 0x00f5 }, | - |
248 | { "otimes", 0x2297 }, | - |
249 | { "ouml", 0x00f6 }, | - |
250 | { "para", 0x00b6 }, | - |
251 | { "part", 0x2202 }, | - |
252 | { "percnt", 0x0025 }, | - |
253 | { "permil", 0x2030 }, | - |
254 | { "perp", 0x22a5 }, | - |
255 | { "phi", 0x03c6 }, | - |
256 | { "pi", 0x03c0 }, | - |
257 | { "piv", 0x03d6 }, | - |
258 | { "plusmn", 0x00b1 }, | - |
259 | { "pound", 0x00a3 }, | - |
260 | { "prime", 0x2032 }, | - |
261 | { "prod", 0x220f }, | - |
262 | { "prop", 0x221d }, | - |
263 | { "psi", 0x03c8 }, | - |
264 | { "quot", 34 }, | - |
265 | { "rArr", 0x21d2 }, | - |
266 | { "radic", 0x221a }, | - |
267 | { "rang", 0x232a }, | - |
268 | { "raquo", 0x00bb }, | - |
269 | { "rarr", 0x2192 }, | - |
270 | { "rceil", 0x2309 }, | - |
271 | { "rdquo", 0x201d }, | - |
272 | { "real", 0x211c }, | - |
273 | { "reg", 0x00ae }, | - |
274 | { "rfloor", 0x230b }, | - |
275 | { "rho", 0x03c1 }, | - |
276 | { "rlm", 0x200f }, | - |
277 | { "rsaquo", 0x203a }, | - |
278 | { "rsquo", 0x2019 }, | - |
279 | { "sbquo", 0x201a }, | - |
280 | { "scaron", 0x0161 }, | - |
281 | { "sdot", 0x22c5 }, | - |
282 | { "sect", 0x00a7 }, | - |
283 | { "shy", 0x00ad }, | - |
284 | { "sigma", 0x03c3 }, | - |
285 | { "sigmaf", 0x03c2 }, | - |
286 | { "sim", 0x223c }, | - |
287 | { "spades", 0x2660 }, | - |
288 | { "sub", 0x2282 }, | - |
289 | { "sube", 0x2286 }, | - |
290 | { "sum", 0x2211 }, | - |
291 | { "sup", 0x2283 }, | - |
292 | { "sup1", 0x00b9 }, | - |
293 | { "sup2", 0x00b2 }, | - |
294 | { "sup3", 0x00b3 }, | - |
295 | { "supe", 0x2287 }, | - |
296 | { "szlig", 0x00df }, | - |
297 | { "tau", 0x03c4 }, | - |
298 | { "there4", 0x2234 }, | - |
299 | { "theta", 0x03b8 }, | - |
300 | { "thetasym", 0x03d1 }, | - |
301 | { "thinsp", 0x2009 }, | - |
302 | { "thorn", 0x00fe }, | - |
303 | { "tilde", 0x02dc }, | - |
304 | { "times", 0x00d7 }, | - |
305 | { "trade", 0x2122 }, | - |
306 | { "uArr", 0x21d1 }, | - |
307 | { "uacute", 0x00fa }, | - |
308 | { "uarr", 0x2191 }, | - |
309 | { "ucirc", 0x00fb }, | - |
310 | { "ugrave", 0x00f9 }, | - |
311 | { "uml", 0x00a8 }, | - |
312 | { "upsih", 0x03d2 }, | - |
313 | { "upsilon", 0x03c5 }, | - |
314 | { "uuml", 0x00fc }, | - |
315 | { "weierp", 0x2118 }, | - |
316 | { "xi", 0x03be }, | - |
317 | { "yacute", 0x00fd }, | - |
318 | { "yen", 0x00a5 }, | - |
319 | { "yuml", 0x00ff }, | - |
320 | { "zeta", 0x03b6 }, | - |
321 | { "zwj", 0x200d }, | - |
322 | { "zwnj", 0x200c } | - |
323 | }; | - |
324 | | - |
325 | Q_STATIC_GLOBAL_OPERATOR bool operator<(const QString &entityStr, const QTextHtmlEntity &entity) | - |
326 | { | - |
327 | return entityStr < QLatin1String(entity.name); executed: return entityStr < QLatin1String(entity.name); Execution Count:296 | 296 |
328 | } | - |
329 | | - |
330 | Q_STATIC_GLOBAL_OPERATOR bool operator<(const QTextHtmlEntity &entity, const QString &entityStr) | - |
331 | { | - |
332 | return QLatin1String(entity.name) < entityStr; executed: return QLatin1String(entity.name) < entityStr; Execution Count:2408 | 2408 |
333 | } | - |
334 | | - |
335 | static QChar resolveEntity(const QString &entity) | - |
336 | { | - |
337 | const QTextHtmlEntity *start = &entities[0]; executed (the execution status of this line is deduced): const QTextHtmlEntity *start = &entities[0]; | - |
338 | const QTextHtmlEntity *end = &entities[MAX_ENTITY]; executed (the execution status of this line is deduced): const QTextHtmlEntity *end = &entities[258]; | - |
339 | const QTextHtmlEntity *e = qBinaryFind(start, end, entity); executed (the execution status of this line is deduced): const QTextHtmlEntity *e = qBinaryFind(start, end, entity); | - |
340 | if (e == end) evaluated: e == end yes Evaluation Count:34 | yes Evaluation Count:262 |
| 34-262 |
341 | return QChar(); executed: return QChar(); Execution Count:34 | 34 |
342 | return e->code; executed: return e->code; Execution Count:262 | 262 |
343 | } | - |
344 | | - |
345 | static const ushort windowsLatin1ExtendedCharacters[0xA0 - 0x80] = { | - |
346 | 0x20ac, // 0x80 | - |
347 | 0x0081, // 0x81 direct mapping | - |
348 | 0x201a, // 0x82 | - |
349 | 0x0192, // 0x83 | - |
350 | 0x201e, // 0x84 | - |
351 | 0x2026, // 0x85 | - |
352 | 0x2020, // 0x86 | - |
353 | 0x2021, // 0x87 | - |
354 | 0x02C6, // 0x88 | - |
355 | 0x2030, // 0x89 | - |
356 | 0x0160, // 0x8A | - |
357 | 0x2039, // 0x8B | - |
358 | 0x0152, // 0x8C | - |
359 | 0x008D, // 0x8D direct mapping | - |
360 | 0x017D, // 0x8E | - |
361 | 0x008F, // 0x8F directmapping | - |
362 | 0x0090, // 0x90 directmapping | - |
363 | 0x2018, // 0x91 | - |
364 | 0x2019, // 0x92 | - |
365 | 0x201C, // 0x93 | - |
366 | 0X201D, // 0x94 | - |
367 | 0x2022, // 0x95 | - |
368 | 0x2013, // 0x96 | - |
369 | 0x2014, // 0x97 | - |
370 | 0x02DC, // 0x98 | - |
371 | 0x2122, // 0x99 | - |
372 | 0x0161, // 0x9A | - |
373 | 0x203A, // 0x9B | - |
374 | 0x0153, // 0x9C | - |
375 | 0x009D, // 0x9D direct mapping | - |
376 | 0x017E, // 0x9E | - |
377 | 0x0178 // 0x9F | - |
378 | }; | - |
379 | | - |
380 | // the displayMode value is according to the what are blocks in the piecetable, not | - |
381 | // what the w3c defines. | - |
382 | static const QTextHtmlElement elements[Html_NumElements]= { | - |
383 | { "a", Html_a, QTextHtmlElement::DisplayInline }, | - |
384 | { "address", Html_address, QTextHtmlElement::DisplayInline }, | - |
385 | { "b", Html_b, QTextHtmlElement::DisplayInline }, | - |
386 | { "big", Html_big, QTextHtmlElement::DisplayInline }, | - |
387 | { "blockquote", Html_blockquote, QTextHtmlElement::DisplayBlock }, | - |
388 | { "body", Html_body, QTextHtmlElement::DisplayBlock }, | - |
389 | { "br", Html_br, QTextHtmlElement::DisplayInline }, | - |
390 | { "caption", Html_caption, QTextHtmlElement::DisplayBlock }, | - |
391 | { "center", Html_center, QTextHtmlElement::DisplayBlock }, | - |
392 | { "cite", Html_cite, QTextHtmlElement::DisplayInline }, | - |
393 | { "code", Html_code, QTextHtmlElement::DisplayInline }, | - |
394 | { "dd", Html_dd, QTextHtmlElement::DisplayBlock }, | - |
395 | { "dfn", Html_dfn, QTextHtmlElement::DisplayInline }, | - |
396 | { "div", Html_div, QTextHtmlElement::DisplayBlock }, | - |
397 | { "dl", Html_dl, QTextHtmlElement::DisplayBlock }, | - |
398 | { "dt", Html_dt, QTextHtmlElement::DisplayBlock }, | - |
399 | { "em", Html_em, QTextHtmlElement::DisplayInline }, | - |
400 | { "font", Html_font, QTextHtmlElement::DisplayInline }, | - |
401 | { "h1", Html_h1, QTextHtmlElement::DisplayBlock }, | - |
402 | { "h2", Html_h2, QTextHtmlElement::DisplayBlock }, | - |
403 | { "h3", Html_h3, QTextHtmlElement::DisplayBlock }, | - |
404 | { "h4", Html_h4, QTextHtmlElement::DisplayBlock }, | - |
405 | { "h5", Html_h5, QTextHtmlElement::DisplayBlock }, | - |
406 | { "h6", Html_h6, QTextHtmlElement::DisplayBlock }, | - |
407 | { "head", Html_head, QTextHtmlElement::DisplayNone }, | - |
408 | { "hr", Html_hr, QTextHtmlElement::DisplayBlock }, | - |
409 | { "html", Html_html, QTextHtmlElement::DisplayInline }, | - |
410 | { "i", Html_i, QTextHtmlElement::DisplayInline }, | - |
411 | { "img", Html_img, QTextHtmlElement::DisplayInline }, | - |
412 | { "kbd", Html_kbd, QTextHtmlElement::DisplayInline }, | - |
413 | { "li", Html_li, QTextHtmlElement::DisplayBlock }, | - |
414 | { "link", Html_link, QTextHtmlElement::DisplayNone }, | - |
415 | { "meta", Html_meta, QTextHtmlElement::DisplayNone }, | - |
416 | { "nobr", Html_nobr, QTextHtmlElement::DisplayInline }, | - |
417 | { "ol", Html_ol, QTextHtmlElement::DisplayBlock }, | - |
418 | { "p", Html_p, QTextHtmlElement::DisplayBlock }, | - |
419 | { "pre", Html_pre, QTextHtmlElement::DisplayBlock }, | - |
420 | { "qt", Html_body /*deliberate mapping*/, QTextHtmlElement::DisplayBlock }, | - |
421 | { "s", Html_s, QTextHtmlElement::DisplayInline }, | - |
422 | { "samp", Html_samp, QTextHtmlElement::DisplayInline }, | - |
423 | { "script", Html_script, QTextHtmlElement::DisplayNone }, | - |
424 | { "small", Html_small, QTextHtmlElement::DisplayInline }, | - |
425 | { "span", Html_span, QTextHtmlElement::DisplayInline }, | - |
426 | { "strong", Html_strong, QTextHtmlElement::DisplayInline }, | - |
427 | { "style", Html_style, QTextHtmlElement::DisplayNone }, | - |
428 | { "sub", Html_sub, QTextHtmlElement::DisplayInline }, | - |
429 | { "sup", Html_sup, QTextHtmlElement::DisplayInline }, | - |
430 | { "table", Html_table, QTextHtmlElement::DisplayTable }, | - |
431 | { "tbody", Html_tbody, QTextHtmlElement::DisplayTable }, | - |
432 | { "td", Html_td, QTextHtmlElement::DisplayBlock }, | - |
433 | { "tfoot", Html_tfoot, QTextHtmlElement::DisplayTable }, | - |
434 | { "th", Html_th, QTextHtmlElement::DisplayBlock }, | - |
435 | { "thead", Html_thead, QTextHtmlElement::DisplayTable }, | - |
436 | { "title", Html_title, QTextHtmlElement::DisplayNone }, | - |
437 | { "tr", Html_tr, QTextHtmlElement::DisplayTable }, | - |
438 | { "tt", Html_tt, QTextHtmlElement::DisplayInline }, | - |
439 | { "u", Html_u, QTextHtmlElement::DisplayInline }, | - |
440 | { "ul", Html_ul, QTextHtmlElement::DisplayBlock }, | - |
441 | { "var", Html_var, QTextHtmlElement::DisplayInline }, | - |
442 | }; | - |
443 | | - |
444 | | - |
445 | Q_STATIC_GLOBAL_OPERATOR bool operator<(const QString &str, const QTextHtmlElement &e) | - |
446 | { | - |
447 | return str < QLatin1String(e.name); executed: return str < QLatin1String(e.name); Execution Count:1606 | 1606 |
448 | } | - |
449 | | - |
450 | Q_STATIC_GLOBAL_OPERATOR bool operator<(const QTextHtmlElement &e, const QString &str) | - |
451 | { | - |
452 | return QLatin1String(e.name) < str; executed: return QLatin1String(e.name) < str; Execution Count:9596 | 9596 |
453 | } | - |
454 | | - |
455 | static const QTextHtmlElement *lookupElementHelper(const QString &element) | - |
456 | { | - |
457 | const QTextHtmlElement *start = &elements[0]; executed (the execution status of this line is deduced): const QTextHtmlElement *start = &elements[0]; | - |
458 | const QTextHtmlElement *end = &elements[Html_NumElements]; executed (the execution status of this line is deduced): const QTextHtmlElement *end = &elements[Html_NumElements]; | - |
459 | const QTextHtmlElement *e = qBinaryFind(start, end, element); executed (the execution status of this line is deduced): const QTextHtmlElement *e = qBinaryFind(start, end, element); | - |
460 | if (e == end) evaluated: e == end yes Evaluation Count:12 | yes Evaluation Count:1594 |
| 12-1594 |
461 | return 0; executed: return 0; Execution Count:12 | 12 |
462 | return e; executed: return e; Execution Count:1594 | 1594 |
463 | } | - |
464 | | - |
465 | int QTextHtmlParser::lookupElement(const QString &element) | - |
466 | { | - |
467 | const QTextHtmlElement *e = lookupElementHelper(element); executed (the execution status of this line is deduced): const QTextHtmlElement *e = lookupElementHelper(element); | - |
468 | if (!e) partially evaluated: !e no Evaluation Count:0 | yes Evaluation Count:13 |
| 0-13 |
469 | return -1; never executed: return -1; | 0 |
470 | return e->id; executed: return e->id; Execution Count:13 | 13 |
471 | } | - |
472 | | - |
473 | // quotes newlines as "\\n" | - |
474 | static QString quoteNewline(const QString &s) | - |
475 | { | - |
476 | QString n = s; never executed (the execution status of this line is deduced): QString n = s; | - |
477 | n.replace(QLatin1Char('\n'), QLatin1String("\\n")); never executed (the execution status of this line is deduced): n.replace(QLatin1Char('\n'), QLatin1String("\\n")); | - |
478 | return n; never executed: return n; | 0 |
479 | } | - |
480 | | - |
481 | QTextHtmlParserNode::QTextHtmlParserNode() | - |
482 | : parent(0), id(Html_unknown), | - |
483 | cssFloat(QTextFrameFormat::InFlow), hasOwnListStyle(false), | - |
484 | hasCssListIndent(false), isEmptyParagraph(false), isTextFrame(false), isRootFrame(false), | - |
485 | displayMode(QTextHtmlElement::DisplayInline), hasHref(false), | - |
486 | listStyle(QTextListFormat::ListStyleUndefined), imageWidth(-1), imageHeight(-1), tableBorder(0), | - |
487 | tableCellRowSpan(1), tableCellColSpan(1), tableCellSpacing(2), tableCellPadding(0), | - |
488 | borderBrush(Qt::darkGray), borderStyle(QTextFrameFormat::BorderStyle_Outset), | - |
489 | userState(-1), cssListIndent(0), wsm(WhiteSpaceModeUndefined) | - |
490 | { | - |
491 | margin[QTextHtmlParser::MarginLeft] = 0; executed (the execution status of this line is deduced): margin[QTextHtmlParser::MarginLeft] = 0; | - |
492 | margin[QTextHtmlParser::MarginRight] = 0; executed (the execution status of this line is deduced): margin[QTextHtmlParser::MarginRight] = 0; | - |
493 | margin[QTextHtmlParser::MarginTop] = 0; executed (the execution status of this line is deduced): margin[QTextHtmlParser::MarginTop] = 0; | - |
494 | margin[QTextHtmlParser::MarginBottom] = 0; executed (the execution status of this line is deduced): margin[QTextHtmlParser::MarginBottom] = 0; | - |
495 | } executed: } Execution Count:3070 | 3070 |
496 | | - |
497 | void QTextHtmlParser::dumpHtml() | - |
498 | { | - |
499 | for (int i = 0; i < count(); ++i) { never evaluated: i < count() | 0 |
500 | qDebug().nospace() << qPrintable(QString(depth(i)*4, QLatin1Char(' '))) never executed (the execution status of this line is deduced): QMessageLogger("text/qtexthtmlparser.cpp", 500, __PRETTY_FUNCTION__).debug().nospace() << QString(QString(depth(i)*4, QLatin1Char(' '))).toLocal8Bit().constData() | - |
501 | << qPrintable(at(i).tag) << ':' never executed (the execution status of this line is deduced): << QString(at(i).tag).toLocal8Bit().constData() << ':' | - |
502 | << quoteNewline(at(i).text); never executed (the execution status of this line is deduced): << quoteNewline(at(i).text); | - |
503 | ; | - |
504 | } | 0 |
505 | } | 0 |
506 | | - |
507 | QTextHtmlParserNode *QTextHtmlParser::newNode(int parent) | - |
508 | { | - |
509 | QTextHtmlParserNode *lastNode = &nodes.last(); executed (the execution status of this line is deduced): QTextHtmlParserNode *lastNode = &nodes.last(); | - |
510 | QTextHtmlParserNode *newNode = 0; executed (the execution status of this line is deduced): QTextHtmlParserNode *newNode = 0; | - |
511 | | - |
512 | bool reuseLastNode = true; executed (the execution status of this line is deduced): bool reuseLastNode = true; | - |
513 | | - |
514 | if (nodes.count() == 1) { evaluated: nodes.count() == 1 yes Evaluation Count:679 | yes Evaluation Count:2289 |
| 679-2289 |
515 | reuseLastNode = false; executed (the execution status of this line is deduced): reuseLastNode = false; | - |
516 | } else if (lastNode->tag.isEmpty()) { executed: } Execution Count:679 evaluated: lastNode->tag.isEmpty() yes Evaluation Count:771 | yes Evaluation Count:1518 |
| 679-1518 |
517 | | - |
518 | if (lastNode->text.isEmpty()) { evaluated: lastNode->text.isEmpty() yes Evaluation Count:523 | yes Evaluation Count:248 |
| 248-523 |
519 | reuseLastNode = true; executed (the execution status of this line is deduced): reuseLastNode = true; | - |
520 | } else { // last node is a text node (empty tag) with some text executed: } Execution Count:523 | 523 |
521 | | - |
522 | if (lastNode->text.length() == 1 && lastNode->text.at(0).isSpace()) { evaluated: lastNode->text.length() == 1 yes Evaluation Count:99 | yes Evaluation Count:149 |
evaluated: lastNode->text.at(0).isSpace() yes Evaluation Count:93 | yes Evaluation Count:6 |
| 6-149 |
523 | | - |
524 | int lastSibling = count() - 2; executed (the execution status of this line is deduced): int lastSibling = count() - 2; | - |
525 | while (lastSibling partially evaluated: lastSibling yes Evaluation Count:147 | no Evaluation Count:0 |
| 0-147 |
526 | && at(lastSibling).parent != lastNode->parent evaluated: at(lastSibling).parent != lastNode->parent yes Evaluation Count:72 | yes Evaluation Count:75 |
| 72-75 |
527 | && at(lastSibling).displayMode == QTextHtmlElement::DisplayInline) { evaluated: at(lastSibling).displayMode == QTextHtmlElement::DisplayInline yes Evaluation Count:54 | yes Evaluation Count:18 |
| 18-54 |
528 | lastSibling = at(lastSibling).parent; executed (the execution status of this line is deduced): lastSibling = at(lastSibling).parent; | - |
529 | } executed: } Execution Count:54 | 54 |
530 | | - |
531 | if (at(lastSibling).displayMode == QTextHtmlElement::DisplayInline) { evaluated: at(lastSibling).displayMode == QTextHtmlElement::DisplayInline yes Evaluation Count:4 | yes Evaluation Count:89 |
| 4-89 |
532 | reuseLastNode = false; executed (the execution status of this line is deduced): reuseLastNode = false; | - |
533 | } else { executed: } Execution Count:4 | 4 |
534 | reuseLastNode = true; executed (the execution status of this line is deduced): reuseLastNode = true; | - |
535 | } executed: } Execution Count:89 | 89 |
536 | } else { | - |
537 | // text node with real (non-whitespace) text -> nothing to re-use | - |
538 | reuseLastNode = false; executed (the execution status of this line is deduced): reuseLastNode = false; | - |
539 | } executed: } Execution Count:155 | 155 |
540 | | - |
541 | } | - |
542 | | - |
543 | } else { | - |
544 | // last node had a proper tag -> nothing to re-use | - |
545 | reuseLastNode = false; executed (the execution status of this line is deduced): reuseLastNode = false; | - |
546 | } executed: } Execution Count:1518 | 1518 |
547 | | - |
548 | if (reuseLastNode) { evaluated: reuseLastNode yes Evaluation Count:612 | yes Evaluation Count:2356 |
| 612-2356 |
549 | newNode = lastNode; executed (the execution status of this line is deduced): newNode = lastNode; | - |
550 | newNode->tag.clear(); executed (the execution status of this line is deduced): newNode->tag.clear(); | - |
551 | newNode->text.clear(); executed (the execution status of this line is deduced): newNode->text.clear(); | - |
552 | newNode->id = Html_unknown; executed (the execution status of this line is deduced): newNode->id = Html_unknown; | - |
553 | } else { executed: } Execution Count:612 | 612 |
554 | nodes.resize(nodes.size() + 1); executed (the execution status of this line is deduced): nodes.resize(nodes.size() + 1); | - |
555 | newNode = &nodes.last(); executed (the execution status of this line is deduced): newNode = &nodes.last(); | - |
556 | } executed: } Execution Count:2356 | 2356 |
557 | | - |
558 | newNode->parent = parent; executed (the execution status of this line is deduced): newNode->parent = parent; | - |
559 | return newNode; executed: return newNode; Execution Count:2968 | 2968 |
560 | } | - |
561 | | - |
562 | void QTextHtmlParser::parse(const QString &text, const QTextDocument *_resourceProvider) | - |
563 | { | - |
564 | nodes.clear(); executed (the execution status of this line is deduced): nodes.clear(); | - |
565 | nodes.resize(1); executed (the execution status of this line is deduced): nodes.resize(1); | - |
566 | txt = text; executed (the execution status of this line is deduced): txt = text; | - |
567 | pos = 0; executed (the execution status of this line is deduced): pos = 0; | - |
568 | len = txt.length(); executed (the execution status of this line is deduced): len = txt.length(); | - |
569 | textEditMode = false; executed (the execution status of this line is deduced): textEditMode = false; | - |
570 | resourceProvider = _resourceProvider; executed (the execution status of this line is deduced): resourceProvider = _resourceProvider; | - |
571 | parse(); executed (the execution status of this line is deduced): parse(); | - |
572 | //dumpHtml(); | - |
573 | } executed: } Execution Count:706 | 706 |
574 | | - |
575 | int QTextHtmlParser::depth(int i) const | - |
576 | { | - |
577 | int depth = 0; executed (the execution status of this line is deduced): int depth = 0; | - |
578 | while (i) { evaluated: i yes Evaluation Count:4295 | yes Evaluation Count:2318 |
| 2318-4295 |
579 | i = at(i).parent; executed (the execution status of this line is deduced): i = at(i).parent; | - |
580 | ++depth; executed (the execution status of this line is deduced): ++depth; | - |
581 | } executed: } Execution Count:4295 | 4295 |
582 | return depth; executed: return depth; Execution Count:2318 | 2318 |
583 | } | - |
584 | | - |
585 | int QTextHtmlParser::margin(int i, int mar) const { | - |
586 | int m = 0; executed (the execution status of this line is deduced): int m = 0; | - |
587 | const QTextHtmlParserNode *node; executed (the execution status of this line is deduced): const QTextHtmlParserNode *node; | - |
588 | if (mar == MarginLeft evaluated: mar == MarginLeft yes Evaluation Count:929 | yes Evaluation Count:929 |
| 929 |
589 | || mar == MarginRight) { partially evaluated: mar == MarginRight yes Evaluation Count:929 | no Evaluation Count:0 |
| 0-929 |
590 | while (i) { evaluated: i yes Evaluation Count:2588 | yes Evaluation Count:1192 |
| 1192-2588 |
591 | node = &at(i); executed (the execution status of this line is deduced): node = &at(i); | - |
592 | if (!node->isBlock() && node->id != Html_table) evaluated: !node->isBlock() yes Evaluation Count:474 | yes Evaluation Count:2114 |
evaluated: node->id != Html_table yes Evaluation Count:320 | yes Evaluation Count:154 |
| 154-2114 |
593 | break; executed: break; Execution Count:320 | 320 |
594 | if (node->isTableCell()) evaluated: node->isTableCell() yes Evaluation Count:346 | yes Evaluation Count:1922 |
| 346-1922 |
595 | break; executed: break; Execution Count:346 | 346 |
596 | m += node->margin[mar]; executed (the execution status of this line is deduced): m += node->margin[mar]; | - |
597 | i = node->parent; executed (the execution status of this line is deduced): i = node->parent; | - |
598 | } executed: } Execution Count:1922 | 1922 |
599 | } executed: } Execution Count:1858 | 1858 |
600 | return m; executed: return m; Execution Count:1858 | 1858 |
601 | } | - |
602 | | - |
603 | int QTextHtmlParser::topMargin(int i) const | - |
604 | { | - |
605 | if (!i) partially evaluated: !i no Evaluation Count:0 | yes Evaluation Count:971 |
| 0-971 |
606 | return 0; never executed: return 0; | 0 |
607 | return at(i).margin[MarginTop]; executed: return at(i).margin[MarginTop]; Execution Count:971 | 971 |
608 | } | - |
609 | | - |
610 | int QTextHtmlParser::bottomMargin(int i) const | - |
611 | { | - |
612 | if (!i) partially evaluated: !i no Evaluation Count:0 | yes Evaluation Count:972 |
| 0-972 |
613 | return 0; never executed: return 0; | 0 |
614 | return at(i).margin[MarginBottom]; executed: return at(i).margin[MarginBottom]; Execution Count:972 | 972 |
615 | } | - |
616 | | - |
617 | void QTextHtmlParser::eatSpace() | - |
618 | { | - |
619 | while (pos < len && txt.at(pos).isSpace() && txt.at(pos) != QChar::ParagraphSeparator) partially evaluated: pos < len yes Evaluation Count:5109 | no Evaluation Count:0 |
evaluated: txt.at(pos).isSpace() yes Evaluation Count:529 | yes Evaluation Count:4580 |
partially evaluated: txt.at(pos) != QChar::ParagraphSeparator yes Evaluation Count:529 | no Evaluation Count:0 |
| 0-5109 |
620 | pos++; executed: pos++; Execution Count:529 | 529 |
621 | } executed: } Execution Count:4580 | 4580 |
622 | | - |
623 | void QTextHtmlParser::parse() | - |
624 | { | - |
625 | while (pos < len) { evaluated: pos < len yes Evaluation Count:307340 | yes Evaluation Count:706 |
| 706-307340 |
626 | QChar c = txt.at(pos++); executed (the execution status of this line is deduced): QChar c = txt.at(pos++); | - |
627 | if (c == QLatin1Char('<')) { evaluated: c == QLatin1Char('<') yes Evaluation Count:2803 | yes Evaluation Count:304537 |
| 2803-304537 |
628 | parseTag(); executed (the execution status of this line is deduced): parseTag(); | - |
629 | } else if (c == QLatin1Char('&')) { executed: } Execution Count:2803 evaluated: c == QLatin1Char('&') yes Evaluation Count:296 | yes Evaluation Count:304241 |
| 296-304241 |
630 | nodes.last().text += parseEntity(); executed (the execution status of this line is deduced): nodes.last().text += parseEntity(); | - |
631 | } else { executed: } Execution Count:296 | 296 |
632 | nodes.last().text += c; executed (the execution status of this line is deduced): nodes.last().text += c; | - |
633 | } executed: } Execution Count:304241 | 304241 |
634 | } | - |
635 | } executed: } Execution Count:706 | 706 |
636 | | - |
637 | // parses a tag after "<" | - |
638 | void QTextHtmlParser::parseTag() | - |
639 | { | - |
640 | eatSpace(); executed (the execution status of this line is deduced): eatSpace(); | - |
641 | | - |
642 | // handle comments and other exclamation mark declarations | - |
643 | if (hasPrefix(QLatin1Char('!'))) { evaluated: hasPrefix(QLatin1Char('!')) yes Evaluation Count:14 | yes Evaluation Count:2789 |
| 14-2789 |
644 | parseExclamationTag(); executed (the execution status of this line is deduced): parseExclamationTag(); | - |
645 | if (nodes.last().wsm != QTextHtmlParserNode::WhiteSpacePre partially evaluated: nodes.last().wsm != QTextHtmlParserNode::WhiteSpacePre yes Evaluation Count:14 | no Evaluation Count:0 |
| 0-14 |
646 | && nodes.last().wsm != QTextHtmlParserNode::WhiteSpacePreWrap partially evaluated: nodes.last().wsm != QTextHtmlParserNode::WhiteSpacePreWrap yes Evaluation Count:14 | no Evaluation Count:0 |
| 0-14 |
647 | && !textEditMode) evaluated: !textEditMode yes Evaluation Count:11 | yes Evaluation Count:3 |
| 3-11 |
648 | eatSpace(); executed: eatSpace(); Execution Count:11 | 11 |
649 | return; executed: return; Execution Count:14 | 14 |
650 | } | - |
651 | | - |
652 | // if close tag just close | - |
653 | if (hasPrefix(QLatin1Char('/'))) { evaluated: hasPrefix(QLatin1Char('/')) yes Evaluation Count:1196 | yes Evaluation Count:1593 |
| 1196-1593 |
654 | if (nodes.last().id == Html_style) { evaluated: nodes.last().id == Html_style yes Evaluation Count:37 | yes Evaluation Count:1159 |
| 37-1159 |
655 | #ifndef QT_NO_CSSPARSER | - |
656 | QCss::Parser parser(nodes.last().text); executed (the execution status of this line is deduced): QCss::Parser parser(nodes.last().text); | - |
657 | QCss::StyleSheet sheet; executed (the execution status of this line is deduced): QCss::StyleSheet sheet; | - |
658 | sheet.origin = QCss::StyleSheetOrigin_Author; executed (the execution status of this line is deduced): sheet.origin = QCss::StyleSheetOrigin_Author; | - |
659 | parser.parse(&sheet, Qt::CaseInsensitive); executed (the execution status of this line is deduced): parser.parse(&sheet, Qt::CaseInsensitive); | - |
660 | inlineStyleSheets.append(sheet); executed (the execution status of this line is deduced): inlineStyleSheets.append(sheet); | - |
661 | resolveStyleSheetImports(sheet); executed (the execution status of this line is deduced): resolveStyleSheetImports(sheet); | - |
662 | #endif | - |
663 | } executed: } Execution Count:37 | 37 |
664 | parseCloseTag(); executed (the execution status of this line is deduced): parseCloseTag(); | - |
665 | return; executed: return; Execution Count:1196 | 1196 |
666 | } | - |
667 | | - |
668 | int p = last(); executed (the execution status of this line is deduced): int p = last(); | - |
669 | while (p && at(p).tag.size() == 0) evaluated: p yes Evaluation Count:1192 | yes Evaluation Count:763 |
evaluated: at(p).tag.size() == 0 yes Evaluation Count:362 | yes Evaluation Count:830 |
| 362-1192 |
670 | p = at(p).parent; executed: p = at(p).parent; Execution Count:362 | 362 |
671 | | - |
672 | QTextHtmlParserNode *node = newNode(p); executed (the execution status of this line is deduced): QTextHtmlParserNode *node = newNode(p); | - |
673 | | - |
674 | // parse tag name | - |
675 | node->tag = parseWord().toLower(); executed (the execution status of this line is deduced): node->tag = parseWord().toLower(); | - |
676 | | - |
677 | const QTextHtmlElement *elem = lookupElementHelper(node->tag); executed (the execution status of this line is deduced): const QTextHtmlElement *elem = lookupElementHelper(node->tag); | - |
678 | if (elem) { evaluated: elem yes Evaluation Count:1581 | yes Evaluation Count:12 |
| 12-1581 |
679 | node->id = elem->id; executed (the execution status of this line is deduced): node->id = elem->id; | - |
680 | node->displayMode = elem->displayMode; executed (the execution status of this line is deduced): node->displayMode = elem->displayMode; | - |
681 | } else { executed: } Execution Count:1581 | 1581 |
682 | node->id = Html_unknown; executed (the execution status of this line is deduced): node->id = Html_unknown; | - |
683 | } executed: } Execution Count:12 | 12 |
684 | | - |
685 | node->attributes.clear(); executed (the execution status of this line is deduced): node->attributes.clear(); | - |
686 | // _need_ at least one space after the tag name, otherwise there can't be attributes | - |
687 | if (pos < len && txt.at(pos).isSpace()) partially evaluated: pos < len yes Evaluation Count:1593 | no Evaluation Count:0 |
evaluated: txt.at(pos).isSpace() yes Evaluation Count:418 | yes Evaluation Count:1175 |
| 0-1593 |
688 | node->attributes = parseAttributes(); executed: node->attributes = parseAttributes(); Execution Count:418 | 418 |
689 | | - |
690 | // resolveParent() may have to change the order in the tree and | - |
691 | // insert intermediate nodes for buggy HTML, so re-initialize the 'node' | - |
692 | // pointer through the return value | - |
693 | node = resolveParent(); executed (the execution status of this line is deduced): node = resolveParent(); | - |
694 | resolveNode(); executed (the execution status of this line is deduced): resolveNode(); | - |
695 | | - |
696 | const int nodeIndex = nodes.count() - 1; // this new node is always the last executed (the execution status of this line is deduced): const int nodeIndex = nodes.count() - 1; | - |
697 | #ifndef QT_NO_CSSPARSER | - |
698 | node->applyCssDeclarations(declarationsForNode(nodeIndex), resourceProvider); executed (the execution status of this line is deduced): node->applyCssDeclarations(declarationsForNode(nodeIndex), resourceProvider); | - |
699 | #endif | - |
700 | applyAttributes(node->attributes); executed (the execution status of this line is deduced): applyAttributes(node->attributes); | - |
701 | | - |
702 | // finish tag | - |
703 | bool tagClosed = false; executed (the execution status of this line is deduced): bool tagClosed = false; | - |
704 | while (pos < len && txt.at(pos) != QLatin1Char('>')) { evaluated: pos < len yes Evaluation Count:1689 | yes Evaluation Count:1 |
evaluated: txt.at(pos) != QLatin1Char('>') yes Evaluation Count:97 | yes Evaluation Count:1592 |
| 1-1689 |
705 | if (txt.at(pos) == QLatin1Char('/')) evaluated: txt.at(pos) == QLatin1Char('/') yes Evaluation Count:81 | yes Evaluation Count:16 |
| 16-81 |
706 | tagClosed = true; executed: tagClosed = true; Execution Count:81 | 81 |
707 | | - |
708 | pos++; executed (the execution status of this line is deduced): pos++; | - |
709 | } executed: } Execution Count:97 | 97 |
710 | pos++; executed (the execution status of this line is deduced): pos++; | - |
711 | | - |
712 | // in a white-space preserving environment strip off a initial newline | - |
713 | // since the element itself already generates a newline | - |
714 | if ((node->wsm == QTextHtmlParserNode::WhiteSpacePre evaluated: node->wsm == QTextHtmlParserNode::WhiteSpacePre yes Evaluation Count:402 | yes Evaluation Count:1191 |
| 402-1191 |
715 | || node->wsm == QTextHtmlParserNode::WhiteSpacePreWrap) evaluated: node->wsm == QTextHtmlParserNode::WhiteSpacePreWrap yes Evaluation Count:44 | yes Evaluation Count:1147 |
| 44-1147 |
716 | && node->isBlock()) { evaluated: node->isBlock() yes Evaluation Count:312 | yes Evaluation Count:134 |
| 134-312 |
717 | if (pos < len - 1 && txt.at(pos) == QLatin1Char('\n')) partially evaluated: pos < len - 1 yes Evaluation Count:312 | no Evaluation Count:0 |
evaluated: txt.at(pos) == QLatin1Char('\n') yes Evaluation Count:8 | yes Evaluation Count:304 |
| 0-312 |
718 | ++pos; executed: ++pos; Execution Count:8 | 8 |
719 | } executed: } Execution Count:312 | 312 |
720 | | - |
721 | if (node->mayNotHaveChildren() || tagClosed) { evaluated: node->mayNotHaveChildren() yes Evaluation Count:175 | yes Evaluation Count:1418 |
evaluated: tagClosed yes Evaluation Count:15 | yes Evaluation Count:1403 |
| 15-1418 |
722 | newNode(node->parent); executed (the execution status of this line is deduced): newNode(node->parent); | - |
723 | resolveNode(); executed (the execution status of this line is deduced): resolveNode(); | - |
724 | } executed: } Execution Count:190 | 190 |
725 | } executed: } Execution Count:1593 | 1593 |
726 | | - |
727 | // parses a tag beginning with "/" | - |
728 | void QTextHtmlParser::parseCloseTag() | - |
729 | { | - |
730 | ++pos; executed (the execution status of this line is deduced): ++pos; | - |
731 | QString tag = parseWord().toLower().trimmed(); executed (the execution status of this line is deduced): QString tag = parseWord().toLower().trimmed(); | - |
732 | while (pos < len) { evaluated: pos < len yes Evaluation Count:1195 | yes Evaluation Count:1 |
| 1-1195 |
733 | QChar c = txt.at(pos++); executed (the execution status of this line is deduced): QChar c = txt.at(pos++); | - |
734 | if (c == QLatin1Char('>')) partially evaluated: c == QLatin1Char('>') yes Evaluation Count:1195 | no Evaluation Count:0 |
| 0-1195 |
735 | break; executed: break; Execution Count:1195 | 1195 |
736 | } | 0 |
737 | | - |
738 | // find corresponding open node | - |
739 | int p = last(); executed (the execution status of this line is deduced): int p = last(); | - |
740 | if (p > 0 partially evaluated: p > 0 yes Evaluation Count:1196 | no Evaluation Count:0 |
| 0-1196 |
741 | && at(p - 1).tag == tag evaluated: at(p - 1).tag == tag yes Evaluation Count:93 | yes Evaluation Count:1103 |
| 93-1103 |
742 | && at(p - 1).mayNotHaveChildren()) evaluated: at(p - 1).mayNotHaveChildren() yes Evaluation Count:2 | yes Evaluation Count:91 |
| 2-91 |
743 | p--; executed: p--; Execution Count:2 | 2 |
744 | | - |
745 | while (p && at(p).tag != tag) evaluated: p yes Evaluation Count:1644 | yes Evaluation Count:11 |
evaluated: at(p).tag != tag yes Evaluation Count:459 | yes Evaluation Count:1185 |
| 11-1644 |
746 | p = at(p).parent; executed: p = at(p).parent; Execution Count:459 | 459 |
747 | | - |
748 | // simply ignore the tag if we can't find | - |
749 | // a corresponding open node, for broken | - |
750 | // html such as <font>blah</font></font> | - |
751 | if (!p) evaluated: !p yes Evaluation Count:11 | yes Evaluation Count:1185 |
| 11-1185 |
752 | return; executed: return; Execution Count:11 | 11 |
753 | | - |
754 | // in a white-space preserving environment strip off a trailing newline | - |
755 | // since the closing of the opening block element will automatically result | - |
756 | // in a new block for elements following the <pre> | - |
757 | // ...foo\n</pre><p>blah -> foo</pre><p>blah | - |
758 | if ((at(p).wsm == QTextHtmlParserNode::WhiteSpacePre evaluated: at(p).wsm == QTextHtmlParserNode::WhiteSpacePre yes Evaluation Count:271 | yes Evaluation Count:914 |
| 271-914 |
759 | || at(p).wsm == QTextHtmlParserNode::WhiteSpacePreWrap) evaluated: at(p).wsm == QTextHtmlParserNode::WhiteSpacePreWrap yes Evaluation Count:44 | yes Evaluation Count:870 |
| 44-870 |
760 | && at(p).isBlock()) { evaluated: at(p).isBlock() yes Evaluation Count:308 | yes Evaluation Count:7 |
| 7-308 |
761 | if (at(last()).text.endsWith(QLatin1Char('\n'))) evaluated: at(last()).text.endsWith(QLatin1Char('\n')) yes Evaluation Count:7 | yes Evaluation Count:301 |
| 7-301 |
762 | nodes[last()].text.chop(1); executed: nodes[last()].text.chop(1); Execution Count:7 | 7 |
763 | } executed: } Execution Count:308 | 308 |
764 | | - |
765 | newNode(at(p).parent); executed (the execution status of this line is deduced): newNode(at(p).parent); | - |
766 | resolveNode(); executed (the execution status of this line is deduced): resolveNode(); | - |
767 | } executed: } Execution Count:1185 | 1185 |
768 | | - |
769 | // parses a tag beginning with "!" | - |
770 | void QTextHtmlParser::parseExclamationTag() | - |
771 | { | - |
772 | ++pos; executed (the execution status of this line is deduced): ++pos; | - |
773 | if (hasPrefix(QLatin1Char('-'),1) && hasPrefix(QLatin1Char('-'),2)) { evaluated: hasPrefix(QLatin1Char('-'),1) yes Evaluation Count:6 | yes Evaluation Count:8 |
partially evaluated: hasPrefix(QLatin1Char('-'),2) yes Evaluation Count:6 | no Evaluation Count:0 |
| 0-8 |
774 | pos += 3; executed (the execution status of this line is deduced): pos += 3; | - |
775 | // eat comments | - |
776 | int end = txt.indexOf(QLatin1String("-->"), pos); executed (the execution status of this line is deduced): int end = txt.indexOf(QLatin1String("-->"), pos); | - |
777 | pos = (end >= 0 ? end + 3 : len); partially evaluated: end >= 0 yes Evaluation Count:6 | no Evaluation Count:0 |
| 0-6 |
778 | } else { executed: } Execution Count:6 | 6 |
779 | // eat internal tags | - |
780 | while (pos < len) { partially evaluated: pos < len yes Evaluation Count:736 | no Evaluation Count:0 |
| 0-736 |
781 | QChar c = txt.at(pos++); executed (the execution status of this line is deduced): QChar c = txt.at(pos++); | - |
782 | if (c == QLatin1Char('>')) evaluated: c == QLatin1Char('>') yes Evaluation Count:8 | yes Evaluation Count:728 |
| 8-728 |
783 | break; executed: break; Execution Count:8 | 8 |
784 | } executed: } Execution Count:728 | 728 |
785 | } executed: } Execution Count:8 | 8 |
786 | } | - |
787 | | - |
788 | // parses an entity after "&", and returns it | - |
789 | QString QTextHtmlParser::parseEntity() | - |
790 | { | - |
791 | int recover = pos; executed (the execution status of this line is deduced): int recover = pos; | - |
792 | QString entity; executed (the execution status of this line is deduced): QString entity; | - |
793 | while (pos < len) { partially evaluated: pos < len yes Evaluation Count:1633 | no Evaluation Count:0 |
| 0-1633 |
794 | QChar c = txt.at(pos++); executed (the execution status of this line is deduced): QChar c = txt.at(pos++); | - |
795 | if (c.isSpace() || pos - recover > 9) { partially evaluated: c.isSpace() no Evaluation Count:0 | yes Evaluation Count:1633 |
partially evaluated: pos - recover > 9 no Evaluation Count:0 | yes Evaluation Count:1633 |
| 0-1633 |
796 | goto error; never executed: goto error; | 0 |
797 | } | - |
798 | if (c == QLatin1Char(';')) evaluated: c == QLatin1Char(';') yes Evaluation Count:296 | yes Evaluation Count:1337 |
| 296-1337 |
799 | break; executed: break; Execution Count:296 | 296 |
800 | entity += c; executed (the execution status of this line is deduced): entity += c; | - |
801 | } executed: } Execution Count:1337 | 1337 |
802 | { | - |
803 | QChar resolved = resolveEntity(entity); executed (the execution status of this line is deduced): QChar resolved = resolveEntity(entity); | - |
804 | if (!resolved.isNull()) evaluated: !resolved.isNull() yes Evaluation Count:262 | yes Evaluation Count:34 |
| 34-262 |
805 | return QString(resolved); executed: return QString(resolved); Execution Count:262 | 262 |
806 | } | - |
807 | if (entity.length() > 1 && entity.at(0) == QLatin1Char('#')) { partially evaluated: entity.length() > 1 yes Evaluation Count:34 | no Evaluation Count:0 |
partially evaluated: entity.at(0) == QLatin1Char('#') yes Evaluation Count:34 | no Evaluation Count:0 |
| 0-34 |
808 | entity.remove(0, 1); // removing leading # executed (the execution status of this line is deduced): entity.remove(0, 1); | - |
809 | | - |
810 | int base = 10; executed (the execution status of this line is deduced): int base = 10; | - |
811 | bool ok = false; executed (the execution status of this line is deduced): bool ok = false; | - |
812 | | - |
813 | if (entity.at(0).toLower() == QLatin1Char('x')) { // hex entity? evaluated: entity.at(0).toLower() == QLatin1Char('x') yes Evaluation Count:1 | yes Evaluation Count:33 |
| 1-33 |
814 | entity.remove(0, 1); executed (the execution status of this line is deduced): entity.remove(0, 1); | - |
815 | base = 16; executed (the execution status of this line is deduced): base = 16; | - |
816 | } executed: } Execution Count:1 | 1 |
817 | | - |
818 | uint uc = entity.toUInt(&ok, base); executed (the execution status of this line is deduced): uint uc = entity.toUInt(&ok, base); | - |
819 | if (ok) { partially evaluated: ok yes Evaluation Count:34 | no Evaluation Count:0 |
| 0-34 |
820 | if (uc >= 0x80 && uc < 0x80 + (sizeof(windowsLatin1ExtendedCharacters)/sizeof(windowsLatin1ExtendedCharacters[0]))) evaluated: uc >= 0x80 yes Evaluation Count:32 | yes Evaluation Count:2 |
partially evaluated: uc < 0x80 + (sizeof(windowsLatin1ExtendedCharacters)/sizeof(windowsLatin1ExtendedCharacters[0])) yes Evaluation Count:32 | no Evaluation Count:0 |
| 0-32 |
821 | uc = windowsLatin1ExtendedCharacters[uc - 0x80]; executed: uc = windowsLatin1ExtendedCharacters[uc - 0x80]; Execution Count:32 | 32 |
822 | QString str; executed (the execution status of this line is deduced): QString str; | - |
823 | if (QChar::requiresSurrogates(uc)) { partially evaluated: QChar::requiresSurrogates(uc) no Evaluation Count:0 | yes Evaluation Count:34 |
| 0-34 |
824 | str += QChar(QChar::highSurrogate(uc)); never executed (the execution status of this line is deduced): str += QChar(QChar::highSurrogate(uc)); | - |
825 | str += QChar(QChar::lowSurrogate(uc)); never executed (the execution status of this line is deduced): str += QChar(QChar::lowSurrogate(uc)); | - |
826 | } else { | 0 |
827 | str = QChar(uc); executed (the execution status of this line is deduced): str = QChar(uc); | - |
828 | } executed: } Execution Count:34 | 34 |
829 | return str; executed: return str; Execution Count:34 | 34 |
830 | } | - |
831 | } | 0 |
832 | error: code before this statement never executed: error: | 0 |
833 | pos = recover; never executed (the execution status of this line is deduced): pos = recover; | - |
834 | return QLatin1String("&"); never executed: return QLatin1String("&"); | 0 |
835 | } | - |
836 | | - |
837 | // parses one word, possibly quoted, and returns it | - |
838 | QString QTextHtmlParser::parseWord() | - |
839 | { | - |
840 | QString word; executed (the execution status of this line is deduced): QString word; | - |
841 | if (hasPrefix(QLatin1Char('\"'))) { // double quotes evaluated: hasPrefix(QLatin1Char('\"')) yes Evaluation Count:363 | yes Evaluation Count:3323 |
| 363-3323 |
842 | ++pos; executed (the execution status of this line is deduced): ++pos; | - |
843 | while (pos < len) { partially evaluated: pos < len yes Evaluation Count:10000 | no Evaluation Count:0 |
| 0-10000 |
844 | QChar c = txt.at(pos++); executed (the execution status of this line is deduced): QChar c = txt.at(pos++); | - |
845 | if (c == QLatin1Char('\"')) evaluated: c == QLatin1Char('\"') yes Evaluation Count:363 | yes Evaluation Count:9637 |
| 363-9637 |
846 | break; executed: break; Execution Count:363 | 363 |
847 | else if (c == QLatin1Char('&')) partially evaluated: c == QLatin1Char('&') no Evaluation Count:0 | yes Evaluation Count:9637 |
| 0-9637 |
848 | word += parseEntity(); never executed: word += parseEntity(); | 0 |
849 | else | - |
850 | word += c; executed: word += c; Execution Count:9637 | 9637 |
851 | } | - |
852 | } else if (hasPrefix(QLatin1Char('\''))) { // single quotes executed: } Execution Count:363 evaluated: hasPrefix(QLatin1Char('\'')) yes Evaluation Count:21 | yes Evaluation Count:3302 |
| 21-3302 |
853 | ++pos; executed (the execution status of this line is deduced): ++pos; | - |
854 | while (pos < len) { partially evaluated: pos < len yes Evaluation Count:465 | no Evaluation Count:0 |
| 0-465 |
855 | QChar c = txt.at(pos++); executed (the execution status of this line is deduced): QChar c = txt.at(pos++); | - |
856 | if (c == QLatin1Char('\'')) evaluated: c == QLatin1Char('\'') yes Evaluation Count:21 | yes Evaluation Count:444 |
| 21-444 |
857 | break; executed: break; Execution Count:21 | 21 |
858 | else | - |
859 | word += c; executed: word += c; Execution Count:444 | 444 |
860 | } | - |
861 | } else { // normal text executed: } Execution Count:21 | 21 |
862 | while (pos < len) { evaluated: pos < len yes Evaluation Count:13135 | yes Evaluation Count:1 |
| 1-13135 |
863 | QChar c = txt.at(pos++); executed (the execution status of this line is deduced): QChar c = txt.at(pos++); | - |
864 | if (c == QLatin1Char('>') evaluated: c == QLatin1Char('>') yes Evaluation Count:2400 | yes Evaluation Count:10735 |
| 2400-10735 |
865 | || (c == QLatin1Char('/') && hasPrefix(QLatin1Char('>'), 1)) evaluated: c == QLatin1Char('/') yes Evaluation Count:10 | yes Evaluation Count:10725 |
partially evaluated: hasPrefix(QLatin1Char('>'), 1) yes Evaluation Count:10 | no Evaluation Count:0 |
| 0-10725 |
866 | || c == QLatin1Char('<') evaluated: c == QLatin1Char('<') yes Evaluation Count:2 | yes Evaluation Count:10723 |
| 2-10723 |
867 | || c == QLatin1Char('=') evaluated: c == QLatin1Char('=') yes Evaluation Count:446 | yes Evaluation Count:10277 |
| 446-10277 |
868 | || c.isSpace()) { evaluated: c.isSpace() yes Evaluation Count:443 | yes Evaluation Count:9834 |
| 443-9834 |
869 | --pos; executed (the execution status of this line is deduced): --pos; | - |
870 | break; executed: break; Execution Count:3301 | 3301 |
871 | } | - |
872 | if (c == QLatin1Char('&')) partially evaluated: c == QLatin1Char('&') no Evaluation Count:0 | yes Evaluation Count:9834 |
| 0-9834 |
873 | word += parseEntity(); never executed: word += parseEntity(); | 0 |
874 | else | - |
875 | word += c; executed: word += c; Execution Count:9834 | 9834 |
876 | } | - |
877 | } executed: } Execution Count:3302 | 3302 |
878 | return word; executed: return word; Execution Count:3686 | 3686 |
879 | } | - |
880 | | - |
881 | // gives the new node the right parent | - |
882 | QTextHtmlParserNode *QTextHtmlParser::resolveParent() | - |
883 | { | - |
884 | QTextHtmlParserNode *node = &nodes.last(); executed (the execution status of this line is deduced): QTextHtmlParserNode *node = &nodes.last(); | - |
885 | | - |
886 | int p = node->parent; executed (the execution status of this line is deduced): int p = node->parent; | - |
887 | | - |
888 | // Excel gives us buggy HTML with just tr without surrounding table tags | - |
889 | // or with just td tags | - |
890 | | - |
891 | if (node->id == Html_td) { evaluated: node->id == Html_td yes Evaluation Count:153 | yes Evaluation Count:1440 |
| 153-1440 |
892 | int n = p; executed (the execution status of this line is deduced): int n = p; | - |
893 | while (n && at(n).id != Html_tr) evaluated: n yes Evaluation Count:160 | yes Evaluation Count:3 |
evaluated: at(n).id != Html_tr yes Evaluation Count:10 | yes Evaluation Count:150 |
| 3-160 |
894 | n = at(n).parent; executed: n = at(n).parent; Execution Count:10 | 10 |
895 | | - |
896 | if (!n) { evaluated: !n yes Evaluation Count:3 | yes Evaluation Count:150 |
| 3-150 |
897 | nodes.insert(nodes.count() - 1, QTextHtmlParserNode()); executed (the execution status of this line is deduced): nodes.insert(nodes.count() - 1, QTextHtmlParserNode()); | - |
898 | nodes.insert(nodes.count() - 1, QTextHtmlParserNode()); executed (the execution status of this line is deduced): nodes.insert(nodes.count() - 1, QTextHtmlParserNode()); | - |
899 | | - |
900 | QTextHtmlParserNode *table = &nodes[nodes.count() - 3]; executed (the execution status of this line is deduced): QTextHtmlParserNode *table = &nodes[nodes.count() - 3]; | - |
901 | table->parent = p; executed (the execution status of this line is deduced): table->parent = p; | - |
902 | table->id = Html_table; executed (the execution status of this line is deduced): table->id = Html_table; | - |
903 | table->tag = QLatin1String("table"); executed (the execution status of this line is deduced): table->tag = QLatin1String("table"); | - |
904 | table->children.append(nodes.count() - 2); // add row as child executed (the execution status of this line is deduced): table->children.append(nodes.count() - 2); | - |
905 | | - |
906 | QTextHtmlParserNode *row = &nodes[nodes.count() - 2]; executed (the execution status of this line is deduced): QTextHtmlParserNode *row = &nodes[nodes.count() - 2]; | - |
907 | row->parent = nodes.count() - 3; // table as parent executed (the execution status of this line is deduced): row->parent = nodes.count() - 3; | - |
908 | row->id = Html_tr; executed (the execution status of this line is deduced): row->id = Html_tr; | - |
909 | row->tag = QLatin1String("tr"); executed (the execution status of this line is deduced): row->tag = QLatin1String("tr"); | - |
910 | | - |
911 | p = nodes.count() - 2; executed (the execution status of this line is deduced): p = nodes.count() - 2; | - |
912 | node = &nodes.last(); // re-initialize pointer executed (the execution status of this line is deduced): node = &nodes.last(); | - |
913 | } executed: } Execution Count:3 | 3 |
914 | } executed: } Execution Count:153 | 153 |
915 | | - |
916 | if (node->id == Html_tr) { evaluated: node->id == Html_tr yes Evaluation Count:101 | yes Evaluation Count:1492 |
| 101-1492 |
917 | int n = p; executed (the execution status of this line is deduced): int n = p; | - |
918 | while (n && at(n).id != Html_table) evaluated: n yes Evaluation Count:111 | yes Evaluation Count:2 |
evaluated: at(n).id != Html_table yes Evaluation Count:12 | yes Evaluation Count:99 |
| 2-111 |
919 | n = at(n).parent; executed: n = at(n).parent; Execution Count:12 | 12 |
920 | | - |
921 | if (!n) { evaluated: !n yes Evaluation Count:2 | yes Evaluation Count:99 |
| 2-99 |
922 | nodes.insert(nodes.count() - 1, QTextHtmlParserNode()); executed (the execution status of this line is deduced): nodes.insert(nodes.count() - 1, QTextHtmlParserNode()); | - |
923 | QTextHtmlParserNode *table = &nodes[nodes.count() - 2]; executed (the execution status of this line is deduced): QTextHtmlParserNode *table = &nodes[nodes.count() - 2]; | - |
924 | table->parent = p; executed (the execution status of this line is deduced): table->parent = p; | - |
925 | table->id = Html_table; executed (the execution status of this line is deduced): table->id = Html_table; | - |
926 | table->tag = QLatin1String("table"); executed (the execution status of this line is deduced): table->tag = QLatin1String("table"); | - |
927 | p = nodes.count() - 2; executed (the execution status of this line is deduced): p = nodes.count() - 2; | - |
928 | node = &nodes.last(); // re-initialize pointer executed (the execution status of this line is deduced): node = &nodes.last(); | - |
929 | } executed: } Execution Count:2 | 2 |
930 | } executed: } Execution Count:101 | 101 |
931 | | - |
932 | // permit invalid html by letting block elements be children | - |
933 | // of inline elements with the exception of paragraphs: | - |
934 | // | - |
935 | // a new paragraph closes parent inline elements (while loop), | - |
936 | // unless they themselves are children of a non-paragraph block | - |
937 | // element (if statement) | - |
938 | // | - |
939 | // For example: | - |
940 | // | - |
941 | // <body><p><b>Foo<p>Bar <-- second <p> implicitly closes <b> that | - |
942 | // belongs to the first <p>. The self-nesting | - |
943 | // check further down prevents the second <p> | - |
944 | // from nesting into the first one then. | - |
945 | // so Bar is not bold. | - |
946 | // | - |
947 | // <body><b><p>Foo <-- Foo should be bold. | - |
948 | // | - |
949 | // <body><b><p>Foo<p>Bar <-- Foo and Bar should be bold. | - |
950 | // | - |
951 | if (node->id == Html_p) { evaluated: node->id == Html_p yes Evaluation Count:247 | yes Evaluation Count:1346 |
| 247-1346 |
952 | while (p && !at(p).isBlock()) evaluated: p yes Evaluation Count:95 | yes Evaluation Count:162 |
evaluated: !at(p).isBlock() yes Evaluation Count:10 | yes Evaluation Count:85 |
| 10-162 |
953 | p = at(p).parent; executed: p = at(p).parent; Execution Count:10 | 10 |
954 | | - |
955 | if (!p || at(p).id != Html_p) evaluated: !p yes Evaluation Count:162 | yes Evaluation Count:85 |
evaluated: at(p).id != Html_p yes Evaluation Count:59 | yes Evaluation Count:26 |
| 26-162 |
956 | p = node->parent; executed: p = node->parent; Execution Count:221 | 221 |
957 | } executed: } Execution Count:247 | 247 |
958 | | - |
959 | // some elements are not self nesting | - |
960 | if (node->id == at(p).id evaluated: node->id == at(p).id yes Evaluation Count:58 | yes Evaluation Count:1535 |
| 58-1535 |
961 | && node->isNotSelfNesting()) evaluated: node->isNotSelfNesting() yes Evaluation Count:27 | yes Evaluation Count:31 |
| 27-31 |
962 | p = at(p).parent; executed: p = at(p).parent; Execution Count:27 | 27 |
963 | | - |
964 | // some elements are not allowed in certain contexts | - |
965 | while ((p && !node->allowedInContext(at(p).id)) evaluated: p yes Evaluation Count:839 | yes Evaluation Count:780 |
evaluated: !node->allowedInContext(at(p).id) yes Evaluation Count:26 | yes Evaluation Count:813 |
| 26-839 |
966 | // ### make new styles aware of empty tags executed (the execution status of this line is deduced):
| - |
967 | || at(p).mayNotHaveChildren() partially evaluated: at(p).mayNotHaveChildren() no Evaluation Count:0 | yes Evaluation Count:1593 |
| 0-1593 |
968 | ) { | - |
969 | p = at(p).parent; executed (the execution status of this line is deduced): p = at(p).parent; | - |
970 | } executed: } Execution Count:26 | 26 |
971 | | - |
972 | node->parent = p; executed (the execution status of this line is deduced): node->parent = p; | - |
973 | | - |
974 | // makes it easier to traverse the tree, later | - |
975 | nodes[p].children.append(nodes.count() - 1); executed (the execution status of this line is deduced): nodes[p].children.append(nodes.count() - 1); | - |
976 | return node; executed: return node; Execution Count:1593 | 1593 |
977 | } | - |
978 | | - |
979 | // sets all properties on the new node | - |
980 | void QTextHtmlParser::resolveNode() | - |
981 | { | - |
982 | QTextHtmlParserNode *node = &nodes.last(); executed (the execution status of this line is deduced): QTextHtmlParserNode *node = &nodes.last(); | - |
983 | const QTextHtmlParserNode *parent = &nodes.at(node->parent); executed (the execution status of this line is deduced): const QTextHtmlParserNode *parent = &nodes.at(node->parent); | - |
984 | node->initializeProperties(parent, this); executed (the execution status of this line is deduced): node->initializeProperties(parent, this); | - |
985 | } executed: } Execution Count:2968 | 2968 |
986 | | - |
987 | bool QTextHtmlParserNode::isNestedList(const QTextHtmlParser *parser) const | - |
988 | { | - |
989 | if (!isListStart()) partially evaluated: !isListStart() no Evaluation Count:0 | yes Evaluation Count:40 |
| 0-40 |
990 | return false; never executed: return false; | 0 |
991 | | - |
992 | int p = parent; executed (the execution status of this line is deduced): int p = parent; | - |
993 | while (p) { evaluated: p yes Evaluation Count:24 | yes Evaluation Count:32 |
| 24-32 |
994 | if (parser->at(p).isListStart()) evaluated: parser->at(p).isListStart() yes Evaluation Count:8 | yes Evaluation Count:16 |
| 8-16 |
995 | return true; executed: return true; Execution Count:8 | 8 |
996 | p = parser->at(p).parent; executed (the execution status of this line is deduced): p = parser->at(p).parent; | - |
997 | } executed: } Execution Count:16 | 16 |
998 | return false; executed: return false; Execution Count:32 | 32 |
999 | } | - |
1000 | | - |
1001 | void QTextHtmlParserNode::initializeProperties(const QTextHtmlParserNode *parent, const QTextHtmlParser *parser) | - |
1002 | { | - |
1003 | // inherit properties from parent element | - |
1004 | charFormat = parent->charFormat; executed (the execution status of this line is deduced): charFormat = parent->charFormat; | - |
1005 | | - |
1006 | if (id == Html_html) evaluated: id == Html_html yes Evaluation Count:64 | yes Evaluation Count:2904 |
| 64-2904 |
1007 | blockFormat.setLayoutDirection(Qt::LeftToRight); // HTML default executed: blockFormat.setLayoutDirection(Qt::LeftToRight); Execution Count:64 | 64 |
1008 | else if (parent->blockFormat.hasProperty(QTextFormat::LayoutDirection)) evaluated: parent->blockFormat.hasProperty(QTextFormat::LayoutDirection) yes Evaluation Count:800 | yes Evaluation Count:2104 |
| 800-2104 |
1009 | blockFormat.setLayoutDirection(parent->blockFormat.layoutDirection()); executed: blockFormat.setLayoutDirection(parent->blockFormat.layoutDirection()); Execution Count:800 | 800 |
1010 | | - |
1011 | if (parent->displayMode == QTextHtmlElement::DisplayNone) evaluated: parent->displayMode == QTextHtmlElement::DisplayNone yes Evaluation Count:71 | yes Evaluation Count:2897 |
| 71-2897 |
1012 | displayMode = QTextHtmlElement::DisplayNone; executed: displayMode = QTextHtmlElement::DisplayNone; Execution Count:71 | 71 |
1013 | | - |
1014 | if (parent->id != Html_table || id == Html_caption) { evaluated: parent->id != Html_table yes Evaluation Count:2768 | yes Evaluation Count:200 |
evaluated: id == Html_caption yes Evaluation Count:1 | yes Evaluation Count:199 |
| 1-2768 |
1015 | if (parent->blockFormat.hasProperty(QTextFormat::BlockAlignment)) evaluated: parent->blockFormat.hasProperty(QTextFormat::BlockAlignment) yes Evaluation Count:52 | yes Evaluation Count:2717 |
| 52-2717 |
1016 | blockFormat.setAlignment(parent->blockFormat.alignment()); executed: blockFormat.setAlignment(parent->blockFormat.alignment()); Execution Count:52 | 52 |
1017 | else | - |
1018 | blockFormat.clearProperty(QTextFormat::BlockAlignment); executed: blockFormat.clearProperty(QTextFormat::BlockAlignment); Execution Count:2717 | 2717 |
1019 | } | - |
1020 | // we don't paint per-row background colors, yet. so as an | - |
1021 | // exception inherit the background color here | - |
1022 | // we also inherit the background between inline elements | - |
1023 | if ((parent->id != Html_tr || !isTableCell()) evaluated: parent->id != Html_tr yes Evaluation Count:2677 | yes Evaluation Count:291 |
evaluated: !isTableCell() yes Evaluation Count:133 | yes Evaluation Count:158 |
| 133-2677 |
1024 | && (displayMode != QTextHtmlElement::DisplayInline || parent->displayMode != QTextHtmlElement::DisplayInline)) { evaluated: displayMode != QTextHtmlElement::DisplayInline yes Evaluation Count:1087 | yes Evaluation Count:1723 |
evaluated: parent->displayMode != QTextHtmlElement::DisplayInline yes Evaluation Count:601 | yes Evaluation Count:1122 |
| 601-1723 |
1025 | charFormat.clearProperty(QTextFormat::BackgroundBrush); executed (the execution status of this line is deduced): charFormat.clearProperty(QTextFormat::BackgroundBrush); | - |
1026 | } executed: } Execution Count:1688 | 1688 |
1027 | | - |
1028 | listStyle = parent->listStyle; executed (the execution status of this line is deduced): listStyle = parent->listStyle; | - |
1029 | // makes no sense to inherit that property, a named anchor is a single point | - |
1030 | // in the document, which is set by the DocumentFragment | - |
1031 | charFormat.clearProperty(QTextFormat::AnchorName); executed (the execution status of this line is deduced): charFormat.clearProperty(QTextFormat::AnchorName); | - |
1032 | wsm = parent->wsm; executed (the execution status of this line is deduced): wsm = parent->wsm; | - |
1033 | | - |
1034 | // initialize remaining properties | - |
1035 | margin[QTextHtmlParser::MarginLeft] = 0; executed (the execution status of this line is deduced): margin[QTextHtmlParser::MarginLeft] = 0; | - |
1036 | margin[QTextHtmlParser::MarginRight] = 0; executed (the execution status of this line is deduced): margin[QTextHtmlParser::MarginRight] = 0; | - |
1037 | margin[QTextHtmlParser::MarginTop] = 0; executed (the execution status of this line is deduced): margin[QTextHtmlParser::MarginTop] = 0; | - |
1038 | margin[QTextHtmlParser::MarginBottom] = 0; executed (the execution status of this line is deduced): margin[QTextHtmlParser::MarginBottom] = 0; | - |
1039 | cssFloat = QTextFrameFormat::InFlow; executed (the execution status of this line is deduced): cssFloat = QTextFrameFormat::InFlow; | - |
1040 | | - |
1041 | for (int i = 0; i < 4; ++i) evaluated: i < 4 yes Evaluation Count:11872 | yes Evaluation Count:2968 |
| 2968-11872 |
1042 | padding[i] = -1; executed: padding[i] = -1; Execution Count:11872 | 11872 |
1043 | | - |
1044 | // set element specific attributes | - |
1045 | switch (id) { | - |
1046 | case Html_a: | - |
1047 | charFormat.setAnchor(true); executed (the execution status of this line is deduced): charFormat.setAnchor(true); | - |
1048 | for (int i = 0; i < attributes.count(); i += 2) { evaluated: i < attributes.count() yes Evaluation Count:67 | yes Evaluation Count:67 |
| 67 |
1049 | const QString key = attributes.at(i); executed (the execution status of this line is deduced): const QString key = attributes.at(i); | - |
1050 | if (key.compare(QLatin1String("href"), Qt::CaseInsensitive) == 0 evaluated: key.compare(QLatin1String("href"), Qt::CaseInsensitive) == 0 yes Evaluation Count:46 | yes Evaluation Count:21 |
| 21-46 |
1051 | && !attributes.at(i + 1).isEmpty()) { partially evaluated: !attributes.at(i + 1).isEmpty() yes Evaluation Count:46 | no Evaluation Count:0 |
| 0-46 |
1052 | hasHref = true; executed (the execution status of this line is deduced): hasHref = true; | - |
1053 | charFormat.setUnderlineStyle(QTextCharFormat::SingleUnderline); executed (the execution status of this line is deduced): charFormat.setUnderlineStyle(QTextCharFormat::SingleUnderline); | - |
1054 | charFormat.setForeground(Qt::blue); executed (the execution status of this line is deduced): charFormat.setForeground(Qt::blue); | - |
1055 | } executed: } Execution Count:46 | 46 |
1056 | } executed: } Execution Count:67 | 67 |
1057 | | - |
1058 | break; executed: break; Execution Count:67 | 67 |
1059 | case Html_em: | - |
1060 | case Html_i: | - |
1061 | case Html_cite: | - |
1062 | case Html_address: | - |
1063 | case Html_var: | - |
1064 | case Html_dfn: | - |
1065 | charFormat.setFontItalic(true); executed (the execution status of this line is deduced): charFormat.setFontItalic(true); | - |
1066 | break; executed: break; Execution Count:6 | 6 |
1067 | case Html_big: | - |
1068 | charFormat.setProperty(QTextFormat::FontSizeAdjustment, int(1)); never executed (the execution status of this line is deduced): charFormat.setProperty(QTextFormat::FontSizeAdjustment, int(1)); | - |
1069 | break; | 0 |
1070 | case Html_small: | - |
1071 | charFormat.setProperty(QTextFormat::FontSizeAdjustment, int(-1)); never executed (the execution status of this line is deduced): charFormat.setProperty(QTextFormat::FontSizeAdjustment, int(-1)); | - |
1072 | break; | 0 |
1073 | case Html_strong: | - |
1074 | case Html_b: | - |
1075 | charFormat.setFontWeight(QFont::Bold); executed (the execution status of this line is deduced): charFormat.setFontWeight(QFont::Bold); | - |
1076 | break; executed: break; Execution Count:36 | 36 |
1077 | case Html_h1: | - |
1078 | charFormat.setFontWeight(QFont::Bold); executed (the execution status of this line is deduced): charFormat.setFontWeight(QFont::Bold); | - |
1079 | charFormat.setProperty(QTextFormat::FontSizeAdjustment, int(3)); executed (the execution status of this line is deduced): charFormat.setProperty(QTextFormat::FontSizeAdjustment, int(3)); | - |
1080 | margin[QTextHtmlParser::MarginTop] = 18; executed (the execution status of this line is deduced): margin[QTextHtmlParser::MarginTop] = 18; | - |
1081 | margin[QTextHtmlParser::MarginBottom] = 12; executed (the execution status of this line is deduced): margin[QTextHtmlParser::MarginBottom] = 12; | - |
1082 | break; executed: break; Execution Count:3 | 3 |
1083 | case Html_h2: | - |
1084 | charFormat.setFontWeight(QFont::Bold); never executed (the execution status of this line is deduced): charFormat.setFontWeight(QFont::Bold); | - |
1085 | charFormat.setProperty(QTextFormat::FontSizeAdjustment, int(2)); never executed (the execution status of this line is deduced): charFormat.setProperty(QTextFormat::FontSizeAdjustment, int(2)); | - |
1086 | margin[QTextHtmlParser::MarginTop] = 16; never executed (the execution status of this line is deduced): margin[QTextHtmlParser::MarginTop] = 16; | - |
1087 | margin[QTextHtmlParser::MarginBottom] = 12; never executed (the execution status of this line is deduced): margin[QTextHtmlParser::MarginBottom] = 12; | - |
1088 | break; | 0 |
1089 | case Html_h3: | - |
1090 | charFormat.setFontWeight(QFont::Bold); executed (the execution status of this line is deduced): charFormat.setFontWeight(QFont::Bold); | - |
1091 | charFormat.setProperty(QTextFormat::FontSizeAdjustment, int(1)); executed (the execution status of this line is deduced): charFormat.setProperty(QTextFormat::FontSizeAdjustment, int(1)); | - |
1092 | margin[QTextHtmlParser::MarginTop] = 14; executed (the execution status of this line is deduced): margin[QTextHtmlParser::MarginTop] = 14; | - |
1093 | margin[QTextHtmlParser::MarginBottom] = 12; executed (the execution status of this line is deduced): margin[QTextHtmlParser::MarginBottom] = 12; | - |
1094 | break; executed: break; Execution Count:1 | 1 |
1095 | case Html_h4: | - |
1096 | charFormat.setFontWeight(QFont::Bold); executed (the execution status of this line is deduced): charFormat.setFontWeight(QFont::Bold); | - |
1097 | charFormat.setProperty(QTextFormat::FontSizeAdjustment, int(0)); executed (the execution status of this line is deduced): charFormat.setProperty(QTextFormat::FontSizeAdjustment, int(0)); | - |
1098 | margin[QTextHtmlParser::MarginTop] = 12; executed (the execution status of this line is deduced): margin[QTextHtmlParser::MarginTop] = 12; | - |
1099 | margin[QTextHtmlParser::MarginBottom] = 12; executed (the execution status of this line is deduced): margin[QTextHtmlParser::MarginBottom] = 12; | - |
1100 | break; executed: break; Execution Count:1 | 1 |
1101 | case Html_h5: | - |
1102 | charFormat.setFontWeight(QFont::Bold); never executed (the execution status of this line is deduced): charFormat.setFontWeight(QFont::Bold); | - |
1103 | charFormat.setProperty(QTextFormat::FontSizeAdjustment, int(-1)); never executed (the execution status of this line is deduced): charFormat.setProperty(QTextFormat::FontSizeAdjustment, int(-1)); | - |
1104 | margin[QTextHtmlParser::MarginTop] = 12; never executed (the execution status of this line is deduced): margin[QTextHtmlParser::MarginTop] = 12; | - |
1105 | margin[QTextHtmlParser::MarginBottom] = 4; never executed (the execution status of this line is deduced): margin[QTextHtmlParser::MarginBottom] = 4; | - |
1106 | break; | 0 |
1107 | case Html_p: | - |
1108 | margin[QTextHtmlParser::MarginTop] = 12; executed (the execution status of this line is deduced): margin[QTextHtmlParser::MarginTop] = 12; | - |
1109 | margin[QTextHtmlParser::MarginBottom] = 12; executed (the execution status of this line is deduced): margin[QTextHtmlParser::MarginBottom] = 12; | - |
1110 | break; executed: break; Execution Count:247 | 247 |
1111 | case Html_center: | - |
1112 | blockFormat.setAlignment(Qt::AlignCenter); executed (the execution status of this line is deduced): blockFormat.setAlignment(Qt::AlignCenter); | - |
1113 | break; executed: break; Execution Count:4 | 4 |
1114 | case Html_ul: | - |
1115 | listStyle = QTextListFormat::ListDisc; executed (the execution status of this line is deduced): listStyle = QTextListFormat::ListDisc; | - |
1116 | // nested lists don't have margins, except for the toplevel one | - |
1117 | if (!isNestedList(parser)) { evaluated: !isNestedList(parser) yes Evaluation Count:27 | yes Evaluation Count:8 |
| 8-27 |
1118 | margin[QTextHtmlParser::MarginTop] = 12; executed (the execution status of this line is deduced): margin[QTextHtmlParser::MarginTop] = 12; | - |
1119 | margin[QTextHtmlParser::MarginBottom] = 12; executed (the execution status of this line is deduced): margin[QTextHtmlParser::MarginBottom] = 12; | - |
1120 | } executed: } Execution Count:27 | 27 |
1121 | // no left margin as we use indenting instead | - |
1122 | break; executed: break; Execution Count:35 | 35 |
1123 | case Html_ol: | - |
1124 | listStyle = QTextListFormat::ListDecimal; executed (the execution status of this line is deduced): listStyle = QTextListFormat::ListDecimal; | - |
1125 | // nested lists don't have margins, except for the toplevel one | - |
1126 | if (!isNestedList(parser)) { partially evaluated: !isNestedList(parser) yes Evaluation Count:5 | no Evaluation Count:0 |
| 0-5 |
1127 | margin[QTextHtmlParser::MarginTop] = 12; executed (the execution status of this line is deduced): margin[QTextHtmlParser::MarginTop] = 12; | - |
1128 | margin[QTextHtmlParser::MarginBottom] = 12; executed (the execution status of this line is deduced): margin[QTextHtmlParser::MarginBottom] = 12; | - |
1129 | } executed: } Execution Count:5 | 5 |
1130 | // no left margin as we use indenting instead | - |
1131 | break; executed: break; Execution Count:5 | 5 |
1132 | case Html_code: | - |
1133 | case Html_tt: | - |
1134 | case Html_kbd: | - |
1135 | case Html_samp: | - |
1136 | charFormat.setFontFamily(QString::fromLatin1("Courier New,courier")); never executed (the execution status of this line is deduced): charFormat.setFontFamily(QString::fromLatin1("Courier New,courier")); | - |
1137 | // <tt> uses a fixed font, so set the property | - |
1138 | charFormat.setFontFixedPitch(true); never executed (the execution status of this line is deduced): charFormat.setFontFixedPitch(true); | - |
1139 | break; | 0 |
1140 | case Html_br: | - |
1141 | text = QChar(QChar::LineSeparator); executed (the execution status of this line is deduced): text = QChar(QChar::LineSeparator); | - |
1142 | wsm = QTextHtmlParserNode::WhiteSpacePre; executed (the execution status of this line is deduced): wsm = QTextHtmlParserNode::WhiteSpacePre; | - |
1143 | break; executed: break; Execution Count:127 | 127 |
1144 | // ##### sub / sup | - |
1145 | case Html_pre: | - |
1146 | charFormat.setFontFamily(QString::fromLatin1("Courier New,courier")); executed (the execution status of this line is deduced): charFormat.setFontFamily(QString::fromLatin1("Courier New,courier")); | - |
1147 | wsm = WhiteSpacePre; executed (the execution status of this line is deduced): wsm = WhiteSpacePre; | - |
1148 | margin[QTextHtmlParser::MarginTop] = 12; executed (the execution status of this line is deduced): margin[QTextHtmlParser::MarginTop] = 12; | - |
1149 | margin[QTextHtmlParser::MarginBottom] = 12; executed (the execution status of this line is deduced): margin[QTextHtmlParser::MarginBottom] = 12; | - |
1150 | // <pre> uses a fixed font | - |
1151 | charFormat.setFontFixedPitch(true); executed (the execution status of this line is deduced): charFormat.setFontFixedPitch(true); | - |
1152 | break; executed: break; Execution Count:273 | 273 |
1153 | case Html_blockquote: | - |
1154 | margin[QTextHtmlParser::MarginTop] = 12; executed (the execution status of this line is deduced): margin[QTextHtmlParser::MarginTop] = 12; | - |
1155 | margin[QTextHtmlParser::MarginBottom] = 12; executed (the execution status of this line is deduced): margin[QTextHtmlParser::MarginBottom] = 12; | - |
1156 | margin[QTextHtmlParser::MarginLeft] = 40; executed (the execution status of this line is deduced): margin[QTextHtmlParser::MarginLeft] = 40; | - |
1157 | margin[QTextHtmlParser::MarginRight] = 40; executed (the execution status of this line is deduced): margin[QTextHtmlParser::MarginRight] = 40; | - |
1158 | break; executed: break; Execution Count:1 | 1 |
1159 | case Html_dl: | - |
1160 | margin[QTextHtmlParser::MarginTop] = 8; executed (the execution status of this line is deduced): margin[QTextHtmlParser::MarginTop] = 8; | - |
1161 | margin[QTextHtmlParser::MarginBottom] = 8; executed (the execution status of this line is deduced): margin[QTextHtmlParser::MarginBottom] = 8; | - |
1162 | break; executed: break; Execution Count:3 | 3 |
1163 | case Html_dd: | - |
1164 | margin[QTextHtmlParser::MarginLeft] = 30; executed (the execution status of this line is deduced): margin[QTextHtmlParser::MarginLeft] = 30; | - |
1165 | break; executed: break; Execution Count:3 | 3 |
1166 | case Html_u: | - |
1167 | charFormat.setUnderlineStyle(QTextCharFormat::SingleUnderline); executed (the execution status of this line is deduced): charFormat.setUnderlineStyle(QTextCharFormat::SingleUnderline); | - |
1168 | break; executed: break; Execution Count:1 | 1 |
1169 | case Html_s: | - |
1170 | charFormat.setFontStrikeOut(true); never executed (the execution status of this line is deduced): charFormat.setFontStrikeOut(true); | - |
1171 | break; | 0 |
1172 | case Html_nobr: | - |
1173 | wsm = WhiteSpaceNoWrap; executed (the execution status of this line is deduced): wsm = WhiteSpaceNoWrap; | - |
1174 | break; executed: break; Execution Count:2 | 2 |
1175 | case Html_th: | - |
1176 | charFormat.setFontWeight(QFont::Bold); executed (the execution status of this line is deduced): charFormat.setFontWeight(QFont::Bold); | - |
1177 | blockFormat.setAlignment(Qt::AlignCenter); executed (the execution status of this line is deduced): blockFormat.setAlignment(Qt::AlignCenter); | - |
1178 | break; executed: break; Execution Count:5 | 5 |
1179 | case Html_td: | - |
1180 | blockFormat.setAlignment(Qt::AlignLeft); executed (the execution status of this line is deduced): blockFormat.setAlignment(Qt::AlignLeft); | - |
1181 | break; executed: break; Execution Count:153 | 153 |
1182 | case Html_sub: | - |
1183 | charFormat.setVerticalAlignment(QTextCharFormat::AlignSubScript); executed (the execution status of this line is deduced): charFormat.setVerticalAlignment(QTextCharFormat::AlignSubScript); | - |
1184 | break; executed: break; Execution Count:2 | 2 |
1185 | case Html_sup: | - |
1186 | charFormat.setVerticalAlignment(QTextCharFormat::AlignSuperScript); executed (the execution status of this line is deduced): charFormat.setVerticalAlignment(QTextCharFormat::AlignSuperScript); | - |
1187 | break; executed: break; Execution Count:1 | 1 |
1188 | default: break; executed: break; Execution Count:1992 | 1992 |
1189 | } | - |
1190 | } executed: } Execution Count:2968 | 2968 |
1191 | | - |
1192 | #ifndef QT_NO_CSSPARSER | - |
1193 | void QTextHtmlParserNode::setListStyle(const QVector<QCss::Value> &cssValues) | - |
1194 | { | - |
1195 | for (int i = 0; i < cssValues.count(); ++i) { evaluated: i < cssValues.count() yes Evaluation Count:10 | yes Evaluation Count:9 |
| 9-10 |
1196 | if (cssValues.at(i).type == QCss::Value::KnownIdentifier) { evaluated: cssValues.at(i).type == QCss::Value::KnownIdentifier yes Evaluation Count:9 | yes Evaluation Count:1 |
| 1-9 |
1197 | switch (static_cast<QCss::KnownValue>(cssValues.at(i).variant.toInt())) { | - |
1198 | case QCss::Value_Disc: hasOwnListStyle = true; listStyle = QTextListFormat::ListDisc; break; executed: break; Execution Count:1 | 1 |
1199 | case QCss::Value_Square: hasOwnListStyle = true; listStyle = QTextListFormat::ListSquare; break; executed: break; Execution Count:1 | 1 |
1200 | case QCss::Value_Circle: hasOwnListStyle = true; listStyle = QTextListFormat::ListCircle; break; executed: break; Execution Count:1 | 1 |
1201 | case QCss::Value_Decimal: hasOwnListStyle = true; listStyle = QTextListFormat::ListDecimal; break; executed: break; Execution Count:2 | 2 |
1202 | case QCss::Value_LowerAlpha: hasOwnListStyle = true; listStyle = QTextListFormat::ListLowerAlpha; break; executed: break; Execution Count:1 | 1 |
1203 | case QCss::Value_UpperAlpha: hasOwnListStyle = true; listStyle = QTextListFormat::ListUpperAlpha; break; executed: break; Execution Count:1 | 1 |
1204 | case QCss::Value_LowerRoman: hasOwnListStyle = true; listStyle = QTextListFormat::ListLowerRoman; break; executed: break; Execution Count:1 | 1 |
1205 | case QCss::Value_UpperRoman: hasOwnListStyle = true; listStyle = QTextListFormat::ListUpperRoman; break; executed: break; Execution Count:1 | 1 |
1206 | default: break; | 0 |
1207 | } | - |
1208 | } executed: } Execution Count:9 | 9 |
1209 | } executed: } Execution Count:10 | 10 |
1210 | // allow individual list items to override the style | - |
1211 | if (id == Html_li && hasOwnListStyle) partially evaluated: id == Html_li no Evaluation Count:0 | yes Evaluation Count:9 |
never evaluated: hasOwnListStyle | 0-9 |
1212 | blockFormat.setProperty(QTextFormat::ListStyle, listStyle); never executed: blockFormat.setProperty(QTextFormat::ListStyle, listStyle); | 0 |
1213 | } executed: } Execution Count:9 | 9 |
1214 | | - |
1215 | void QTextHtmlParserNode::applyCssDeclarations(const QVector<QCss::Declaration> &declarations, const QTextDocument *resourceProvider) | - |
1216 | { | - |
1217 | QCss::ValueExtractor extractor(declarations); executed (the execution status of this line is deduced): QCss::ValueExtractor extractor(declarations); | - |
1218 | extractor.extractBox(margin, padding); executed (the execution status of this line is deduced): extractor.extractBox(margin, padding); | - |
1219 | | - |
1220 | for (int i = 0; i < declarations.count(); ++i) { evaluated: i < declarations.count() yes Evaluation Count:533 | yes Evaluation Count:1766 |
| 533-1766 |
1221 | const QCss::Declaration &decl = declarations.at(i); executed (the execution status of this line is deduced): const QCss::Declaration &decl = declarations.at(i); | - |
1222 | if (decl.d->values.isEmpty()) continue; never executed: continue; partially evaluated: decl.d->values.isEmpty() no Evaluation Count:0 | yes Evaluation Count:533 |
| 0-533 |
1223 | | - |
1224 | QCss::KnownValue identifier = QCss::UnknownValue; executed (the execution status of this line is deduced): QCss::KnownValue identifier = QCss::UnknownValue; | - |
1225 | if (decl.d->values.first().type == QCss::Value::KnownIdentifier) evaluated: decl.d->values.first().type == QCss::Value::KnownIdentifier yes Evaluation Count:100 | yes Evaluation Count:433 |
| 100-433 |
1226 | identifier = static_cast<QCss::KnownValue>(decl.d->values.first().variant.toInt()); executed: identifier = static_cast<QCss::KnownValue>(decl.d->values.first().variant.toInt()); Execution Count:100 | 100 |
1227 | | - |
1228 | switch (decl.d->propertyId) { | - |
1229 | case QCss::BorderColor: borderBrush = QBrush(decl.colorValue()); break; executed: break; Execution Count:1 | 1 |
1230 | case QCss::BorderStyles: | - |
1231 | if (decl.styleValue() != QCss::BorderStyle_Unknown && decl.styleValue() != QCss::BorderStyle_Native) partially evaluated: decl.styleValue() != QCss::BorderStyle_Unknown yes Evaluation Count:1 | no Evaluation Count:0 |
partially evaluated: decl.styleValue() != QCss::BorderStyle_Native yes Evaluation Count:1 | no Evaluation Count:0 |
| 0-1 |
1232 | borderStyle = static_cast<QTextFrameFormat::BorderStyle>(decl.styleValue() - 1); executed: borderStyle = static_cast<QTextFrameFormat::BorderStyle>(decl.styleValue() - 1); Execution Count:1 | 1 |
1233 | break; executed: break; Execution Count:1 | 1 |
1234 | case QCss::BorderWidth: | - |
1235 | tableBorder = extractor.lengthValue(decl); executed (the execution status of this line is deduced): tableBorder = extractor.lengthValue(decl); | - |
1236 | break; executed: break; Execution Count:2 | 2 |
1237 | case QCss::Color: charFormat.setForeground(decl.colorValue()); break; executed: break; Execution Count:13 | 13 |
1238 | case QCss::Float: | - |
1239 | cssFloat = QTextFrameFormat::InFlow; executed (the execution status of this line is deduced): cssFloat = QTextFrameFormat::InFlow; | - |
1240 | switch (identifier) { | - |
1241 | case QCss::Value_Left: cssFloat = QTextFrameFormat::FloatLeft; break; | 0 |
1242 | case QCss::Value_Right: cssFloat = QTextFrameFormat::FloatRight; break; executed: break; Execution Count:4 | 4 |
1243 | default: break; | 0 |
1244 | } | - |
1245 | break; executed: break; Execution Count:4 | 4 |
1246 | case QCss::QtBlockIndent: | - |
1247 | blockFormat.setIndent(decl.d->values.first().variant.toInt()); executed (the execution status of this line is deduced): blockFormat.setIndent(decl.d->values.first().variant.toInt()); | - |
1248 | break; executed: break; Execution Count:41 | 41 |
1249 | case QCss::LineHeight: { | - |
1250 | qreal lineHeight; never executed (the execution status of this line is deduced): qreal lineHeight; | - |
1251 | if (decl.realValue(&lineHeight, "px")) { never evaluated: decl.realValue(&lineHeight, "px") | 0 |
1252 | blockFormat.setLineHeight(lineHeight, QTextBlockFormat::FixedHeight); never executed (the execution status of this line is deduced): blockFormat.setLineHeight(lineHeight, QTextBlockFormat::FixedHeight); | - |
1253 | } else { | 0 |
1254 | bool ok; never executed (the execution status of this line is deduced): bool ok; | - |
1255 | QString value = decl.d->values.first().toString(); never executed (the execution status of this line is deduced): QString value = decl.d->values.first().toString(); | - |
1256 | lineHeight = value.toDouble(&ok); never executed (the execution status of this line is deduced): lineHeight = value.toDouble(&ok); | - |
1257 | if (ok) | 0 |
1258 | blockFormat.setLineHeight(lineHeight, QTextBlockFormat::ProportionalHeight); never executed: blockFormat.setLineHeight(lineHeight, QTextBlockFormat::ProportionalHeight); | 0 |
1259 | else | - |
1260 | blockFormat.setLineHeight(0, QTextBlockFormat::SingleHeight); never executed: blockFormat.setLineHeight(0, QTextBlockFormat::SingleHeight); | 0 |
1261 | } | - |
1262 | break; } | 0 |
1263 | case QCss::TextIndent: { | - |
1264 | qreal indent = 0; executed (the execution status of this line is deduced): qreal indent = 0; | - |
1265 | if (decl.realValue(&indent, "px")) partially evaluated: decl.realValue(&indent, "px") yes Evaluation Count:41 | no Evaluation Count:0 |
| 0-41 |
1266 | blockFormat.setTextIndent(indent); executed: blockFormat.setTextIndent(indent); Execution Count:41 | 41 |
1267 | break; } executed: break; Execution Count:41 | 41 |
1268 | case QCss::QtListIndent: | - |
1269 | if (decl.intValue(&cssListIndent)) partially evaluated: decl.intValue(&cssListIndent) yes Evaluation Count:2 | no Evaluation Count:0 |
| 0-2 |
1270 | hasCssListIndent = true; executed: hasCssListIndent = true; Execution Count:2 | 2 |
1271 | break; executed: break; Execution Count:2 | 2 |
1272 | case QCss::QtParagraphType: | - |
1273 | if (decl.d->values.first().variant.toString().compare(QLatin1String("empty"), Qt::CaseInsensitive) == 0) partially evaluated: decl.d->values.first().variant.toString().compare(QLatin1String("empty"), Qt::CaseInsensitive) == 0 yes Evaluation Count:33 | no Evaluation Count:0 |
| 0-33 |
1274 | isEmptyParagraph = true; executed: isEmptyParagraph = true; Execution Count:33 | 33 |
1275 | break; executed: break; Execution Count:33 | 33 |
1276 | case QCss::QtTableType: | - |
1277 | if (decl.d->values.first().variant.toString().compare(QLatin1String("frame"), Qt::CaseInsensitive) == 0) evaluated: decl.d->values.first().variant.toString().compare(QLatin1String("frame"), Qt::CaseInsensitive) == 0 yes Evaluation Count:3 | yes Evaluation Count:1 |
| 1-3 |
1278 | isTextFrame = true; executed: isTextFrame = true; Execution Count:3 | 3 |
1279 | else if (decl.d->values.first().variant.toString().compare(QLatin1String("root"), Qt::CaseInsensitive) == 0) { partially evaluated: decl.d->values.first().variant.toString().compare(QLatin1String("root"), Qt::CaseInsensitive) == 0 yes Evaluation Count:1 | no Evaluation Count:0 |
| 0-1 |
1280 | isTextFrame = true; executed (the execution status of this line is deduced): isTextFrame = true; | - |
1281 | isRootFrame = true; executed (the execution status of this line is deduced): isRootFrame = true; | - |
1282 | } executed: } Execution Count:1 | 1 |
1283 | break; executed: break; Execution Count:4 | 4 |
1284 | case QCss::QtUserState: | - |
1285 | userState = decl.d->values.first().variant.toInt(); executed (the execution status of this line is deduced): userState = decl.d->values.first().variant.toInt(); | - |
1286 | break; executed: break; Execution Count:2 | 2 |
1287 | case QCss::Whitespace: | - |
1288 | switch (identifier) { | - |
1289 | case QCss::Value_Normal: wsm = QTextHtmlParserNode::WhiteSpaceNormal; break; | 0 |
1290 | case QCss::Value_Pre: wsm = QTextHtmlParserNode::WhiteSpacePre; break; executed: break; Execution Count:1 | 1 |
1291 | case QCss::Value_NoWrap: wsm = QTextHtmlParserNode::WhiteSpaceNoWrap; break; | 0 |
1292 | case QCss::Value_PreWrap: wsm = QTextHtmlParserNode::WhiteSpacePreWrap; break; executed: break; Execution Count:40 | 40 |
1293 | default: break; | 0 |
1294 | } | - |
1295 | break; executed: break; Execution Count:41 | 41 |
1296 | case QCss::VerticalAlignment: | - |
1297 | switch (identifier) { | - |
1298 | case QCss::Value_Sub: charFormat.setVerticalAlignment(QTextCharFormat::AlignSubScript); break; executed: break; Execution Count:1 | 1 |
1299 | case QCss::Value_Super: charFormat.setVerticalAlignment(QTextCharFormat::AlignSuperScript); break; executed: break; Execution Count:1 | 1 |
1300 | case QCss::Value_Middle: charFormat.setVerticalAlignment(QTextCharFormat::AlignMiddle); break; executed: break; Execution Count:2 | 2 |
1301 | case QCss::Value_Top: charFormat.setVerticalAlignment(QTextCharFormat::AlignTop); break; executed: break; Execution Count:2 | 2 |
1302 | case QCss::Value_Bottom: charFormat.setVerticalAlignment(QTextCharFormat::AlignBottom); break; executed: break; Execution Count:1 | 1 |
1303 | default: charFormat.setVerticalAlignment(QTextCharFormat::AlignNormal); break; | 0 |
1304 | } | - |
1305 | break; executed: break; Execution Count:7 | 7 |
1306 | case QCss::PageBreakBefore: | - |
1307 | switch (identifier) { | - |
1308 | case QCss::Value_Always: blockFormat.setPageBreakPolicy(blockFormat.pageBreakPolicy() | QTextFormat::PageBreak_AlwaysBefore); break; executed: break; Execution Count:3 | 3 |
1309 | case QCss::Value_Auto: blockFormat.setPageBreakPolicy(blockFormat.pageBreakPolicy() & ~QTextFormat::PageBreak_AlwaysBefore); break; | 0 |
1310 | default: break; | 0 |
1311 | } | - |
1312 | break; executed: break; Execution Count:3 | 3 |
1313 | case QCss::PageBreakAfter: | - |
1314 | switch (identifier) { | - |
1315 | case QCss::Value_Always: blockFormat.setPageBreakPolicy(blockFormat.pageBreakPolicy() | QTextFormat::PageBreak_AlwaysAfter); break; executed: break; Execution Count:3 | 3 |
1316 | case QCss::Value_Auto: blockFormat.setPageBreakPolicy(blockFormat.pageBreakPolicy() & ~QTextFormat::PageBreak_AlwaysAfter); break; | 0 |
1317 | default: break; | 0 |
1318 | } | - |
1319 | break; executed: break; Execution Count:3 | 3 |
1320 | case QCss::TextUnderlineStyle: | - |
1321 | switch (identifier) { | - |
1322 | case QCss::Value_None: charFormat.setUnderlineStyle(QTextCharFormat::NoUnderline); break; executed: break; Execution Count:1 | 1 |
1323 | case QCss::Value_Solid: charFormat.setUnderlineStyle(QTextCharFormat::SingleUnderline); break; executed: break; Execution Count:3 | 3 |
1324 | case QCss::Value_Dashed: charFormat.setUnderlineStyle(QTextCharFormat::DashUnderline); break; executed: break; Execution Count:1 | 1 |
1325 | case QCss::Value_Dotted: charFormat.setUnderlineStyle(QTextCharFormat::DotLine); break; executed: break; Execution Count:1 | 1 |
1326 | case QCss::Value_DotDash: charFormat.setUnderlineStyle(QTextCharFormat::DashDotLine); break; executed: break; Execution Count:1 | 1 |
1327 | case QCss::Value_DotDotDash: charFormat.setUnderlineStyle(QTextCharFormat::DashDotDotLine); break; executed: break; Execution Count:1 | 1 |
1328 | case QCss::Value_Wave: charFormat.setUnderlineStyle(QTextCharFormat::WaveUnderline); break; executed: break; Execution Count:1 | 1 |
1329 | default: break; | 0 |
1330 | } | - |
1331 | break; executed: break; Execution Count:9 | 9 |
1332 | case QCss::ListStyleType: | - |
1333 | case QCss::ListStyle: | - |
1334 | setListStyle(decl.d->values); executed (the execution status of this line is deduced): setListStyle(decl.d->values); | - |
1335 | break; executed: break; Execution Count:9 | 9 |
1336 | case QCss::QtListNumberPrefix: | - |
1337 | textListNumberPrefix = decl.d->values.first().variant.toString(); executed (the execution status of this line is deduced): textListNumberPrefix = decl.d->values.first().variant.toString(); | - |
1338 | break; executed: break; Execution Count:1 | 1 |
1339 | case QCss::QtListNumberSuffix: | - |
1340 | textListNumberSuffix = decl.d->values.first().variant.toString(); executed (the execution status of this line is deduced): textListNumberSuffix = decl.d->values.first().variant.toString(); | - |
1341 | break; executed: break; Execution Count:1 | 1 |
1342 | default: break; executed: break; Execution Count:315 | 315 |
1343 | } | - |
1344 | } executed: } Execution Count:533 | 533 |
1345 | | - |
1346 | QFont f; executed (the execution status of this line is deduced): QFont f; | - |
1347 | int adjustment = -255; executed (the execution status of this line is deduced): int adjustment = -255; | - |
1348 | extractor.extractFont(&f, &adjustment); executed (the execution status of this line is deduced): extractor.extractFont(&f, &adjustment); | - |
1349 | if (f.resolve() & QFont::SizeResolved) { evaluated: f.resolve() & QFont::SizeResolved yes Evaluation Count:21 | yes Evaluation Count:1745 |
| 21-1745 |
1350 | if (f.pointSize() > 0) { evaluated: f.pointSize() > 0 yes Evaluation Count:14 | yes Evaluation Count:7 |
| 7-14 |
1351 | charFormat.setFontPointSize(f.pointSize()); executed (the execution status of this line is deduced): charFormat.setFontPointSize(f.pointSize()); | - |
1352 | } else if (f.pixelSize() > 0) { executed: } Execution Count:14 partially evaluated: f.pixelSize() > 0 yes Evaluation Count:7 | no Evaluation Count:0 |
| 0-14 |
1353 | charFormat.setProperty(QTextFormat::FontPixelSize, f.pixelSize()); executed (the execution status of this line is deduced): charFormat.setProperty(QTextFormat::FontPixelSize, f.pixelSize()); | - |
1354 | } executed: } Execution Count:7 | 7 |
1355 | } | - |
1356 | if (f.resolve() & QFont::StyleResolved) evaluated: f.resolve() & QFont::StyleResolved yes Evaluation Count:14 | yes Evaluation Count:1752 |
| 14-1752 |
1357 | charFormat.setFontItalic(f.style() != QFont::StyleNormal); executed: charFormat.setFontItalic(f.style() != QFont::StyleNormal); Execution Count:14 | 14 |
1358 | | - |
1359 | if (f.resolve() & QFont::WeightResolved) evaluated: f.resolve() & QFont::WeightResolved yes Evaluation Count:15 | yes Evaluation Count:1751 |
| 15-1751 |
1360 | charFormat.setFontWeight(f.weight()); executed: charFormat.setFontWeight(f.weight()); Execution Count:15 | 15 |
1361 | | - |
1362 | if (f.resolve() & QFont::FamilyResolved) evaluated: f.resolve() & QFont::FamilyResolved yes Evaluation Count:17 | yes Evaluation Count:1749 |
| 17-1749 |
1363 | charFormat.setFontFamily(f.family()); executed: charFormat.setFontFamily(f.family()); Execution Count:17 | 17 |
1364 | | - |
1365 | if (f.resolve() & QFont::UnderlineResolved) evaluated: f.resolve() & QFont::UnderlineResolved yes Evaluation Count:3 | yes Evaluation Count:1763 |
| 3-1763 |
1366 | charFormat.setUnderlineStyle(f.underline() ? QTextCharFormat::SingleUnderline : QTextCharFormat::NoUnderline); executed: charFormat.setUnderlineStyle(f.underline() ? QTextCharFormat::SingleUnderline : QTextCharFormat::NoUnderline); Execution Count:3 | 3 |
1367 | | - |
1368 | if (f.resolve() & QFont::OverlineResolved) evaluated: f.resolve() & QFont::OverlineResolved yes Evaluation Count:5 | yes Evaluation Count:1761 |
| 5-1761 |
1369 | charFormat.setFontOverline(f.overline()); executed: charFormat.setFontOverline(f.overline()); Execution Count:5 | 5 |
1370 | | - |
1371 | if (f.resolve() & QFont::StrikeOutResolved) evaluated: f.resolve() & QFont::StrikeOutResolved yes Evaluation Count:3 | yes Evaluation Count:1763 |
| 3-1763 |
1372 | charFormat.setFontStrikeOut(f.strikeOut()); executed: charFormat.setFontStrikeOut(f.strikeOut()); Execution Count:3 | 3 |
1373 | | - |
1374 | if (f.resolve() & QFont::CapitalizationResolved) evaluated: f.resolve() & QFont::CapitalizationResolved yes Evaluation Count:3 | yes Evaluation Count:1763 |
| 3-1763 |
1375 | charFormat.setFontCapitalization(f.capitalization()); executed: charFormat.setFontCapitalization(f.capitalization()); Execution Count:3 | 3 |
1376 | | - |
1377 | if (adjustment >= -1) evaluated: adjustment >= -1 yes Evaluation Count:1 | yes Evaluation Count:1765 |
| 1-1765 |
1378 | charFormat.setProperty(QTextFormat::FontSizeAdjustment, adjustment); executed: charFormat.setProperty(QTextFormat::FontSizeAdjustment, adjustment); Execution Count:1 | 1 |
1379 | | - |
1380 | { | - |
1381 | Qt::Alignment ignoredAlignment; executed (the execution status of this line is deduced): Qt::Alignment ignoredAlignment; | - |
1382 | QCss::Repeat ignoredRepeat; executed (the execution status of this line is deduced): QCss::Repeat ignoredRepeat; | - |
1383 | QString bgImage; executed (the execution status of this line is deduced): QString bgImage; | - |
1384 | QBrush bgBrush; executed (the execution status of this line is deduced): QBrush bgBrush; | - |
1385 | QCss::Origin ignoredOrigin, ignoredClip; executed (the execution status of this line is deduced): QCss::Origin ignoredOrigin, ignoredClip; | - |
1386 | QCss::Attachment ignoredAttachment; executed (the execution status of this line is deduced): QCss::Attachment ignoredAttachment; | - |
1387 | extractor.extractBackground(&bgBrush, &bgImage, &ignoredRepeat, &ignoredAlignment, executed (the execution status of this line is deduced): extractor.extractBackground(&bgBrush, &bgImage, &ignoredRepeat, &ignoredAlignment, | - |
1388 | &ignoredOrigin, &ignoredAttachment, &ignoredClip); executed (the execution status of this line is deduced): &ignoredOrigin, &ignoredAttachment, &ignoredClip); | - |
1389 | | - |
1390 | if (!bgImage.isEmpty() && resourceProvider) { evaluated: !bgImage.isEmpty() yes Evaluation Count:3 | yes Evaluation Count:1763 |
partially evaluated: resourceProvider yes Evaluation Count:3 | no Evaluation Count:0 |
| 0-1763 |
1391 | applyBackgroundImage(bgImage, resourceProvider); executed (the execution status of this line is deduced): applyBackgroundImage(bgImage, resourceProvider); | - |
1392 | } else if (bgBrush.style() != Qt::NoBrush) { executed: } Execution Count:3 evaluated: bgBrush.style() != Qt::NoBrush yes Evaluation Count:33 | yes Evaluation Count:1730 |
| 3-1730 |
1393 | charFormat.setBackground(bgBrush); executed (the execution status of this line is deduced): charFormat.setBackground(bgBrush); | - |
1394 | } executed: } Execution Count:33 | 33 |
1395 | } | - |
1396 | } | - |
1397 | | - |
1398 | #endif // QT_NO_CSSPARSER | - |
1399 | | - |
1400 | void QTextHtmlParserNode::applyBackgroundImage(const QString &url, const QTextDocument *resourceProvider) | - |
1401 | { | - |
1402 | if (!url.isEmpty() && resourceProvider) { partially evaluated: !url.isEmpty() yes Evaluation Count:9 | no Evaluation Count:0 |
partially evaluated: resourceProvider yes Evaluation Count:9 | no Evaluation Count:0 |
| 0-9 |
1403 | QVariant val = resourceProvider->resource(QTextDocument::ImageResource, url); executed (the execution status of this line is deduced): QVariant val = resourceProvider->resource(QTextDocument::ImageResource, url); | - |
1404 | | - |
1405 | if (QCoreApplication::instance()->thread() != QThread::currentThread()) { partially evaluated: QCoreApplication::instance()->thread() != QThread::currentThread() no Evaluation Count:0 | yes Evaluation Count:9 |
| 0-9 |
1406 | // must use images in non-GUI threads | - |
1407 | if (val.type() == QVariant::Image) { never evaluated: val.type() == QVariant::Image | 0 |
1408 | QImage image = qvariant_cast<QImage>(val); never executed (the execution status of this line is deduced): QImage image = qvariant_cast<QImage>(val); | - |
1409 | charFormat.setBackground(image); never executed (the execution status of this line is deduced): charFormat.setBackground(image); | - |
1410 | } else if (val.type() == QVariant::ByteArray) { never executed: } never evaluated: val.type() == QVariant::ByteArray | 0 |
1411 | QImage image; never executed (the execution status of this line is deduced): QImage image; | - |
1412 | if (image.loadFromData(val.toByteArray())) { never evaluated: image.loadFromData(val.toByteArray()) | 0 |
1413 | charFormat.setBackground(image); never executed (the execution status of this line is deduced): charFormat.setBackground(image); | - |
1414 | } | 0 |
1415 | } | 0 |
1416 | } else { | - |
1417 | if (val.type() == QVariant::Image || val.type() == QVariant::Pixmap) { partially evaluated: val.type() == QVariant::Image no Evaluation Count:0 | yes Evaluation Count:9 |
partially evaluated: val.type() == QVariant::Pixmap yes Evaluation Count:9 | no Evaluation Count:0 |
| 0-9 |
1418 | charFormat.setBackground(qvariant_cast<QPixmap>(val)); executed (the execution status of this line is deduced): charFormat.setBackground(qvariant_cast<QPixmap>(val)); | - |
1419 | } else if (val.type() == QVariant::ByteArray) { executed: } Execution Count:9 never evaluated: val.type() == QVariant::ByteArray | 0-9 |
1420 | QPixmap pm; never executed (the execution status of this line is deduced): QPixmap pm; | - |
1421 | if (pm.loadFromData(val.toByteArray())) { never evaluated: pm.loadFromData(val.toByteArray()) | 0 |
1422 | charFormat.setBackground(pm); never executed (the execution status of this line is deduced): charFormat.setBackground(pm); | - |
1423 | } | 0 |
1424 | } | 0 |
1425 | } | - |
1426 | } | - |
1427 | if (!url.isEmpty()) partially evaluated: !url.isEmpty() yes Evaluation Count:9 | no Evaluation Count:0 |
| 0-9 |
1428 | charFormat.setProperty(QTextFormat::BackgroundImageUrl, url); executed: charFormat.setProperty(QTextFormat::BackgroundImageUrl, url); Execution Count:9 | 9 |
1429 | } executed: } Execution Count:9 | 9 |
1430 | | - |
1431 | bool QTextHtmlParserNode::hasOnlyWhitespace() const | - |
1432 | { | - |
1433 | for (int i = 0; i < text.count(); ++i) evaluated: i < text.count() yes Evaluation Count:186 | yes Evaluation Count:48 |
| 48-186 |
1434 | if (!text.at(i).isSpace() || text.at(i) == QChar::LineSeparator) evaluated: !text.at(i).isSpace() yes Evaluation Count:16 | yes Evaluation Count:170 |
evaluated: text.at(i) == QChar::LineSeparator yes Evaluation Count:1 | yes Evaluation Count:169 |
| 1-170 |
1435 | return false; executed: return false; Execution Count:17 | 17 |
1436 | return true; executed: return true; Execution Count:48 | 48 |
1437 | } | - |
1438 | | - |
1439 | static bool setIntAttribute(int *destination, const QString &value) | - |
1440 | { | - |
1441 | bool ok = false; executed (the execution status of this line is deduced): bool ok = false; | - |
1442 | int val = value.toInt(&ok); executed (the execution status of this line is deduced): int val = value.toInt(&ok); | - |
1443 | if (ok) partially evaluated: ok yes Evaluation Count:14 | no Evaluation Count:0 |
| 0-14 |
1444 | *destination = val; executed: *destination = val; Execution Count:14 | 14 |
1445 | | - |
1446 | return ok; executed: return ok; Execution Count:14 | 14 |
1447 | } | - |
1448 | | - |
1449 | static bool setFloatAttribute(qreal *destination, const QString &value) | - |
1450 | { | - |
1451 | bool ok = false; executed (the execution status of this line is deduced): bool ok = false; | - |
1452 | qreal val = value.toDouble(&ok); executed (the execution status of this line is deduced): qreal val = value.toDouble(&ok); | - |
1453 | if (ok) evaluated: ok yes Evaluation Count:27 | yes Evaluation Count:1 |
| 1-27 |
1454 | *destination = val; executed: *destination = val; Execution Count:27 | 27 |
1455 | | - |
1456 | return ok; executed: return ok; Execution Count:28 | 28 |
1457 | } | - |
1458 | | - |
1459 | static void setWidthAttribute(QTextLength *width, QString value) | - |
1460 | { | - |
1461 | bool ok = false; executed (the execution status of this line is deduced): bool ok = false; | - |
1462 | qreal realVal = value.toDouble(&ok); executed (the execution status of this line is deduced): qreal realVal = value.toDouble(&ok); | - |
1463 | if (ok) { evaluated: ok yes Evaluation Count:13 | yes Evaluation Count:3 |
| 3-13 |
1464 | *width = QTextLength(QTextLength::FixedLength, realVal); executed (the execution status of this line is deduced): *width = QTextLength(QTextLength::FixedLength, realVal); | - |
1465 | } else { executed: } Execution Count:13 | 13 |
1466 | value = value.trimmed(); executed (the execution status of this line is deduced): value = value.trimmed(); | - |
1467 | if (!value.isEmpty() && value.endsWith(QLatin1Char('%'))) { partially evaluated: !value.isEmpty() yes Evaluation Count:3 | no Evaluation Count:0 |
partially evaluated: value.endsWith(QLatin1Char('%')) yes Evaluation Count:3 | no Evaluation Count:0 |
| 0-3 |
1468 | value.chop(1); executed (the execution status of this line is deduced): value.chop(1); | - |
1469 | realVal = value.toDouble(&ok); executed (the execution status of this line is deduced): realVal = value.toDouble(&ok); | - |
1470 | if (ok) partially evaluated: ok yes Evaluation Count:3 | no Evaluation Count:0 |
| 0-3 |
1471 | *width = QTextLength(QTextLength::PercentageLength, realVal); executed: *width = QTextLength(QTextLength::PercentageLength, realVal); Execution Count:3 | 3 |
1472 | } executed: } Execution Count:3 | 3 |
1473 | } executed: } Execution Count:3 | 3 |
1474 | } | - |
1475 | | - |
1476 | #ifndef QT_NO_CSSPARSER | - |
1477 | void QTextHtmlParserNode::parseStyleAttribute(const QString &value, const QTextDocument *resourceProvider) | - |
1478 | { | - |
1479 | QString css = value; executed (the execution status of this line is deduced): QString css = value; | - |
1480 | css.prepend(QLatin1String("* {")); executed (the execution status of this line is deduced): css.prepend(QLatin1String("* {")); | - |
1481 | css.append(QLatin1Char('}')); executed (the execution status of this line is deduced): css.append(QLatin1Char('}')); | - |
1482 | QCss::Parser parser(css); executed (the execution status of this line is deduced): QCss::Parser parser(css); | - |
1483 | QCss::StyleSheet sheet; executed (the execution status of this line is deduced): QCss::StyleSheet sheet; | - |
1484 | parser.parse(&sheet, Qt::CaseInsensitive); executed (the execution status of this line is deduced): parser.parse(&sheet, Qt::CaseInsensitive); | - |
1485 | if (sheet.styleRules.count() != 1) return; never executed: return; partially evaluated: sheet.styleRules.count() != 1 no Evaluation Count:0 | yes Evaluation Count:173 |
| 0-173 |
1486 | applyCssDeclarations(sheet.styleRules.at(0).declarations, resourceProvider); executed (the execution status of this line is deduced): applyCssDeclarations(sheet.styleRules.at(0).declarations, resourceProvider); | - |
1487 | } executed: } Execution Count:173 | 173 |
1488 | #endif | - |
1489 | | - |
1490 | QStringList QTextHtmlParser::parseAttributes() | - |
1491 | { | - |
1492 | QStringList attrs; executed (the execution status of this line is deduced): QStringList attrs; | - |
1493 | | - |
1494 | while (pos < len) { partially evaluated: pos < len yes Evaluation Count:870 | no Evaluation Count:0 |
| 0-870 |
1495 | eatSpace(); executed (the execution status of this line is deduced): eatSpace(); | - |
1496 | if (hasPrefix(QLatin1Char('>')) || hasPrefix(QLatin1Char('/'))) evaluated: hasPrefix(QLatin1Char('>')) yes Evaluation Count:346 | yes Evaluation Count:524 |
evaluated: hasPrefix(QLatin1Char('/')) yes Evaluation Count:71 | yes Evaluation Count:453 |
| 71-524 |
1497 | break; executed: break; Execution Count:417 | 417 |
1498 | QString key = parseWord().toLower(); executed (the execution status of this line is deduced): QString key = parseWord().toLower(); | - |
1499 | QString value = QLatin1String("1"); executed (the execution status of this line is deduced): QString value = QLatin1String("1"); | - |
1500 | if (key.size() == 0) evaluated: key.size() == 0 yes Evaluation Count:1 | yes Evaluation Count:452 |
| 1-452 |
1501 | break; executed: break; Execution Count:1 | 1 |
1502 | eatSpace(); executed (the execution status of this line is deduced): eatSpace(); | - |
1503 | if (hasPrefix(QLatin1Char('='))){ evaluated: hasPrefix(QLatin1Char('=')) yes Evaluation Count:444 | yes Evaluation Count:8 |
| 8-444 |
1504 | pos++; executed (the execution status of this line is deduced): pos++; | - |
1505 | eatSpace(); executed (the execution status of this line is deduced): eatSpace(); | - |
1506 | value = parseWord(); executed (the execution status of this line is deduced): value = parseWord(); | - |
1507 | } executed: } Execution Count:444 | 444 |
1508 | if (value.size() == 0) evaluated: value.size() == 0 yes Evaluation Count:2 | yes Evaluation Count:450 |
| 2-450 |
1509 | continue; executed: continue; Execution Count:2 | 2 |
1510 | attrs << key << value; executed (the execution status of this line is deduced): attrs << key << value; | - |
1511 | } executed: } Execution Count:450 | 450 |
1512 | | - |
1513 | return attrs; executed: return attrs; Execution Count:418 | 418 |
1514 | } | - |
1515 | | - |
1516 | void QTextHtmlParser::applyAttributes(const QStringList &attributes) | - |
1517 | { | - |
1518 | // local state variable for qt3 textedit mode | - |
1519 | bool seenQt3Richtext = false; executed (the execution status of this line is deduced): bool seenQt3Richtext = false; | - |
1520 | QString linkHref; executed (the execution status of this line is deduced): QString linkHref; | - |
1521 | QString linkType; executed (the execution status of this line is deduced): QString linkType; | - |
1522 | | - |
1523 | if (attributes.count() % 2 == 1) partially evaluated: attributes.count() % 2 == 1 no Evaluation Count:0 | yes Evaluation Count:1593 |
| 0-1593 |
1524 | return; | 0 |
1525 | | - |
1526 | QTextHtmlParserNode *node = &nodes.last(); executed (the execution status of this line is deduced): QTextHtmlParserNode *node = &nodes.last(); | - |
1527 | | - |
1528 | for (int i = 0; i < attributes.count(); i += 2) { evaluated: i < attributes.count() yes Evaluation Count:450 | yes Evaluation Count:1593 |
| 450-1593 |
1529 | QString key = attributes.at(i); executed (the execution status of this line is deduced): QString key = attributes.at(i); | - |
1530 | QString value = attributes.at(i + 1); executed (the execution status of this line is deduced): QString value = attributes.at(i + 1); | - |
1531 | | - |
1532 | switch (node->id) { | - |
1533 | case Html_font: | - |
1534 | // the infamous font tag | - |
1535 | if (key == QLatin1String("size") && value.size()) { evaluated: key == QLatin1String("size") yes Evaluation Count:2 | yes Evaluation Count:5 |
partially evaluated: value.size() yes Evaluation Count:2 | no Evaluation Count:0 |
| 0-5 |
1536 | int n = value.toInt(); executed (the execution status of this line is deduced): int n = value.toInt(); | - |
1537 | if (value.at(0) != QLatin1Char('+') && value.at(0) != QLatin1Char('-')) partially evaluated: value.at(0) != QLatin1Char('+') yes Evaluation Count:2 | no Evaluation Count:0 |
partially evaluated: value.at(0) != QLatin1Char('-') yes Evaluation Count:2 | no Evaluation Count:0 |
| 0-2 |
1538 | n -= 3; executed: n -= 3; Execution Count:2 | 2 |
1539 | node->charFormat.setProperty(QTextFormat::FontSizeAdjustment, n); executed (the execution status of this line is deduced): node->charFormat.setProperty(QTextFormat::FontSizeAdjustment, n); | - |
1540 | } else if (key == QLatin1String("face")) { executed: } Execution Count:2 evaluated: key == QLatin1String("face") yes Evaluation Count:1 | yes Evaluation Count:4 |
| 1-4 |
1541 | node->charFormat.setFontFamily(value); executed (the execution status of this line is deduced): node->charFormat.setFontFamily(value); | - |
1542 | } else if (key == QLatin1String("color")) { executed: } Execution Count:1 partially evaluated: key == QLatin1String("color") yes Evaluation Count:4 | no Evaluation Count:0 |
| 0-4 |
1543 | QColor c; c.setNamedColor(value); executed (the execution status of this line is deduced): QColor c; c.setNamedColor(value); | - |
1544 | if (!c.isValid()) partially evaluated: !c.isValid() no Evaluation Count:0 | yes Evaluation Count:4 |
| 0-4 |
1545 | qWarning("QTextHtmlParser::applyAttributes: Unknown color name '%s'",value.toLatin1().constData()); never executed: QMessageLogger("text/qtexthtmlparser.cpp", 1545, __PRETTY_FUNCTION__).warning("QTextHtmlParser::applyAttributes: Unknown color name '%s'",value.toLatin1().constData()); | 0 |
1546 | node->charFormat.setForeground(c); executed (the execution status of this line is deduced): node->charFormat.setForeground(c); | - |
1547 | } executed: } Execution Count:4 | 4 |
1548 | break; executed: break; Execution Count:7 | 7 |
1549 | case Html_ol: | - |
1550 | case Html_ul: | - |
1551 | if (key == QLatin1String("type")) { evaluated: key == QLatin1String("type") yes Evaluation Count:3 | yes Evaluation Count:11 |
| 3-11 |
1552 | node->hasOwnListStyle = true; executed (the execution status of this line is deduced): node->hasOwnListStyle = true; | - |
1553 | if (value == QLatin1String("1")) { partially evaluated: value == QLatin1String("1") no Evaluation Count:0 | yes Evaluation Count:3 |
| 0-3 |
1554 | node->listStyle = QTextListFormat::ListDecimal; never executed (the execution status of this line is deduced): node->listStyle = QTextListFormat::ListDecimal; | - |
1555 | } else if (value == QLatin1String("a")) { never executed: } evaluated: value == QLatin1String("a") yes Evaluation Count:1 | yes Evaluation Count:2 |
| 0-2 |
1556 | node->listStyle = QTextListFormat::ListLowerAlpha; executed (the execution status of this line is deduced): node->listStyle = QTextListFormat::ListLowerAlpha; | - |
1557 | } else if (value == QLatin1String("A")) { executed: } Execution Count:1 partially evaluated: value == QLatin1String("A") no Evaluation Count:0 | yes Evaluation Count:2 |
| 0-2 |
1558 | node->listStyle = QTextListFormat::ListUpperAlpha; never executed (the execution status of this line is deduced): node->listStyle = QTextListFormat::ListUpperAlpha; | - |
1559 | } else if (value == QLatin1String("i")) { never executed: } partially evaluated: value == QLatin1String("i") no Evaluation Count:0 | yes Evaluation Count:2 |
| 0-2 |
1560 | node->listStyle = QTextListFormat::ListLowerRoman; never executed (the execution status of this line is deduced): node->listStyle = QTextListFormat::ListLowerRoman; | - |
1561 | } else if (value == QLatin1String("I")) { never executed: } partially evaluated: value == QLatin1String("I") no Evaluation Count:0 | yes Evaluation Count:2 |
| 0-2 |
1562 | node->listStyle = QTextListFormat::ListUpperRoman; never executed (the execution status of this line is deduced): node->listStyle = QTextListFormat::ListUpperRoman; | - |
1563 | } else { | 0 |
1564 | value = value.toLower(); executed (the execution status of this line is deduced): value = value.toLower(); | - |
1565 | if (value == QLatin1String("square")) evaluated: value == QLatin1String("square") yes Evaluation Count:1 | yes Evaluation Count:1 |
| 1 |
1566 | node->listStyle = QTextListFormat::ListSquare; executed: node->listStyle = QTextListFormat::ListSquare; Execution Count:1 | 1 |
1567 | else if (value == QLatin1String("disc")) partially evaluated: value == QLatin1String("disc") yes Evaluation Count:1 | no Evaluation Count:0 |
| 0-1 |
1568 | node->listStyle = QTextListFormat::ListDisc; executed: node->listStyle = QTextListFormat::ListDisc; Execution Count:1 | 1 |
1569 | else if (value == QLatin1String("circle")) never evaluated: value == QLatin1String("circle") | 0 |
1570 | node->listStyle = QTextListFormat::ListCircle; never executed: node->listStyle = QTextListFormat::ListCircle; | 0 |
1571 | } | - |
1572 | } | - |
1573 | break; executed: break; Execution Count:14 | 14 |
1574 | case Html_a: | - |
1575 | if (key == QLatin1String("href")) evaluated: key == QLatin1String("href") yes Evaluation Count:46 | yes Evaluation Count:21 |
| 21-46 |
1576 | node->charFormat.setAnchorHref(value); executed: node->charFormat.setAnchorHref(value); Execution Count:46 | 46 |
1577 | else if (key == QLatin1String("name")) evaluated: key == QLatin1String("name") yes Evaluation Count:19 | yes Evaluation Count:2 |
| 2-19 |
1578 | node->charFormat.setAnchorName(value); executed: node->charFormat.setAnchorName(value); Execution Count:19 | 19 |
1579 | break; executed: break; Execution Count:67 | 67 |
1580 | case Html_img: | - |
1581 | if (key == QLatin1String("src") || key == QLatin1String("source")) { evaluated: key == QLatin1String("src") yes Evaluation Count:20 | yes Evaluation Count:18 |
partially evaluated: key == QLatin1String("source") no Evaluation Count:0 | yes Evaluation Count:18 |
| 0-20 |
1582 | node->imageName = value; executed (the execution status of this line is deduced): node->imageName = value; | - |
1583 | } else if (key == QLatin1String("width")) { executed: } Execution Count:20 evaluated: key == QLatin1String("width") yes Evaluation Count:4 | yes Evaluation Count:14 |
| 4-20 |
1584 | node->imageWidth = -2; // register that there is a value for it. executed (the execution status of this line is deduced): node->imageWidth = -2; | - |
1585 | setFloatAttribute(&node->imageWidth, value); executed (the execution status of this line is deduced): setFloatAttribute(&node->imageWidth, value); | - |
1586 | } else if (key == QLatin1String("height")) { executed: } Execution Count:4 evaluated: key == QLatin1String("height") yes Evaluation Count:4 | yes Evaluation Count:10 |
| 4-10 |
1587 | node->imageHeight = -2; // register that there is a value for it. executed (the execution status of this line is deduced): node->imageHeight = -2; | - |
1588 | setFloatAttribute(&node->imageHeight, value); executed (the execution status of this line is deduced): setFloatAttribute(&node->imageHeight, value); | - |
1589 | } executed: } Execution Count:4 | 4 |
1590 | break; executed: break; Execution Count:38 | 38 |
1591 | case Html_tr: | - |
1592 | case Html_body: | - |
1593 | if (key == QLatin1String("bgcolor")) { evaluated: key == QLatin1String("bgcolor") yes Evaluation Count:10 | yes Evaluation Count:16 |
| 10-16 |
1594 | QColor c; c.setNamedColor(value); executed (the execution status of this line is deduced): QColor c; c.setNamedColor(value); | - |
1595 | if (!c.isValid()) partially evaluated: !c.isValid() no Evaluation Count:0 | yes Evaluation Count:10 |
| 0-10 |
1596 | qWarning("QTextHtmlParser::applyAttributes: Unknown color name '%s'",value.toLatin1().constData()); never executed: QMessageLogger("text/qtexthtmlparser.cpp", 1596, __PRETTY_FUNCTION__).warning("QTextHtmlParser::applyAttributes: Unknown color name '%s'",value.toLatin1().constData()); | 0 |
1597 | node->charFormat.setBackground(c); executed (the execution status of this line is deduced): node->charFormat.setBackground(c); | - |
1598 | } else if (key == QLatin1String("background")) { executed: } Execution Count:10 evaluated: key == QLatin1String("background") yes Evaluation Count:1 | yes Evaluation Count:15 |
| 1-15 |
1599 | node->applyBackgroundImage(value, resourceProvider); executed (the execution status of this line is deduced): node->applyBackgroundImage(value, resourceProvider); | - |
1600 | } executed: } Execution Count:1 | 1 |
1601 | break; executed: break; Execution Count:26 | 26 |
1602 | case Html_th: | - |
1603 | case Html_td: | - |
1604 | if (key == QLatin1String("width")) { evaluated: key == QLatin1String("width") yes Evaluation Count:10 | yes Evaluation Count:49 |
| 10-49 |
1605 | setWidthAttribute(&node->width, value); executed (the execution status of this line is deduced): setWidthAttribute(&node->width, value); | - |
1606 | } else if (key == QLatin1String("bgcolor")) { executed: } Execution Count:10 evaluated: key == QLatin1String("bgcolor") yes Evaluation Count:2 | yes Evaluation Count:47 |
| 2-47 |
1607 | QColor c; c.setNamedColor(value); executed (the execution status of this line is deduced): QColor c; c.setNamedColor(value); | - |
1608 | if (!c.isValid()) partially evaluated: !c.isValid() no Evaluation Count:0 | yes Evaluation Count:2 |
| 0-2 |
1609 | qWarning("QTextHtmlParser::applyAttributes: Unknown color name '%s'",value.toLatin1().constData()); never executed: QMessageLogger("text/qtexthtmlparser.cpp", 1609, __PRETTY_FUNCTION__).warning("QTextHtmlParser::applyAttributes: Unknown color name '%s'",value.toLatin1().constData()); | 0 |
1610 | node->charFormat.setBackground(c); executed (the execution status of this line is deduced): node->charFormat.setBackground(c); | - |
1611 | } else if (key == QLatin1String("background")) { executed: } Execution Count:2 evaluated: key == QLatin1String("background") yes Evaluation Count:5 | yes Evaluation Count:42 |
| 2-42 |
1612 | node->applyBackgroundImage(value, resourceProvider); executed (the execution status of this line is deduced): node->applyBackgroundImage(value, resourceProvider); | - |
1613 | } else if (key == QLatin1String("rowspan")) { executed: } Execution Count:5 evaluated: key == QLatin1String("rowspan") yes Evaluation Count:7 | yes Evaluation Count:35 |
| 5-35 |
1614 | if (setIntAttribute(&node->tableCellRowSpan, value)) partially evaluated: setIntAttribute(&node->tableCellRowSpan, value) yes Evaluation Count:7 | no Evaluation Count:0 |
| 0-7 |
1615 | node->tableCellRowSpan = qMax(1, node->tableCellRowSpan); executed: node->tableCellRowSpan = qMax(1, node->tableCellRowSpan); Execution Count:7 | 7 |
1616 | } else if (key == QLatin1String("colspan")) { executed: } Execution Count:7 evaluated: key == QLatin1String("colspan") yes Evaluation Count:7 | yes Evaluation Count:28 |
| 7-28 |
1617 | if (setIntAttribute(&node->tableCellColSpan, value)) partially evaluated: setIntAttribute(&node->tableCellColSpan, value) yes Evaluation Count:7 | no Evaluation Count:0 |
| 0-7 |
1618 | node->tableCellColSpan = qMax(1, node->tableCellColSpan); executed: node->tableCellColSpan = qMax(1, node->tableCellColSpan); Execution Count:7 | 7 |
1619 | } executed: } Execution Count:7 | 7 |
1620 | break; executed: break; Execution Count:59 | 59 |
1621 | case Html_table: | - |
1622 | if (key == QLatin1String("border")) { evaluated: key == QLatin1String("border") yes Evaluation Count:18 | yes Evaluation Count:22 |
| 18-22 |
1623 | setFloatAttribute(&node->tableBorder, value); executed (the execution status of this line is deduced): setFloatAttribute(&node->tableBorder, value); | - |
1624 | } else if (key == QLatin1String("bgcolor")) { executed: } Execution Count:18 evaluated: key == QLatin1String("bgcolor") yes Evaluation Count:2 | yes Evaluation Count:20 |
| 2-20 |
1625 | QColor c; c.setNamedColor(value); executed (the execution status of this line is deduced): QColor c; c.setNamedColor(value); | - |
1626 | if (!c.isValid()) partially evaluated: !c.isValid() no Evaluation Count:0 | yes Evaluation Count:2 |
| 0-2 |
1627 | qWarning("QTextHtmlParser::applyAttributes: Unknown color name '%s'",value.toLatin1().constData()); never executed: QMessageLogger("text/qtexthtmlparser.cpp", 1627, __PRETTY_FUNCTION__).warning("QTextHtmlParser::applyAttributes: Unknown color name '%s'",value.toLatin1().constData()); | 0 |
1628 | node->charFormat.setBackground(c); executed (the execution status of this line is deduced): node->charFormat.setBackground(c); | - |
1629 | } else if (key == QLatin1String("background")) { executed: } Execution Count:2 partially evaluated: key == QLatin1String("background") no Evaluation Count:0 | yes Evaluation Count:20 |
| 0-20 |
1630 | node->applyBackgroundImage(value, resourceProvider); never executed (the execution status of this line is deduced): node->applyBackgroundImage(value, resourceProvider); | - |
1631 | } else if (key == QLatin1String("cellspacing")) { never executed: } evaluated: key == QLatin1String("cellspacing") yes Evaluation Count:1 | yes Evaluation Count:19 |
| 0-19 |
1632 | setFloatAttribute(&node->tableCellSpacing, value); executed (the execution status of this line is deduced): setFloatAttribute(&node->tableCellSpacing, value); | - |
1633 | } else if (key == QLatin1String("cellpadding")) { executed: } Execution Count:1 evaluated: key == QLatin1String("cellpadding") yes Evaluation Count:1 | yes Evaluation Count:18 |
| 1-18 |
1634 | setFloatAttribute(&node->tableCellPadding, value); executed (the execution status of this line is deduced): setFloatAttribute(&node->tableCellPadding, value); | - |
1635 | } else if (key == QLatin1String("width")) { executed: } Execution Count:1 evaluated: key == QLatin1String("width") yes Evaluation Count:3 | yes Evaluation Count:15 |
| 1-15 |
1636 | setWidthAttribute(&node->width, value); executed (the execution status of this line is deduced): setWidthAttribute(&node->width, value); | - |
1637 | } else if (key == QLatin1String("height")) { executed: } Execution Count:3 evaluated: key == QLatin1String("height") yes Evaluation Count:2 | yes Evaluation Count:13 |
| 2-13 |
1638 | setWidthAttribute(&node->height, value); executed (the execution status of this line is deduced): setWidthAttribute(&node->height, value); | - |
1639 | } executed: } Execution Count:2 | 2 |
1640 | break; executed: break; Execution Count:40 | 40 |
1641 | case Html_meta: | - |
1642 | if (key == QLatin1String("name") evaluated: key == QLatin1String("name") yes Evaluation Count:14 | yes Evaluation Count:14 |
| 14 |
1643 | && value == QLatin1String("qrichtext")) { partially evaluated: value == QLatin1String("qrichtext") yes Evaluation Count:14 | no Evaluation Count:0 |
| 0-14 |
1644 | seenQt3Richtext = true; executed (the execution status of this line is deduced): seenQt3Richtext = true; | - |
1645 | } executed: } Execution Count:14 | 14 |
1646 | | - |
1647 | if (key == QLatin1String("content") evaluated: key == QLatin1String("content") yes Evaluation Count:14 | yes Evaluation Count:14 |
| 14 |
1648 | && value == QLatin1String("1") partially evaluated: value == QLatin1String("1") yes Evaluation Count:14 | no Evaluation Count:0 |
| 0-14 |
1649 | && seenQt3Richtext) { partially evaluated: seenQt3Richtext yes Evaluation Count:14 | no Evaluation Count:0 |
| 0-14 |
1650 | | - |
1651 | textEditMode = true; executed (the execution status of this line is deduced): textEditMode = true; | - |
1652 | } executed: } Execution Count:14 | 14 |
1653 | break; executed: break; Execution Count:28 | 28 |
1654 | case Html_hr: | - |
1655 | if (key == QLatin1String("width")) partially evaluated: key == QLatin1String("width") yes Evaluation Count:1 | no Evaluation Count:0 |
| 0-1 |
1656 | setWidthAttribute(&node->width, value); executed: setWidthAttribute(&node->width, value); Execution Count:1 | 1 |
1657 | break; executed: break; Execution Count:1 | 1 |
1658 | case Html_link: | - |
1659 | if (key == QLatin1String("href")) evaluated: key == QLatin1String("href") yes Evaluation Count:3 | yes Evaluation Count:3 |
| 3 |
1660 | linkHref = value; executed: linkHref = value; Execution Count:3 | 3 |
1661 | else if (key == QLatin1String("type")) partially evaluated: key == QLatin1String("type") yes Evaluation Count:3 | no Evaluation Count:0 |
| 0-3 |
1662 | linkType = value; executed: linkType = value; Execution Count:3 | 3 |
1663 | break; executed: break; Execution Count:6 | 6 |
1664 | default: | - |
1665 | break; executed: break; Execution Count:164 | 164 |
1666 | } | - |
1667 | | - |
1668 | if (key == QLatin1String("style")) { evaluated: key == QLatin1String("style") yes Evaluation Count:173 | yes Evaluation Count:277 |
| 173-277 |
1669 | #ifndef QT_NO_CSSPARSER | - |
1670 | node->parseStyleAttribute(value, resourceProvider); executed (the execution status of this line is deduced): node->parseStyleAttribute(value, resourceProvider); | - |
1671 | #endif | - |
1672 | } else if (key == QLatin1String("align")) { executed: } Execution Count:173 evaluated: key == QLatin1String("align") yes Evaluation Count:14 | yes Evaluation Count:263 |
| 14-263 |
1673 | value = value.toLower(); executed (the execution status of this line is deduced): value = value.toLower(); | - |
1674 | bool alignmentSet = true; executed (the execution status of this line is deduced): bool alignmentSet = true; | - |
1675 | | - |
1676 | if (value == QLatin1String("left")) evaluated: value == QLatin1String("left") yes Evaluation Count:2 | yes Evaluation Count:12 |
| 2-12 |
1677 | node->blockFormat.setAlignment(Qt::AlignLeft|Qt::AlignAbsolute); executed: node->blockFormat.setAlignment(Qt::AlignLeft|Qt::AlignAbsolute); Execution Count:2 | 2 |
1678 | else if (value == QLatin1String("right")) evaluated: value == QLatin1String("right") yes Evaluation Count:6 | yes Evaluation Count:6 |
| 6 |
1679 | node->blockFormat.setAlignment(Qt::AlignRight|Qt::AlignAbsolute); executed: node->blockFormat.setAlignment(Qt::AlignRight|Qt::AlignAbsolute); Execution Count:6 | 6 |
1680 | else if (value == QLatin1String("center")) evaluated: value == QLatin1String("center") yes Evaluation Count:3 | yes Evaluation Count:3 |
| 3 |
1681 | node->blockFormat.setAlignment(Qt::AlignHCenter); executed: node->blockFormat.setAlignment(Qt::AlignHCenter); Execution Count:3 | 3 |
1682 | else if (value == QLatin1String("justify")) partially evaluated: value == QLatin1String("justify") no Evaluation Count:0 | yes Evaluation Count:3 |
| 0-3 |
1683 | node->blockFormat.setAlignment(Qt::AlignJustify); never executed: node->blockFormat.setAlignment(Qt::AlignJustify); | 0 |
1684 | else | - |
1685 | alignmentSet = false; executed: alignmentSet = false; Execution Count:3 | 3 |
1686 | | - |
1687 | if (node->id == Html_img) { evaluated: node->id == Html_img yes Evaluation Count:6 | yes Evaluation Count:8 |
| 6-8 |
1688 | // HTML4 compat | - |
1689 | if (alignmentSet) { evaluated: alignmentSet yes Evaluation Count:3 | yes Evaluation Count:3 |
| 3 |
1690 | if (node->blockFormat.alignment() & Qt::AlignLeft) evaluated: node->blockFormat.alignment() & Qt::AlignLeft yes Evaluation Count:1 | yes Evaluation Count:2 |
| 1-2 |
1691 | node->cssFloat = QTextFrameFormat::FloatLeft; executed: node->cssFloat = QTextFrameFormat::FloatLeft; Execution Count:1 | 1 |
1692 | else if (node->blockFormat.alignment() & Qt::AlignRight) partially evaluated: node->blockFormat.alignment() & Qt::AlignRight yes Evaluation Count:2 | no Evaluation Count:0 |
| 0-2 |
1693 | node->cssFloat = QTextFrameFormat::FloatRight; executed: node->cssFloat = QTextFrameFormat::FloatRight; Execution Count:2 | 2 |
1694 | } else if (value == QLatin1String("middle")) { evaluated: value == QLatin1String("middle") yes Evaluation Count:1 | yes Evaluation Count:2 |
| 1-2 |
1695 | node->charFormat.setVerticalAlignment(QTextCharFormat::AlignMiddle); executed (the execution status of this line is deduced): node->charFormat.setVerticalAlignment(QTextCharFormat::AlignMiddle); | - |
1696 | } else if (value == QLatin1String("top")) { executed: } Execution Count:1 evaluated: value == QLatin1String("top") yes Evaluation Count:1 | yes Evaluation Count:1 |
| 1 |
1697 | node->charFormat.setVerticalAlignment(QTextCharFormat::AlignTop); executed (the execution status of this line is deduced): node->charFormat.setVerticalAlignment(QTextCharFormat::AlignTop); | - |
1698 | } executed: } Execution Count:1 | 1 |
1699 | } | - |
1700 | } else if (key == QLatin1String("valign")) { executed: } Execution Count:14 evaluated: key == QLatin1String("valign") yes Evaluation Count:6 | yes Evaluation Count:257 |
| 6-257 |
1701 | value = value.toLower(); executed (the execution status of this line is deduced): value = value.toLower(); | - |
1702 | if (value == QLatin1String("top")) evaluated: value == QLatin1String("top") yes Evaluation Count:2 | yes Evaluation Count:4 |
| 2-4 |
1703 | node->charFormat.setVerticalAlignment(QTextCharFormat::AlignTop); executed: node->charFormat.setVerticalAlignment(QTextCharFormat::AlignTop); Execution Count:2 | 2 |
1704 | else if (value == QLatin1String("middle")) evaluated: value == QLatin1String("middle") yes Evaluation Count:2 | yes Evaluation Count:2 |
| 2 |
1705 | node->charFormat.setVerticalAlignment(QTextCharFormat::AlignMiddle); executed: node->charFormat.setVerticalAlignment(QTextCharFormat::AlignMiddle); Execution Count:2 | 2 |
1706 | else if (value == QLatin1String("bottom")) partially evaluated: value == QLatin1String("bottom") yes Evaluation Count:2 | no Evaluation Count:0 |
| 0-2 |
1707 | node->charFormat.setVerticalAlignment(QTextCharFormat::AlignBottom); executed: node->charFormat.setVerticalAlignment(QTextCharFormat::AlignBottom); Execution Count:2 | 2 |
1708 | } else if (key == QLatin1String("dir")) { evaluated: key == QLatin1String("dir") yes Evaluation Count:5 | yes Evaluation Count:252 |
| 5-252 |
1709 | value = value.toLower(); executed (the execution status of this line is deduced): value = value.toLower(); | - |
1710 | if (value == QLatin1String("ltr")) evaluated: value == QLatin1String("ltr") yes Evaluation Count:2 | yes Evaluation Count:3 |
| 2-3 |
1711 | node->blockFormat.setLayoutDirection(Qt::LeftToRight); executed: node->blockFormat.setLayoutDirection(Qt::LeftToRight); Execution Count:2 | 2 |
1712 | else if (value == QLatin1String("rtl")) partially evaluated: value == QLatin1String("rtl") yes Evaluation Count:3 | no Evaluation Count:0 |
| 0-3 |
1713 | node->blockFormat.setLayoutDirection(Qt::RightToLeft); executed: node->blockFormat.setLayoutDirection(Qt::RightToLeft); Execution Count:3 | 3 |
1714 | } else if (key == QLatin1String("title")) { evaluated: key == QLatin1String("title") yes Evaluation Count:1 | yes Evaluation Count:251 |
| 1-251 |
1715 | node->charFormat.setToolTip(value); executed (the execution status of this line is deduced): node->charFormat.setToolTip(value); | - |
1716 | } else if (key == QLatin1String("id")) { executed: } Execution Count:1 evaluated: key == QLatin1String("id") yes Evaluation Count:7 | yes Evaluation Count:244 |
| 1-244 |
1717 | node->charFormat.setAnchor(true); executed (the execution status of this line is deduced): node->charFormat.setAnchor(true); | - |
1718 | node->charFormat.setAnchorName(value); executed (the execution status of this line is deduced): node->charFormat.setAnchorName(value); | - |
1719 | } executed: } Execution Count:7 | 7 |
1720 | } | - |
1721 | | - |
1722 | #ifndef QT_NO_CSSPARSER | - |
1723 | if (resourceProvider && !linkHref.isEmpty() && linkType == QLatin1String("text/css")) partially evaluated: resourceProvider yes Evaluation Count:1593 | no Evaluation Count:0 |
evaluated: !linkHref.isEmpty() yes Evaluation Count:3 | yes Evaluation Count:1590 |
partially evaluated: linkType == QLatin1String("text/css") yes Evaluation Count:3 | no Evaluation Count:0 |
| 0-1593 |
1724 | importStyleSheet(linkHref); executed: importStyleSheet(linkHref); Execution Count:3 | 3 |
1725 | #endif | - |
1726 | } executed: } Execution Count:1593 | 1593 |
1727 | | - |
1728 | #ifndef QT_NO_CSSPARSER | - |
1729 | class QTextHtmlStyleSelector : public QCss::StyleSelector | - |
1730 | { | - |
1731 | public: | - |
1732 | inline QTextHtmlStyleSelector(const QTextHtmlParser *parser) | - |
1733 | : parser(parser) { nameCaseSensitivity = Qt::CaseInsensitive; } executed: } Execution Count:1593 | 1593 |
1734 | | - |
1735 | virtual QStringList nodeNames(NodePtr node) const; | - |
1736 | virtual QString attribute(NodePtr node, const QString &name) const; | - |
1737 | virtual bool hasAttributes(NodePtr node) const; | - |
1738 | virtual bool isNullNode(NodePtr node) const; | - |
1739 | virtual NodePtr parentNode(NodePtr node) const; | - |
1740 | virtual NodePtr previousSiblingNode(NodePtr node) const; | - |
1741 | virtual NodePtr duplicateNode(NodePtr node) const; | - |
1742 | virtual void freeNode(NodePtr node) const; | - |
1743 | | - |
1744 | private: | - |
1745 | const QTextHtmlParser *parser; | - |
1746 | }; | - |
1747 | | - |
1748 | QStringList QTextHtmlStyleSelector::nodeNames(NodePtr node) const | - |
1749 | { | - |
1750 | return QStringList(parser->at(node.id).tag.toLower()); executed: return QStringList(parser->at(node.id).tag.toLower()); Execution Count:190 | 190 |
1751 | } | - |
1752 | | - |
1753 | #endif // QT_NO_CSSPARSER | - |
1754 | | - |
1755 | static inline int findAttribute(const QStringList &attributes, const QString &name) | - |
1756 | { | - |
1757 | int idx = -1; executed (the execution status of this line is deduced): int idx = -1; | - |
1758 | do { | - |
1759 | idx = attributes.indexOf(name, idx + 1); executed (the execution status of this line is deduced): idx = attributes.indexOf(name, idx + 1); | - |
1760 | } while (idx != -1 && (idx % 2 == 1)); executed: } Execution Count:17 evaluated: idx != -1 yes Evaluation Count:16 | yes Evaluation Count:1 |
evaluated: (idx % 2 == 1) yes Evaluation Count:1 | yes Evaluation Count:15 |
| 1-17 |
1761 | return idx; executed: return idx; Execution Count:16 | 16 |
1762 | } | - |
1763 | | - |
1764 | #ifndef QT_NO_CSSPARSER | - |
1765 | | - |
1766 | QString QTextHtmlStyleSelector::attribute(NodePtr node, const QString &name) const | - |
1767 | { | - |
1768 | const QStringList &attributes = parser->at(node.id).attributes; executed (the execution status of this line is deduced): const QStringList &attributes = parser->at(node.id).attributes; | - |
1769 | const int idx = findAttribute(attributes, name); executed (the execution status of this line is deduced): const int idx = findAttribute(attributes, name); | - |
1770 | if (idx == -1) evaluated: idx == -1 yes Evaluation Count:1 | yes Evaluation Count:15 |
| 1-15 |
1771 | return QString(); executed: return QString(); Execution Count:1 | 1 |
1772 | return attributes.at(idx + 1); executed: return attributes.at(idx + 1); Execution Count:15 | 15 |
1773 | } | - |
1774 | | - |
1775 | bool QTextHtmlStyleSelector::hasAttributes(NodePtr node) const | - |
1776 | { | - |
1777 | const QStringList &attributes = parser->at(node.id).attributes; executed (the execution status of this line is deduced): const QStringList &attributes = parser->at(node.id).attributes; | - |
1778 | return !attributes.isEmpty(); executed: return !attributes.isEmpty(); Execution Count:16 | 16 |
1779 | } | - |
1780 | | - |
1781 | bool QTextHtmlStyleSelector::isNullNode(NodePtr node) const | - |
1782 | { | - |
1783 | return node.id == 0; never executed: return node.id == 0; | 0 |
1784 | } | - |
1785 | | - |
1786 | QCss::StyleSelector::NodePtr QTextHtmlStyleSelector::parentNode(NodePtr node) const | - |
1787 | { | - |
1788 | NodePtr parent; never executed (the execution status of this line is deduced): NodePtr parent; | - |
1789 | parent.id = 0; never executed (the execution status of this line is deduced): parent.id = 0; | - |
1790 | if (node.id) { | 0 |
1791 | parent.id = parser->at(node.id).parent; never executed (the execution status of this line is deduced): parent.id = parser->at(node.id).parent; | - |
1792 | } | 0 |
1793 | return parent; never executed: return parent; | 0 |
1794 | } | - |
1795 | | - |
1796 | QCss::StyleSelector::NodePtr QTextHtmlStyleSelector::duplicateNode(NodePtr node) const | - |
1797 | { | - |
1798 | return node; never executed: return node; | 0 |
1799 | } | - |
1800 | | - |
1801 | QCss::StyleSelector::NodePtr QTextHtmlStyleSelector::previousSiblingNode(NodePtr node) const | - |
1802 | { | - |
1803 | NodePtr sibling; never executed (the execution status of this line is deduced): NodePtr sibling; | - |
1804 | sibling.id = 0; never executed (the execution status of this line is deduced): sibling.id = 0; | - |
1805 | if (!node.id) never evaluated: !node.id | 0 |
1806 | return sibling; never executed: return sibling; | 0 |
1807 | int parent = parser->at(node.id).parent; never executed (the execution status of this line is deduced): int parent = parser->at(node.id).parent; | - |
1808 | if (!parent) | 0 |
1809 | return sibling; never executed: return sibling; | 0 |
1810 | const int childIdx = parser->at(parent).children.indexOf(node.id); never executed (the execution status of this line is deduced): const int childIdx = parser->at(parent).children.indexOf(node.id); | - |
1811 | if (childIdx <= 0) never evaluated: childIdx <= 0 | 0 |
1812 | return sibling; never executed: return sibling; | 0 |
1813 | sibling.id = parser->at(parent).children.at(childIdx - 1); never executed (the execution status of this line is deduced): sibling.id = parser->at(parent).children.at(childIdx - 1); | - |
1814 | return sibling; never executed: return sibling; | 0 |
1815 | } | - |
1816 | | - |
1817 | void QTextHtmlStyleSelector::freeNode(NodePtr) const | - |
1818 | { | - |
1819 | } | - |
1820 | | - |
1821 | void QTextHtmlParser::resolveStyleSheetImports(const QCss::StyleSheet &sheet) | - |
1822 | { | - |
1823 | for (int i = 0; i < sheet.importRules.count(); ++i) { evaluated: i < sheet.importRules.count() yes Evaluation Count:5 | yes Evaluation Count:45 |
| 5-45 |
1824 | const QCss::ImportRule &rule = sheet.importRules.at(i); executed (the execution status of this line is deduced): const QCss::ImportRule &rule = sheet.importRules.at(i); | - |
1825 | if (rule.media.isEmpty() evaluated: rule.media.isEmpty() yes Evaluation Count:4 | yes Evaluation Count:1 |
| 1-4 |
1826 | || rule.media.contains(QLatin1String("screen"), Qt::CaseInsensitive)) partially evaluated: rule.media.contains(QLatin1String("screen"), Qt::CaseInsensitive) yes Evaluation Count:1 | no Evaluation Count:0 |
| 0-1 |
1827 | importStyleSheet(rule.href); executed: importStyleSheet(rule.href); Execution Count:5 | 5 |
1828 | } executed: } Execution Count:5 | 5 |
1829 | } executed: } Execution Count:45 | 45 |
1830 | | - |
1831 | void QTextHtmlParser::importStyleSheet(const QString &href) | - |
1832 | { | - |
1833 | if (!resourceProvider) partially evaluated: !resourceProvider no Evaluation Count:0 | yes Evaluation Count:8 |
| 0-8 |
1834 | return; | 0 |
1835 | for (int i = 0; i < externalStyleSheets.count(); ++i) evaluated: i < externalStyleSheets.count() yes Evaluation Count:6 | yes Evaluation Count:8 |
| 6-8 |
1836 | if (externalStyleSheets.at(i).url == href) partially evaluated: externalStyleSheets.at(i).url == href no Evaluation Count:0 | yes Evaluation Count:6 |
| 0-6 |
1837 | return; | 0 |
1838 | | - |
1839 | QVariant res = resourceProvider->resource(QTextDocument::StyleSheetResource, href); never executed (the execution status of this line is deduced): QVariant res = resourceProvider->resource(QTextDocument::StyleSheetResource, href); | - |
1840 | QString css; never executed (the execution status of this line is deduced): QString css; | - |
1841 | if (res.type() == QVariant::String) { partially evaluated: res.type() == QVariant::String yes Evaluation Count:8 | no Evaluation Count:0 |
| 0-8 |
1842 | css = res.toString(); executed (the execution status of this line is deduced): css = res.toString(); | - |
1843 | } else if (res.type() == QVariant::ByteArray) { executed: } Execution Count:8 never evaluated: res.type() == QVariant::ByteArray | 0-8 |
1844 | // #### detect @charset | - |
1845 | css = QString::fromUtf8(res.toByteArray()); never executed (the execution status of this line is deduced): css = QString::fromUtf8(res.toByteArray()); | - |
1846 | } | 0 |
1847 | if (!css.isEmpty()) { partially evaluated: !css.isEmpty() yes Evaluation Count:8 | no Evaluation Count:0 |
| 0-8 |
1848 | QCss::Parser parser(css); executed (the execution status of this line is deduced): QCss::Parser parser(css); | - |
1849 | QCss::StyleSheet sheet; executed (the execution status of this line is deduced): QCss::StyleSheet sheet; | - |
1850 | parser.parse(&sheet, Qt::CaseInsensitive); executed (the execution status of this line is deduced): parser.parse(&sheet, Qt::CaseInsensitive); | - |
1851 | externalStyleSheets.append(ExternalStyleSheet(href, sheet)); executed (the execution status of this line is deduced): externalStyleSheets.append(ExternalStyleSheet(href, sheet)); | - |
1852 | resolveStyleSheetImports(sheet); executed (the execution status of this line is deduced): resolveStyleSheetImports(sheet); | - |
1853 | } executed: } Execution Count:8 | 8 |
1854 | } executed: } Execution Count:8 | 8 |
1855 | | - |
1856 | QVector<QCss::Declaration> QTextHtmlParser::declarationsForNode(int node) const | - |
1857 | { | - |
1858 | QVector<QCss::Declaration> decls; executed (the execution status of this line is deduced): QVector<QCss::Declaration> decls; | - |
1859 | | - |
1860 | QTextHtmlStyleSelector selector(this); executed (the execution status of this line is deduced): QTextHtmlStyleSelector selector(this); | - |
1861 | | - |
1862 | int idx = 0; executed (the execution status of this line is deduced): int idx = 0; | - |
1863 | selector.styleSheets.resize((resourceProvider ? 1 : 0) executed (the execution status of this line is deduced): selector.styleSheets.resize((resourceProvider ? 1 : 0) | - |
1864 | + externalStyleSheets.count() executed (the execution status of this line is deduced): + externalStyleSheets.count() | - |
1865 | + inlineStyleSheets.count()); executed (the execution status of this line is deduced): + inlineStyleSheets.count()); | - |
1866 | if (resourceProvider) partially evaluated: resourceProvider yes Evaluation Count:1593 | no Evaluation Count:0 |
| 0-1593 |
1867 | selector.styleSheets[idx++] = resourceProvider->docHandle()->parsedDefaultStyleSheet; executed: selector.styleSheets[idx++] = resourceProvider->docHandle()->parsedDefaultStyleSheet; Execution Count:1593 | 1593 |
1868 | | - |
1869 | for (int i = 0; i < externalStyleSheets.count(); ++i, ++idx) evaluated: i < externalStyleSheets.count() yes Evaluation Count:8 | yes Evaluation Count:1593 |
| 8-1593 |
1870 | selector.styleSheets[idx] = externalStyleSheets.at(i).sheet; executed: selector.styleSheets[idx] = externalStyleSheets.at(i).sheet; Execution Count:8 | 8 |
1871 | | - |
1872 | for (int i = 0; i < inlineStyleSheets.count(); ++i, ++idx) evaluated: i < inlineStyleSheets.count() yes Evaluation Count:117 | yes Evaluation Count:1593 |
| 117-1593 |
1873 | selector.styleSheets[idx] = inlineStyleSheets.at(i); executed: selector.styleSheets[idx] = inlineStyleSheets.at(i); Execution Count:117 | 117 |
1874 | | - |
1875 | selector.medium = QLatin1String("screen"); executed (the execution status of this line is deduced): selector.medium = QLatin1String("screen"); | - |
1876 | | - |
1877 | QCss::StyleSelector::NodePtr n; executed (the execution status of this line is deduced): QCss::StyleSelector::NodePtr n; | - |
1878 | n.id = node; executed (the execution status of this line is deduced): n.id = node; | - |
1879 | | - |
1880 | const char *extraPseudo = 0; executed (the execution status of this line is deduced): const char *extraPseudo = 0; | - |
1881 | if (nodes.at(node).id == Html_a && nodes.at(node).hasHref) evaluated: nodes.at(node).id == Html_a yes Evaluation Count:67 | yes Evaluation Count:1526 |
evaluated: nodes.at(node).hasHref yes Evaluation Count:46 | yes Evaluation Count:21 |
| 21-1526 |
1882 | extraPseudo = "link"; executed: extraPseudo = "link"; Execution Count:46 | 46 |
1883 | decls = selector.declarationsForNode(n, extraPseudo); executed (the execution status of this line is deduced): decls = selector.declarationsForNode(n, extraPseudo); | - |
1884 | | - |
1885 | return decls; executed: return decls; Execution Count:1593 | 1593 |
1886 | } | - |
1887 | | - |
1888 | bool QTextHtmlParser::nodeIsChildOf(int i, QTextHTMLElements id) const | - |
1889 | { | - |
1890 | while (i) { | 0 |
1891 | if (at(i).id == id) never evaluated: at(i).id == id | 0 |
1892 | return true; never executed: return true; | 0 |
1893 | i = at(i).parent; never executed (the execution status of this line is deduced): i = at(i).parent; | - |
1894 | } | 0 |
1895 | return false; never executed: return false; | 0 |
1896 | } | - |
1897 | | - |
1898 | QT_END_NAMESPACE | - |
1899 | #endif // QT_NO_CSSPARSER | - |
1900 | | - |
1901 | #endif // QT_NO_TEXTHTMLPARSER | - |
1902 | | - |
| | |