feat: display page rss in popup

This commit is contained in:
DIYgod 2019-07-19 13:30:26 +08:00
parent 60e2d90a9c
commit 4ad1efe18e
No known key found for this signature in database
GPG Key ID: EC0B76A252D3EF67
9 changed files with 171 additions and 53 deletions

View File

@ -35,6 +35,7 @@
"mini-css-extract-plugin": "0.8.0",
"postcss-loader": "3.0.0",
"svg-inline-loader": "0.8.0",
"template-string-optimize-loader": "^3.0.0",
"url-loader": "2.0.1",
"webpack": "4.36.1",
"webpack-cli": "3.3.6"

View File

@ -1,10 +1,22 @@
<html>
<head>
<meta charset="UTF-8">
<title>RSSHub radar</title>
<style href="./popup.css"></style>
<link rel="stylesheet" href="./popup.css">
</head>
<body>
<h1>RSSHub radar</h1>
<div class="page-rss">
<h2>当前页面 RSS</h2>
<ul></ul>
</div>
<div class="page-rsshub">
<h2>当前页面 RSSHub</h2>
<ul></ul>
</div>
<div class="website-rsshub">
<h2>当前网站 RSSHub</h2>
<ul></ul>
</div>
<script src="./popup.js"></script>
</body>
</html>

View File

3
src/css/popup.less Normal file
View File

@ -0,0 +1,3 @@
body {
width: 300px;
}

View File

