Skip to content

Instantly share code, notes, and snippets.

Forked from toddq/
Last active October 13, 2022 07:03
What would you like to do?

##Description Simple Dashing widget (and associated job) to display RSS feeds. Based on toddq's News widget. Due to comments about the widget not working for many sites I updated the widget to use Ruby's RSS library. It works quite well now.


##Dependencies nokogiri


Add it to dashing's gemfile:

gem 'nokogiri'
gem 'htmlentities'

and run bundle install.

##Usage To use this widget, copy news.html,, and news.scss into the /widgets/news directory. Put the news.rb file in your /jobs folder.

To include the widget in a dashboard, add the following snippet to the dashboard layout file:

<li data-row="1" data-col="1" data-sizex="1" data-sizey="1">
  <div data-id="seattle-times" data-view="News" data-title="Seattle Times" data-interval="30"></div>

At the top of the news.rb job file, add any rss feed urls you want fetched to the hash, and the widget id to send data to. In the dashboard layout file, the optional data-interval binding can be used to specify how frequently to rotate the news items.

class Dashing.News extends Dashing.Widget
ready: ->
@currentIndex = 0
@headlineElem = $(@node).find('.headline-container')
onData: (data) ->
@currentIndex = 0
startCarousel: ->
interval = $(@node).attr('data-interval')
interval = "30" if not interval
setInterval(@nextComment, parseInt( interval ) * 1000)
nextComment: =>
headlines = @get('headlines')
if headlines
@headlineElem.fadeOut =>
@currentIndex = (@currentIndex + 1) % headlines.length
@set 'current_headline', headlines[@currentIndex]
<div class="heading" data-bind="title"></div>
<div class="headline-container">
<h1 class="title" data-bind="current_headline.title | raw"></h1>
<div class="headline description" data-bind="current_headline.description | raw"></div>
require 'rss'
require 'open-uri'
require 'nokogiri'
require 'htmlentities'
news_feeds = {
"bbc-tech" => "",
"mashable" => "",
"techcrunch" => "",
"opm" => "",
Decoder =
class News
def initialize(widget_id, feed)
@widget_id = widget_id
@feed = feed
def widget_id()
def truncate(string, length = 200)
raise 'Truncate: Length should be greater than 3' unless length > 3
truncated_string = string.to_s
if truncated_string.length > length
truncated_string = truncated_string[0...(length - 3)]
truncated_string += '...'
def latest_headlines()
news_headlines = []
open(@feed) do |rss|
feed = RSS::Parser.parse(rss)
feed.items.each do |item|
title = clean_html(item.title.to_s)
summary = truncate(clean_html(item.description))
doc = Nokogiri::HTML(item.summary.content)
summary = truncate((doc.xpath("//text()").remove).to_s)
news_headlines.push({ title: title, description: summary })
def clean_html( html )
html = html.gsub(/<\/?[^>]*>/, "")
html = Decoder.decode( html )
return html
@News = []
news_feeds.each do |widget_id, feed|
@News.push(, feed))
rescue Exception => e
puts e.to_s
SCHEDULER.every '60m', :first_in => 0 do |job|
@News.each do |news|
headlines = news.latest_headlines()
send_event(news.widget_id, { :headlines => headlines })
// ----------------------------------------------------------------------------
// Sass declarations
// ----------------------------------------------------------------------------
$background-color: #FF9500;
$value-color: #fff;
$title-color: rgba(255, 255, 255, 0.7);;
$moreinfo-color: rgba(255, 255, 255, 0.8);;
// ----------------------------------------------------------------------------
// Widget-news styles
// ----------------------------------------------------------------------------
.widget-news {
background-color: $background-color;
vertical-align: baseline !important;
.headline-container {
display: none;
.title {
font-size: 1.2em;
.description {
font-size: 0.8em;
color: $moreinfo-color;
color: black;
Copy link

skyzo35 commented Jan 20, 2017

I tried to use this widget but everytime i use it, my dashboard doesn't dispay the dashboard in the right way.
I only have this issue when i keep the file...
sans titre

Copy link

It would be nice if this widget could just fetch the last X (to be defined in jobs/news.rb file) news and not all news. For example I am only interested in the last 3 most recent news in an RSS feed.

Copy link

7k50 commented Jul 15, 2017

I'm also having problems with many RSS feeds, for instance the confess one mentioned on this page. Some work, like bbc-tech.

Copy link

NiewWha commented Oct 16, 2018

Hello, how is the data getting to the dashboard?
What is the meaning of:

add any rss feed urls you want fetched to the hash, and the widget id to send data to

I thought I just have to add the RSS links to the news.rb file, but it seems not enough. What do I have to do to get the news from my RSS feeds? Is this widget not getting itself the content?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment