comparison content_scripts/feed-preview.js @ 5:341a0f4b7ce0

Handle feed entry content normalization with a setter
author Guido Berhoerster <guido+feed-preview@berhoerster.name>
date Sun, 04 Nov 2018 10:03:05 +0100
parents 086ee559acbb
children
comparison
equal deleted inserted replaced
4:086ee559acbb 5:341a0f4b7ce0
39 if (!ALLOWED_PROTOCOLS.has(url.protocol)) { 39 if (!ALLOWED_PROTOCOLS.has(url.protocol)) {
40 return null; 40 return null;
41 } 41 }
42 42
43 return url; 43 return url;
44 }
45
46 function normalizeHTML(text) {
47 let parsedDocument = (new DOMParser()).parseFromString(text, 'text/html');
48
49 let linkElement = parsedDocument.createElement('link');
50 linkElement.rel = 'stylesheet';
51 linkElement.href ='style/entry-content.css';
52 parsedDocument.head.appendChild(linkElement);
53
54 return (new XMLSerializer()).serializeToString(parsedDocument);
55 } 44 }
56 45
57 function feedNSResolver(prefix) { 46 function feedNSResolver(prefix) {
58 switch (prefix) { 47 switch (prefix) {
59 case 'atom': 48 case 'atom':
175 constructor(title = browser.i18n.getMessage('defaultFeedEntryTitle'), 164 constructor(title = browser.i18n.getMessage('defaultFeedEntryTitle'),
176 url = null, date = new Date(0), content = '', files = []) { 165 url = null, date = new Date(0), content = '', files = []) {
177 this.title = title; 166 this.title = title;
178 this.url = url; 167 this.url = url;
179 this.date = date; 168 this.date = date;
169 this._content;
180 this.content = content; 170 this.content = content;
181 this.files = files; 171 this.files = files;
172 }
173
174 set content(content) {
175 this._content = this.normalizeContent(content);
176 }
177
178 get content() {
179 return this._content;
180 }
181
182 normalizeContent(text) {
183 let parsedDocument = new DOMParser().parseFromString(text, 'text/html');
184
185 let linkElement = parsedDocument.createElement('link');
186 linkElement.rel = 'stylesheet';
187 linkElement.href ='style/entry-content.css';
188 parsedDocument.head.appendChild(linkElement);
189
190 return new XMLSerializer().serializeToString(parsedDocument);
182 } 191 }
183 } 192 }
184 193
185 class RSS1Entry extends FeedEntry { 194 class RSS1Entry extends FeedEntry {
186 constructor(feedDocument, itemElement) { 195 constructor(feedDocument, itemElement) {
221 } 230 }
222 231
223 let descriptionElement = feedQueryXPath(feedDocument, itemElement, 232 let descriptionElement = feedQueryXPath(feedDocument, itemElement,
224 './description'); 233 './description');
225 if (descriptionElement !== null) { 234 if (descriptionElement !== null) {
226 this.content = normalizeHTML(descriptionElement.textContent.trim()); 235 this.content = descriptionElement.textContent.trim();
227 } 236 }
228 237
229 for (let enclosureElement of 238 for (let enclosureElement of
230 feedQueryXPathAll(feedDocument, itemElement, './enclosure')) { 239 feedQueryXPathAll(feedDocument, itemElement, './enclosure')) {
231 try { 240 try {
269 if (contentType === null) { 278 if (contentType === null) {
270 contentType = 'text'; 279 contentType = 'text';
271 } 280 }
272 contentType = contentType.toLowerCase(); 281 contentType = contentType.toLowerCase();
273 if (contentType === 'xhtml') { 282 if (contentType === 'xhtml') {
274 this.content = normalizeHTML(contentElement.innerHTML); 283 this.content = contentElement.innerHTML;
275 } else if (contentType === 'html') { 284 } else if (contentType === 'html') {
276 this.content = normalizeHTML(contentElement.textContent); 285 this.content = contentElement.textContent;
277 } else { 286 } else {
278 let encodedContent = 287 let encodedContent =
279 encodeXML(contentElement.textContent.trim()); 288 encodeXML(contentElement.textContent.trim());
280 this.content = normalizeHTML(`<pre>${encodedContent}</pre>`); 289 this.content = `<pre>${encodedContent}</pre>`;
281 } 290 }
282 } 291 }
283 } 292 }
284 } 293 }
285 294