Mercurial > addons > firefox-addons > feed-preview
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 |