@ -1,13 +1,13 @@
window.pageRSS = [];
window.RSSHub = [];
let currentTab = null;
function handlePageRSS (feeds) {
if (feeds && feeds.length) {
chrome.browserAction.setBadgeText({
text: feeds.length + '',
});
} else {
chrome.browserAction.setBadgeText({
text: '',
});
}
chrome.browserAction.setBadgeText({
text: feeds.length ? (feeds.length + '') : '',
tabId: currentTab.tabId,
});
window.pageRSS = feeds;
}
chrome.browserAction.setBadgeBackgroundColor({
@ -15,7 +15,8 @@ chrome.browserAction.setBadgeBackgroundColor({
});
chrome.tabs.onActivated.addListener(function (tab) {
chrome.tabs.sendMessage(tab.tabId, {
currentTab = tab;
chrome.tabs.sendMessage(currentTab.tabId, {
text: 'getPageRSS',
}, handlePageRSS);
});

View File

@ -1,40 +1,50 @@
let pageRSS = null;
function getPageRSS () {
let types = [
'application/rss+xml',
'application/atom+xml',
'application/rdf+xml',
'application/rss',
'application/atom',
'application/rdf',
'text/rss+xml',
'text/atom+xml',
'text/rdf+xml',
'text/rss',
'text/atom',
'text/rdf'
];
let links = document.querySelectorAll('link[type]');
let feeds = [];
for (let i = 0; i < links.length; i++) {
if (links[i].hasAttribute('type') && types.indexOf(links[i].getAttribute('type')) !== -1) {
let feed_url = links[i].getAttribute('href');
if (!pageRSS) {
pageRSS = [];
let types = [
'application/rss+xml',
'application/atom+xml',
'application/rdf+xml',
'application/rss',
'application/atom',
'application/rdf',
'text/rss+xml',
'text/atom+xml',
'text/rdf+xml',
'text/rss',
'text/atom',
'text/rdf'
];
let links = document.querySelectorAll('link[type]');
for (let i = 0; i < links.length; i++) {
if (links[i].hasAttribute('type') && types.indexOf(links[i].getAttribute('type')) !== -1) {
let feed_url = links[i].getAttribute('href');
if (feed_url.startsWith('//')) {
feed_url = document.location.protocol + feed_url;
} else if (feed_url.startsWith('/')) {
feed_url = document.location.origin + feed_url;
} else if (!(/^(http|https):\/\//i.test(feed_url))) {
feed_url = document.location.href + '/' + feed_url.replace(/^\//g, '');
if (feed_url) {
let feed = {
url: handleUrl(feed_url),
title: links[i].getAttribute('title') || document.querySelector('title') && document.querySelector('title').innerHTML,
image: document.querySelector('link[rel="icon"]') && handleUrl(document.querySelector('link[rel="icon"]').getAttribute('href')) || document.location.origin + '/favicon.ico',
};
pageRSS.push(feed);
}
}
let feed = {
url: feed_url,
title: links[i].getAttribute('title') || feed_url
};
feeds.push(feed);
}
}
return feeds;
return pageRSS;
}
function handleUrl (url) {
if (url.startsWith('//')) {
url = document.location.protocol + url;
} else if (url.startsWith('/')) {
url = document.location.origin + url;
} else if (!(/^(http|https):\/\//i.test(url))) {
url = document.location.href + '/' + url.replace(/^\//g, '');
}
return url;
}
chrome.runtime.sendMessage(null, {
@ -44,12 +54,6 @@ chrome.runtime.sendMessage(null, {
chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
if (msg.text === 'getPageRSS') {
if (document.readyState === 'interactive' || document.readyState === 'complete') {
sendResponse(getPageRSS());
} else {
document.addEventListener('DOMContentLoaded', () => {
sendResponse(getPageRSS());
});
}
sendResponse(getPageRSS());
}
});

View File

@ -1,2 +1,21 @@
import '../css/index.less';
import '../css/popup.less';
const background = chrome.extension.getBackgroundPage();
function generateList (list) {
let result = '';
if (list && list.length) {
list.forEach((item) => {
result += `
<li>
<img src="${item.image}">
<div class="title">${item.title}</div>
<a class="url" href="${item.url}">${item.url}</a>
</li>
`
});
}
return result;
}
document.querySelector('.page-rss ul').innerHTML = generateList(background.pageRSS);

View File

@ -39,6 +39,7 @@ module.exports = {
{
test: /\.js$/,
use: [
'template-string-optimize-loader',
{
loader: 'babel-loader',
options: {

View File

@ -851,6 +851,11 @@ abbrev@1:
resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
acorn@5.7.1:
version "5.7.1"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8"
integrity sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==
acorn@^6.2.0:
version "6.2.0"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.2.0.tgz#67f0da2fc339d6cfb5d6fb244fd449f33cd8bbe3"
@ -1843,6 +1848,11 @@ deep-extend@^0.6.0:
resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
deep-is@~0.1.3:
version "0.1.3"
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
define-properties@^1.1.2, define-properties@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
@ -2056,6 +2066,18 @@ escape-string-regexp@^1.0.5:
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
escodegen@1.11.0:
version "1.11.0"
resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.0.tgz#b27a9389481d5bfd5bec76f7bb1eb3f8f4556589"
integrity sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw==
dependencies:
esprima "^3.1.3"
estraverse "^4.2.0"
esutils "^2.0.2"
optionator "^0.8.1"
optionalDependencies:
source-map "~0.6.1"
eslint-loader@2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/eslint-loader/-/eslint-loader-2.2.1.tgz#28b9c12da54057af0845e2a6112701a2f6bf8337"
@ -2075,6 +2097,11 @@ eslint-scope@^4.0.0:
esrecurse "^4.1.0"
estraverse "^4.1.1"
esprima@^3.1.3:
version "3.1.3"
resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=
esprima@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
@ -2087,7 +2114,7 @@ esrecurse@^4.1.0:
dependencies:
estraverse "^4.1.0"
estraverse@^4.1.0, estraverse@^4.1.1:
estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=
@ -2197,6 +2224,11 @@ fast-json-stable-stringify@^2.0.0:
resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I=
fast-levenshtein@~2.0.4:
version "2.0.6"
resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
figgy-pudding@^3.5.1:
version "3.5.1"
resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790"
@ -3084,6 +3116,14 @@ less@3.9.0:
request "^2.83.0"
source-map "~0.6.0"
levn@~0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=
dependencies:
prelude-ls "~1.1.2"
type-check "~0.3.2"
loader-fs-cache@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/loader-fs-cache/-/loader-fs-cache-1.0.2.tgz#54cedf6b727e1779fd8f01205f05f6e88706f086"
@ -3638,6 +3678,18 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0:
dependencies:
wrappy "1"
optionator@^0.8.1:
version "0.8.2"
resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64"
integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=
dependencies:
deep-is "~0.1.3"
fast-levenshtein "~2.0.4"
levn "~0.3.0"
prelude-ls "~1.1.2"
type-check "~0.3.2"
wordwrap "~1.0.0"
os-browserify@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
@ -4194,6 +4246,11 @@ postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.1
source-map "^0.6.1"
supports-color "^6.1.0"
prelude-ls@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=
prepend-http@^1.0.0:
version "1.0.4"
resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
@ -4952,6 +5009,14 @@ tar@^4:
safe-buffer "^5.1.2"
yallist "^3.0.3"
template-string-optimize-loader@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/template-string-optimize-loader/-/template-string-optimize-loader-3.0.0.tgz#bd14db05dff4b6fa24d78641aced386176ce30e1"
integrity sha512-1QOrBwIYHJSRZ9stM0f/YtT/Yivh2pHo+IfHD98qwn95A84gu5+OfpFgtquGryg3qVnz+Tg7eeGtmEK9vb8Zjw==
dependencies:
acorn "5.7.1"
escodegen "1.11.0"
terser-webpack-plugin@^1.1.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.3.0.tgz#69aa22426299f4b5b3775cbed8cb2c5d419aa1d4"
@ -5067,6 +5132,13 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0:
resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=
type-check@~0.3.2:
version "0.3.2"
resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=
dependencies:
prelude-ls "~1.1.2"
typedarray@^0.0.6:
version "0.0.6"
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
@ -5327,6 +5399,11 @@ wide-align@^1.1.0:
dependencies:
string-width "^1.0.2 || 2"
wordwrap@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=
worker-farm@^1.7.0:
version "1.7.0"
resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8"