From cdf84b50eefdae67e71f91edba8cd52f9c2aa2d5 Mon Sep 17 00:00:00 2001 From: Aurelien David Date: Thu, 25 Oct 2018 22:03:08 +0200 Subject: [PATCH] initial commit --- background.js | 23 ++++++++ icons/file.png | Bin 0 -> 6917 bytes icons/rss-48.png | Bin 0 -> 12053 bytes manifest.json | 29 ++++++++++ preview.css | 116 ++++++++++++++++++++++++++++++++++++++++ preview.html | 17 ++++++ preview.js | 136 +++++++++++++++++++++++++++++++++++++++++++++++ rss.xsl | 77 +++++++++++++++++++++++++++ rsspreview.js | 28 ++++++++++ 9 files changed, 426 insertions(+) create mode 100644 background.js create mode 100644 icons/file.png create mode 100644 icons/rss-48.png create mode 100644 manifest.json create mode 100644 preview.css create mode 100644 preview.html create mode 100644 preview.js create mode 100644 rss.xsl create mode 100644 rsspreview.js diff --git a/background.js b/background.js new file mode 100644 index 0000000..0ff5f1b --- /dev/null +++ b/background.js @@ -0,0 +1,23 @@ + +function detectFeed(event) { + + // force application/rss+xml to text/xml so the browser displays it instead of downloading + + for (var header of event.responseHeaders) { + if (header.name.toLowerCase() == "content-type") { + header.value = header.value.replace(/application\/(rss|atom)\+xml/,'text/xml'); + break; + } + } + + return { + responseHeaders: event.responseHeaders + }; + +} + +browser.webRequest.onHeadersReceived.addListener( + detectFeed, + { urls: [""], types: ["main_frame"] }, + ["blocking", "responseHeaders"] +) diff --git a/icons/file.png b/icons/file.png new file mode 100644 index 0000000000000000000000000000000000000000..9c4c43ae4aa6edf9f974994bc14e419c1086d2d3 GIT binary patch literal 6917 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 literal 0 HcmV?d00001 diff --git a/icons/rss-48.png b/icons/rss-48.png new file mode 100644 index 0000000000000000000000000000000000000000..644966a2dcd17c3b62e6a7699eaefd1a8f1451ba GIT binary patch literal 12053 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 blFNsd)|uoe#At3NqA;0lZjh+AZ0~;nPbqfe literal 0 HcmV?d00001 diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..9b8a67e --- /dev/null +++ b/manifest.json @@ -0,0 +1,29 @@ +{ + + "manifest_version": 2, + "name": "RSSPreview", + "version": "1.0", + + "description": "Preview RSS feeds in browser", + + "icons": { + "48": "icons/rss-48.png" + }, + + "background": { + "scripts": ["background.js"] + }, + + + "content_scripts": [ + { + "matches": [""], + "js": ["rsspreview.js"] + } + ], + + "web_accessible_resources": ["preview.html", "preview.js", "preview.css", "rss.xsl", "icons/file.png"], + + "permissions": ["", "webRequest", "webRequestBlocking"] + +} diff --git a/preview.css b/preview.css new file mode 100644 index 0000000..81488fb --- /dev/null +++ b/preview.css @@ -0,0 +1,116 @@ + + +html { + font: 3mm tahoma,arial,helvetica,sans-serif; + background-color: rgb(240, 240, 240); +} + +body { + margin: 0; + padding: 0 3em; + font: message-box; +} + +h1 { + font-size: 160%; + border-bottom: 2px solid ThreeDLightShadow; + margin: 0 0 .2em 0; +} + +h1 a { + color: inherit; + text-decoration: none; +} + +h1 a:hover { + text-decoration: underline; +} + +h2 { + color: GrayText; + font-size: 110%; + font-weight: normal; + margin: 0 0 .6em 0; +} + +a[href] img { + border: none; +} + +#feedBody { + border: 1px solid THreeDShadow; + padding: 3em; + padding-inline-start: 30px; + margin: 2em auto; + background-color: white; +} + +#feedTitleLink { + float: right; + margin-inline-start: .6em; + margin-inline-end: 0; + margin-top: 0; + margin-bottom: 0; +} + + + +#feedTitleContainer { + margin-inline-start: 0; + margin-inline-end: .6em; + margin-top: 0; + margin-bottom: 0; +} + +#feedTitleImage { + margin-inline-start: .6em; + margin-inline-end: 0; + margin-top: 0; + margin-bottom: 0; + max-width: 300px; + max-height: 150px; +} + +.feedEntryContent { + font-size: 110%; +} + +.link { + color: #0000FF; + text-decoration: underline; + cursor: pointer; +} + +.link:hover:active { + color: #FF0000; +} + +.lastUpdated { + font-size: 85%; + font-weight: normal; +} + +.type-icon { + vertical-align: bottom; + height: 16px; + width: 16px; +} + +.enclosures { + border: 1px solid THreeDShadow; + padding: 1em; + margin: 1em auto; + background-color: rgb(240, 240, 240); +} + +.enclosure { + vertical-align: middle; + margin-left: 2px; +} + +.enclosureIcon { + vertical-align: bottom; + height: 16px; + width: 16px; + margin-right: 3px; +} diff --git a/preview.html b/preview.html new file mode 100644 index 0000000..0f0388d --- /dev/null +++ b/preview.html @@ -0,0 +1,17 @@ + + + + + + + + + + + + +
+ + + + diff --git a/preview.js b/preview.js new file mode 100644 index 0000000..d82cd48 --- /dev/null +++ b/preview.js @@ -0,0 +1,136 @@ + +document.addEventListener('DOMContentLoaded', function () { + main(); +}); + +function getxml(url) { + + var xhttp = new XMLHttpRequest(); + xhttp.open("GET", url, false); + xhttp.send(null); + return xhttp.responseXML; +} + + +function xhrxml(url, cb) { + + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, true); + + xhr.responseType = 'document'; + xhr.overrideMimeType('text/xml'); + + xhr.onload = function () { + if (xhr.readyState === xhr.DONE) { + if (xhr.status === 200) { + cb(xhr.responseXML); + } + } + }; + + xhr.send(null); + +} + +function applyxsl(xmlin, xsl, node) { + + var xsltProcessor = new XSLTProcessor(); + xsltProcessor.importStylesheet(xsl); + + var fragment = xsltProcessor.transformToFragment(xmlin, document); + node.appendChild(fragment); + +} + +function formatdescriptions() { + + // unescapes descriptions to html + + var tohtml = document.getElementsByClassName("feedEntryContent"); + for (var i = 0; i 0) + i = Math.floor( Math.log(size) / Math.log(1024) ); + return ( size / Math.pow(1024, i) ).toFixed(2) * 1 + ' ' + ['B', 'kB', 'MB', 'GB', 'TB'][i]; + }; + + var encsz = document.getElementsByClassName("enclosureSize"); + for (var i = 0; i + + + + + + + + + +
+ + + +
+

+ + + +

+

+ +
+
+ + +
+ + + +
+ +

+ + + + + + + + + + + +
+

+
+ +
+
+ + +
+ + + (, ) +
+ +
+
+ +
+
+ +
+ +
+ +
+ + + + + + +
diff --git a/rsspreview.js b/rsspreview.js new file mode 100644 index 0000000..3056bd2 --- /dev/null +++ b/rsspreview.js @@ -0,0 +1,28 @@ +(function() { + /** + * Check and set a global guard variable. + * If this content script is injected into the same page again, + * it will do nothing next time. + */ + if (window.hasRun) { + console.log("already run"); + return; + } + window.hasRun = true; + + const rootName = document.getRootNode().documentElement.nodeName; + + + if (rootName == "rss" || rootName == "channel" || rootName == "feed") { + + var feed_url = window.location.href; + + var url = "preview.html?" + encodeURIComponent(feed_url); + url = chrome.extension.getURL(url); + + // redirect to preview page with feed url as query string + window.location.replace(url); + + } + +})();