--- date: 2020-12-01 20:52 description: Short code-snippet for an RSS feed, written in HTML and JavaScript tags: Tutorial, Code-Snippet, HTML, JavaScript --- # RSS Feed written in HTML + JavaScript If you want to directly open the HTML file in your browser after saving, don't forget to set `CORS_PROXY=""` ```html <!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title> RSS Feed </title> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous"> </head> <body> <h1 align="center" class="display-1">RSS Feed</h1> <main> <div class="container"> <div class="list-group pb-4" id="contents"></div> <div id="feed"> </div></div> </main> <script src="https://gitcdn.xyz/repo/rbren/rss-parser/master/dist/rss-parser.js"></script> <script> const feeds = { "BuzzFeed - India": { "link":"https://www.buzzfeed.com/in.xml", "summary":true }, "New Yorker": { "link":"http://www.newyorker.com/feed/news", }, "Vox":{ "link":"https://www.vox.com/rss/index.xml", "limit": 3 }, "r/Jokes":{ "link":"https://reddit.com/r/Jokes/hot/.rss?sort=hot", "ignore": ["repost","discord"] } } const config_extra = { "Responsive-Images": true, "direct-link": false, "show-date":false, "left-column":false, "defaults": { "limit": 5, "summary": true } } const CORS_PROXY = "https://cors-anywhere.herokuapp.com/" var contents_title = document.createElement("h2") contents_title.textContent = "Contents" contents_title.classList.add("pb-1") document.getElementById("contents").appendChild(contents_title) async function myfunc(key){ var count_lim = feeds[key]["limit"] var count_lim = (count_lim === undefined) ? config_extra["defaults"]["limit"] : count_lim var show_summary = feeds[key]["summary"] var show_summary = (show_summary === undefined) ? config_extra["defaults"]["summary"] : show_summary var ignore_tags = feeds[key]["ignore"] var ignore_tags = (ignore_tags === undefined) ? [] : ignore_tags var contents = document.createElement("a") contents.href = "#" + key contents.classList.add("list-group-item","list-group-item-action") contents.textContent = key document.getElementById("contents").appendChild(contents) var feed_div = document.createElement("div") feed_div.id = key feed_div.setAttribute("id", key); var title = document.createElement("h2"); title.textContent = "From " + key; title.classList.add("pb-1") feed_div.appendChild(title) document.getElementById("feed").appendChild(feed_div) var parser = new RSSParser(); var countPosts = 0 parser.parseURL(CORS_PROXY + feeds[key]["link"], function(err, feed) { if (err) throw err; feed.items.forEach(function(entry) { if (countPosts < count_lim) { var skip = false for(var i = 0; i < ignore_tags.length; i++) { if (entry.title.includes(ignore_tags[i])){ var skip = true } else if (entry.content.includes(ignore_tags[i])){ var skip = true } } if (!skip) { var node = document.createElement("div"); node.classList.add("card","mb-3"); var row = document.createElement("div") row.classList.add("row","no-gutters") if (config_extra["left-column"]){ var left_col = document.createElement("div") left_col.classList.add("col-md-2") var left_col_body = document.createElement("div") left_col_body.classList.add("card-body") } var right_col = document.createElement("div") if (config_extra["left-column"]){ right_col.classList.add("col-md-10") } var node_title = document.createElement("h5") node_title.classList.add("card-header") node_title.innerHTML = entry.title node_body = document.createElement("div") node_body.classList.add("card-body") node_content = document.createElement("p") if (show_summary){ node_content.innerHTML = entry.content } node_content.classList.add("card-text") if (config_extra["direct-link"]){ node_link = document.createElement("p") node_link.classList.add("card-text") node_link.innerHTML = "<b>Link:</b> <a href='" + entry.link +"'>Direct Link</a>" if (config_extra["left-column"]){ left_col_body.appendChild(node_link) } else { node_content.appendChild(node_link) } } if (config_extra["show-date"]){ node_date = document.createElement("p") node_date.classList.add("card-text") node_date.innerHTML = "<p><b>Date: </b>" + entry.pubDate + "</p>" if (config_extra["left-column"]){ left_col_body.appendChild(node_date) } else { node_content.appendChild(node_date) } } node.appendChild(node_title) node_body.appendChild(node_content) right_col.appendChild(node_body) if (config_extra["left-column"]){ left_col.appendChild(left_col_body) row.appendChild(left_col) } row.appendChild(right_col) node.appendChild(row) document.getElementById(key).appendChild(node) countPosts+=1 } } }) if (config_extra["Responsive-Images"]){ var inputs = document.getElementsByTagName('img') for(var i = 0; i < inputs.length; i++) { inputs[i].classList.add("img-fluid") } } }) return true } (async () => { for(var key in feeds) { let result = await myfunc(key); }})(); </script> <noscript>Uh Oh! Your browser does not support JavaScript or JavaScript is currently disabled. Please enable JavaScript or switch to a different browser.</noscript> </body></html> ```