comparison content_scripts/feed-preview.js @ 4:086ee559acbb

Remove unused parameter from xpathQuery and rename functions Remove unused xpathMapping parameter from xpathQuery. Rename xpathQuery to feedQueryXPath, xpathQueryAll to feedQueryXPathAll, and nsMapper to feedNSResolver which better reflects their purpose.
author Guido Berhoerster <guido+feed-preview@berhoerster.name>
date Sun, 04 Nov 2018 09:54:37 +0100
parents 1c31f4102408
children 341a0f4b7ce0
comparison
equal deleted inserted replaced
3:93e4d2b8ae0b 4:086ee559acbb
52 parsedDocument.head.appendChild(linkElement); 52 parsedDocument.head.appendChild(linkElement);
53 53
54 return (new XMLSerializer()).serializeToString(parsedDocument); 54 return (new XMLSerializer()).serializeToString(parsedDocument);
55 } 55 }
56 56
57 function nsMapper(prefix) { 57 function feedNSResolver(prefix) {
58 switch (prefix) { 58 switch (prefix) {
59 case 'atom': 59 case 'atom':
60 return 'http://www.w3.org/2005/Atom' 60 return 'http://www.w3.org/2005/Atom'
61 case 'rss': 61 case 'rss':
62 return 'http://my.netscape.com/rdf/simple/0.9/' 62 return 'http://my.netscape.com/rdf/simple/0.9/'
63 } 63 }
64 return null; 64 return null;
65 } 65 }
66 66
67 function xpathQuery(doc, scopeElement, xpathQuery, nsMapping) { 67 function feedQueryXPath(feedDocument, scopeElement, xpathQuery) {
68 return doc.evaluate(xpathQuery, scopeElement, nsMapper, 68 return feedDocument.evaluate(xpathQuery, scopeElement, feedNSResolver,
69 XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; 69 XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
70 } 70 }
71 71
72 function xpathQueryAll(doc, scopeElement, xpathQuery, nsMapping) { 72 function feedQueryXPathAll(feedDocument, scopeElement, xpathQuery) {
73 let result = doc.evaluate(xpathQuery, scopeElement, nsMapper, 73 let result = feedDocument.evaluate(xpathQuery, scopeElement, feedNSResolver,
74 XPathResult.ORDERED_NODE_ITERATOR_TYPE, null); 74 XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
75 let nodes = []; 75 let nodes = [];
76 for (let node = result.iterateNext(); node !== null; 76 for (let node = result.iterateNext(); node !== null;
77 node = result.iterateNext()) { 77 node = result.iterateNext()) {
78 nodes.push(node); 78 nodes.push(node);
79 } 79 }
80 80
81 return nodes; 81 return nodes;
82 } 82 }
83 83
88 } 88 }
89 } 89 }
90 90
91 class RSS1Logo extends FeedLogo { 91 class RSS1Logo extends FeedLogo {
92 constructor(feedDocument, imageElement) { 92 constructor(feedDocument, imageElement) {
93 let urlElement = xpathQuery(feedDocument, imageElement, './rss:url'); 93 let urlElement = feedQueryXPath(feedDocument, imageElement,
94 './rss:url');
94 if (urlElement === null) { 95 if (urlElement === null) {
95 throw new TypeError('missing <url> element in <logo> element'); 96 throw new TypeError('missing <url> element in <logo> element');
96 } 97 }
97 let url = parseURL(urlElement.textContent.trim()); 98 let url = parseURL(urlElement.textContent.trim());
98 if (url === null) { 99 if (url === null) {
99 throw new TypeError('invalid URL in <logo> element'); 100 throw new TypeError('invalid URL in <logo> element');
100 } 101 }
101 super(url); 102 super(url);
102 103
103 let titleElement = xpathQuery(feedDocument, imageElement, 104 let titleElement = feedQueryXPath(feedDocument, imageElement,
104 './rss:title'); 105 './rss:title');
105 if (titleElement !== null) { 106 if (titleElement !== null) {
106 this.title = titleElement.textContent.trim(); 107 this.title = titleElement.textContent.trim();
107 } 108 }
108 } 109 }
109 } 110 }
110 111
111 class RSS2Logo extends FeedLogo { 112 class RSS2Logo extends FeedLogo {
112 constructor(feedDocument, imageElement) { 113 constructor(feedDocument, imageElement) {
113 let urlElement = xpathQuery(feedDocument, imageElement, './url'); 114 let urlElement = feedQueryXPath(feedDocument, imageElement, './url');
114 if (urlElement === null) { 115 if (urlElement === null) {
115 throw new TypeError('missing <url> element in <logo> element'); 116 throw new TypeError('missing <url> element in <logo> element');
116 } 117 }
117 let url = parseURL(urlElement.textContent.trim()); 118 let url = parseURL(urlElement.textContent.trim());
118 if (url === null) { 119 if (url === null) {
119 throw new TypeError('invalid URL in <logo> element'); 120 throw new TypeError('invalid URL in <logo> element');
120 } 121 }
121 super(url); 122 super(url);
122 123
123 let titleElement = xpathQuery(feedDocument, imageElement, './title'); 124 let titleElement = feedQueryXPath(feedDocument, imageElement,
125 './title');
124 if (titleElement !== null) { 126 if (titleElement !== null) {
125 this.title = titleElement.textContent.trim(); 127 this.title = titleElement.textContent.trim();
126 } 128 }
127 } 129 }
128 } 130 }
182 184
183 class RSS1Entry extends FeedEntry { 185 class RSS1Entry extends FeedEntry {
184 constructor(feedDocument, itemElement) { 186 constructor(feedDocument, itemElement) {
185 super(); 187 super();
186 188
187 let titleElement = xpathQuery(feedDocument, itemElement, './rss:title'); 189 let titleElement = feedQueryXPath(feedDocument, itemElement,
190 './rss:title');
188 if (titleElement !== null) { 191 if (titleElement !== null) {
189 this.title = titleElement.textContent; 192 this.title = titleElement.textContent;
190 } 193 }
191 194
192 let linkElement = xpathQuery(feedDocument, itemElement, './rss:link'); 195 let linkElement = feedQueryXPath(feedDocument, itemElement,
196 './rss:link');
193 if (linkElement !== null) { 197 if (linkElement !== null) {
194 this.url = parseURL(linkElement.textContent); 198 this.url = parseURL(linkElement.textContent);
195 } 199 }
196 } 200 }
197 } 201 }
198 202
199 class RSS2Entry extends FeedEntry { 203 class RSS2Entry extends FeedEntry {
200 constructor(feedDocument, itemElement) { 204 constructor(feedDocument, itemElement) {
201 super(); 205 super();
202 206
203 let titleElement = xpathQuery(feedDocument, itemElement, './title'); 207 let titleElement = feedQueryXPath(feedDocument, itemElement, './title');
204 if (titleElement !== null) { 208 if (titleElement !== null) {
205 this.title = titleElement.textContent; 209 this.title = titleElement.textContent;
206 } 210 }
207 211
208 let linkElement = xpathQuery(feedDocument, itemElement, './link'); 212 let linkElement = feedQueryXPath(feedDocument, itemElement, './link');
209 if (linkElement !== null) { 213 if (linkElement !== null) {
210 this.url = parseURL(linkElement.textContent); 214 this.url = parseURL(linkElement.textContent);
211 } 215 }
212 216
213 let pubDateElement = xpathQuery(feedDocument, itemElement, './pubDate'); 217 let pubDateElement = feedQueryXPath(feedDocument, itemElement,
218 './pubDate');
214 if (pubDateElement !== null) { 219 if (pubDateElement !== null) {
215 this.date = parseDate(pubDateElement.textContent); 220 this.date = parseDate(pubDateElement.textContent);
216 } 221 }
217 222
218 let descriptionElement = xpathQuery(feedDocument, itemElement, 223 let descriptionElement = feedQueryXPath(feedDocument, itemElement,
219 './description'); 224 './description');
220 if (descriptionElement !== null) { 225 if (descriptionElement !== null) {
221 this.content = normalizeHTML(descriptionElement.textContent.trim()); 226 this.content = normalizeHTML(descriptionElement.textContent.trim());
222 } 227 }
223 228
224 for (let enclosureElement of xpathQueryAll(feedDocument, itemElement, 229 for (let enclosureElement of
225 './enclosure')) { 230 feedQueryXPathAll(feedDocument, itemElement, './enclosure')) {
226 try { 231 try {
227 let entryFile = new RSS2EntryFile(enclosureElement); 232 let entryFile = new RSS2EntryFile(enclosureElement);
228 this.files.push(entryFile); 233 this.files.push(entryFile);
229 } catch (e) {} 234 } catch (e) {}
230 } 235 }
233 238
234 class AtomEntry extends FeedEntry { 239 class AtomEntry extends FeedEntry {
235 constructor(feedDocument, entryElement) { 240 constructor(feedDocument, entryElement) {
236 super(); 241 super();
237 242
238 let titleElement = xpathQuery(feedDocument, entryElement, 243 let titleElement = feedQueryXPath(feedDocument, entryElement,
239 './atom:title'); 244 './atom:title');
240 if (titleElement !== null) { 245 if (titleElement !== null) {
241 this.title = titleElement.textContent.trim(); 246 this.title = titleElement.textContent.trim();
242 } 247 }
243 248
244 let linkElement = xpathQuery(feedDocument, entryElement, 249 let linkElement = feedQueryXPath(feedDocument, entryElement,
245 './atom:link[@href][@rel="alternate"]'); 250 './atom:link[@href][@rel="alternate"]');
246 if (linkElement !== null) { 251 if (linkElement !== null) {
247 this.url = parseURL(linkElement.getAttribute('href')); 252 this.url = parseURL(linkElement.getAttribute('href'));
248 } 253 }
249 254
250 let updatedElement = xpathQuery(feedDocument, entryElement, 255 let updatedElement = feedQueryXPath(feedDocument, entryElement,
251 './atom:updated'); 256 './atom:updated');
252 if (updatedElement !== null) { 257 if (updatedElement !== null) {
253 this.date = parseDate(updatedElement.textContent); 258 this.date = parseDate(updatedElement.textContent);
254 } 259 }
255 260
256 let contentElement = xpathQuery(feedDocument, entryElement, 261 let contentElement = feedQueryXPath(feedDocument, entryElement,
257 './atom:content'); 262 './atom:content');
258 if (contentElement === null) { 263 if (contentElement === null) {
259 contentElement = xpathQuery(feedDocument, entryElement, 264 contentElement = feedQueryXPath(feedDocument, entryElement,
260 './atom:summary'); 265 './atom:summary');
261 } 266 }
262 if (contentElement !== null) { 267 if (contentElement !== null) {
263 let contentType = contentElement.getAttribute('type'); 268 let contentType = contentElement.getAttribute('type');
264 if (contentType === null) { 269 if (contentType === null) {
406 class RSS1Feed extends Feed { 411 class RSS1Feed extends Feed {
407 constructor(feedDocument) { 412 constructor(feedDocument) {
408 super(); 413 super();
409 414
410 let documentElement = feedDocument.documentElement; 415 let documentElement = feedDocument.documentElement;
411 let titleElement = xpathQuery(feedDocument, documentElement, 416 let titleElement = feedQueryXPath(feedDocument, documentElement,
412 './rss:channel/rss:title'); 417 './rss:channel/rss:title');
413 if (titleElement !== null) { 418 if (titleElement !== null) {
414 this.title = titleElement.textContent; 419 this.title = titleElement.textContent;
415 } 420 }
416 421
417 let descriptionElement = xpathQuery(feedDocument, documentElement, 422 let descriptionElement = feedQueryXPath(feedDocument, documentElement,
418 './channel/description'); 423 './channel/description');
419 if (descriptionElement !== null) { 424 if (descriptionElement !== null) {
420 this.subtitle = descriptionElement.textContent; 425 this.subtitle = descriptionElement.textContent;
421 } 426 }
422 427
423 let imageElement = xpathQuery(feedDocument, documentElement, 428 let imageElement = feedQueryXPath(feedDocument, documentElement,
424 './rss:image'); 429 './rss:image');
425 if (imageElement !== null) { 430 if (imageElement !== null) {
426 try { 431 try {
427 let logo = new RSS1Logo(feedDocument, imageElement); 432 let logo = new RSS1Logo(feedDocument, imageElement);
428 this.logo = logo; 433 this.logo = logo;
429 } catch (e) {} 434 } catch (e) {}
430 } 435 }
431 436
432 let itemElements = xpathQueryAll(feedDocument, documentElement, 437 let itemElements = feedQueryXPathAll(feedDocument, documentElement,
433 './rss:item'); 438 './rss:item');
434 for (let itemElement of itemElements) { 439 for (let itemElement of itemElements) {
435 let entry = new RSS1Entry(feedDocument, itemElement); 440 let entry = new RSS1Entry(feedDocument, itemElement);
436 if (typeof entry !== 'undefined') { 441 if (typeof entry !== 'undefined') {
437 this.entries.push(entry); 442 this.entries.push(entry);
443 class RSS2Feed extends Feed { 448 class RSS2Feed extends Feed {
444 constructor(feedDocument) { 449 constructor(feedDocument) {
445 super(); 450 super();
446 451
447 let documentElement = feedDocument.documentElement; 452 let documentElement = feedDocument.documentElement;
448 let titleElement = xpathQuery(feedDocument, documentElement, 453 let titleElement = feedQueryXPath(feedDocument, documentElement,
449 './channel/title'); 454 './channel/title');
450 if (titleElement !== null) { 455 if (titleElement !== null) {
451 this.title = titleElement.textContent; 456 this.title = titleElement.textContent;
452 } 457 }
453 458
454 let descriptionElement = xpathQuery(feedDocument, documentElement, 459 let descriptionElement = feedQueryXPath(feedDocument, documentElement,
455 './channel/description'); 460 './channel/description');
456 if (descriptionElement !== null) { 461 if (descriptionElement !== null) {
457 this.subtitle = descriptionElement.textContent; 462 this.subtitle = descriptionElement.textContent;
458 } 463 }
459 464
460 let imageElement = xpathQuery(feedDocument, documentElement, 465 let imageElement = feedQueryXPath(feedDocument, documentElement,
461 './channel/image'); 466 './channel/image');
462 if (imageElement !== null) { 467 if (imageElement !== null) {
463 try { 468 try {
464 let logo = new RSS2Logo(feedDocument, imageElement); 469 let logo = new RSS2Logo(feedDocument, imageElement);
465 this.logo = logo; 470 this.logo = logo;
466 } catch (e) {} 471 } catch (e) {}
467 } 472 }
468 473
469 let itemElements = xpathQueryAll(feedDocument, documentElement, 474 let itemElements = feedQueryXPathAll(feedDocument, documentElement,
470 './channel/item'); 475 './channel/item');
471 for (let itemElement of itemElements) { 476 for (let itemElement of itemElements) {
472 let entry = new RSS2Entry(feedDocument, itemElement); 477 let entry = new RSS2Entry(feedDocument, itemElement);
473 if (typeof entry !== 'undefined') { 478 if (typeof entry !== 'undefined') {
474 this.entries.push(entry); 479 this.entries.push(entry);
480 class AtomFeed extends Feed { 485 class AtomFeed extends Feed {
481 constructor(feedDocument, atomVersion) { 486 constructor(feedDocument, atomVersion) {
482 super(); 487 super();
483 488
484 let documentElement = feedDocument.documentElement; 489 let documentElement = feedDocument.documentElement;
485 let titleElement = xpathQuery(feedDocument, documentElement, 490 let titleElement = feedQueryXPath(feedDocument, documentElement,
486 './atom:title'); 491 './atom:title');
487 if (titleElement !== null) { 492 if (titleElement !== null) {
488 this.title = titleElement.textContent.trim(); 493 this.title = titleElement.textContent.trim();
489 } 494 }
490 495
491 let subtitleElement = xpathQuery(feedDocument, documentElement, 496 let subtitleElement = feedQueryXPath(feedDocument, documentElement,
492 './atom:subtitle'); 497 './atom:subtitle');
493 if (subtitleElement !== null) { 498 if (subtitleElement !== null) {
494 this.subtitle = subtitleElement.textContent.trim(); 499 this.subtitle = subtitleElement.textContent.trim();
495 } 500 }
496 501
497 let logoElement = xpathQuery(feedDocument, documentElement, 502 let logoElement = feedQueryXPath(feedDocument, documentElement,
498 './atom:logo'); 503 './atom:logo');
499 if (logoElement !== null) { 504 if (logoElement !== null) {
500 try { 505 try {
501 let logo = new AtomLogo(logoElement); 506 let logo = new AtomLogo(logoElement);
502 this.logo = logo; 507 this.logo = logo;
503 } catch (e) {} 508 } catch (e) {}
504 } 509 }
505 510
506 let entryElements = xpathQueryAll(feedDocument, documentElement, 511 let entryElements = feedQueryXPathAll(feedDocument, documentElement,
507 './atom:entry'); 512 './atom:entry');
508 for (let entryElement of entryElements) { 513 for (let entryElement of entryElements) {
509 this.entries.push(new AtomEntry(feedDocument, entryElement)); 514 this.entries.push(new AtomEntry(feedDocument, entryElement));
510 } 515 }
511 } 516 }