index.md - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
index.md (2956B)
---
1 RSS/Atom feed detection
2 =======================
3
4 Description
5 -----------
6
7 This script looks for links to RSS or Atom feeds in the current web page. If it
8 finds feeds, it places an icon in the corner of the page which toggles showing
9 a list of the feeds.
10
11 To install, put the code in `~/.surf/script.js`
12
13 Author
14 ------
15
16 Charles E. Lehner <https://celehner.com/>
17
18 Code
19 ----
20
21 (function () {
22 var urls = {}
23 var feeds = [].slice.call(document.querySelectorAll(
24 "link[href][rel~=alternate][type$=xml]," +
25 " a[href][rel~=alternate][type$=xml]"))
26 .map(function (el) {
27 return {
28 href: el.href,
29 title: el.title || document.title,
30 type: /atom/i.test(el.type) ? 'Atom' : 'RSS'
31 };
32 }).filter(function (feed) {
33 if (urls[feed.href]) return false
34 return urls[feed.href] = true
35 });
36 if (!feeds.length) return;
37
38 var container = document.createElement('div');
39 container.style.position = 'fixed';
40 container.style.bottom = 0;
41 container.style.right = 0;
42 container.style.zIndex = 10000;
43 document.body.appendChild(container);
44
45 var feedList = document.createElement('div');
46 feedList.style.display = 'none';
47 feedList.style.backgroundColor = '#ddd';
48 feedList.style.border = '1px solid #bbb';
49 feedList.style.borderStyle = 'solid solid none';
50 feedList.style.padding = '2px 4px';
51 container.appendChild(feedList);
52
53 feeds.forEach(function (feed) {
54 var a = document.createElement('a');
55 a.href = feed.href;
56 a.style.display = 'block';
57 a.style.color = 'blue';
58 var title = feed.title;
59 if (title.indexOf(feed.type) == -1)
60 title += ' (' + feed.type + ')';
61 a.appendChild(document.createTextNode(title));
62 feedList.appendChild(a);
63 });
64
65 var toggleLink = document.createElement('a');
66 toggleLink.href = '';
67 toggleLink.style.display = 'inline-block';
68 toggleLink.style.paddingRight = '3px';
69 toggleLink.style.verticalAlign = 'bottom';
70 toggleLink.addEventListener("click", toggleFeedList, true);
71 container.appendChild(toggleLink);
72
73 var img = new Image();
74 img.style.padding = '4px';
75 img.style.verticalAlign = 'bottom';
76 img.src = 'data:image/gif;base64,' +
77 'R0lGODlhDAAMAPUzAPJoJvJqKvNtLfNuL/NvMfNwMvNyNPNzNvN0OPN1OfN3O/R4' +
78 'PfR5P/R6QPR7QvR+RvR/R/SASfSBS/SDTPWETvWFUPWGUvWJVfWLWfWMWvWNXPaW' +
79 'aPaYbPaabfebb/eccfeedPehePemf/ingPiphPiqhviui/ivjfiwjviykPm6nPm+' +
80 'ofzh1P3k2f3n3P7u5/7v6P738/749f///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +
81 'AAAAAAAAAAAAAAAAACH5BAEAADQALAAAAAAMAAwAAAZ6QFqB4YBAJBLKZCEsbCDE' +
82 'I2WqQCBms9fqkqRIJg7EZ+WawTxeSAS6AklIMhknwjA6sC/SR/aSKBwSEBcpLzMk' +
83 'IjMoBwwTECEoGTAvDi8uBAhKMokmMxwqMwIIFhQsMRoZMyeIFgILFoEMCAcEAgEA' +
84 'BDQKRhAOsbICNEEAOw==';
85 toggleLink.appendChild(img);
86
87 if (feeds.length > 1) {
88 toggleLink.appendChild(document.createTextNode(feeds.length));
89 }
90
91 function toggleFeedList(e) {
92 e.preventDefault();
93 feedList.style.display = (feedList.style.display == 'none') ?
94 'inline-block' : 'none';
95 }
96 })();