Skip to content
Snippets Groups Projects
Commit f2d66bc0 authored by Markus Willman's avatar Markus Willman
Browse files

replace rss feed related code with jquery-rss

- the previous service used is not free after 30 days
- jquery-rss is open source, as is its backing server implementation, and layout customization lives in our code
parent 57c36091
No related branches found
No related tags found
No related merge requests found
(function(d){var e=function(a,b,c,f){this.target=a;this.url=b;this.html=[];this.effectQueue=[];this.options=d.extend({ssl:!1,host:"www.feedrapp.info",limit:null,key:null,layoutTemplate:"<ul>{entries}</ul>",entryTemplate:'<li><a href="{url}">[{author}@{date}] {title}</a><br/>{shortBodyPlain}</li>',tokens:{},outputMode:"json",dateFormat:"dddd MMM Do",dateLocale:"en",effect:"show",offsetStart:!1,offsetEnd:!1,error:function(){console.log("jQuery RSS: url doesn't link to RSS-Feed")},onData:function(){},
success:function(){}},c||{});this.callback=f||this.options.success};e.htmlTags="doctype,html,head,title,base,link,meta,style,script,noscript,body,article,nav,aside,section,header,footer,h1-h6,hgroup,address,p,hr,pre,blockquote,ol,ul,li,dl,dt,dd,figure,figcaption,div,table,caption,thead,tbody,tfoot,tr,th,td,col,colgroup,form,fieldset,legend,label,input,button,select,datalist,optgroup,option,textarea,keygen,output,progress,meter,details,summary,command,menu,del,ins,img,iframe,embed,object,param,video,audio,source,canvas,track,map,area,a,em,strong,i,b,u,s,small,abbr,q,cite,dfn,sub,sup,time,code,kbd,samp,var,mark,bdi,bdo,ruby,rt,rp,span,br,wbr".split(",");
e.prototype.load=function(a){var b="http"+(this.options.ssl?"s":"")+"://"+this.options.host+"?callback=?&q="+encodeURIComponent(this.url);this.options.offsetStart&&this.options.offsetEnd&&(this.options.limit=this.options.offsetEnd);null!==this.options.limit&&(b+="&num="+this.options.limit);null!==this.options.key&&(b+="&key="+this.options.key);d.getJSON(b,a)};e.prototype.render=function(){var a=this;this.load(function(b){try{a.feed=b.responseData.feed,a.entries=b.responseData.feed.entries}catch(c){return a.entries=
[],a.feed=null,a.options.error.call(a)}b=a.generateHTMLForEntries();a.target.append(b.layout);if(0!==b.entries.length){d.isFunction(a.options.onData)&&a.options.onData.call(a);var f=d(b.layout).is("entries")?b.layout:d("entries",b.layout);a.appendEntriesAndApplyEffects(f,b.entries)}0<a.effectQueue.length?a.executeEffectQueue(a.callback):d.isFunction(a.callback)&&a.callback.call(a)})};e.prototype.appendEntriesAndApplyEffects=function(a,b){var c=this;d.each(b,function(b,e){var d=c.wrapContent(e);"show"===
c.options.effect?a.before(d):(d.css({display:"none"}),a.before(d),c.applyEffect(d,c.options.effect))});a.remove()};e.prototype.generateHTMLForEntries=function(){var a=this,b={entries:[],layout:null};d(this.entries).each(function(){var c=a.options.offsetStart,f=a.options.offsetEnd;c&&f?index>=c&&index<=f&&a.isRelevant(this,b.entries)&&(c=a.evaluateStringForEntry(a.options.entryTemplate,this),b.entries.push(c)):a.isRelevant(this,b.entries)&&(c=a.evaluateStringForEntry(a.options.entryTemplate,this),
b.entries.push(c))});b.layout=this.options.entryTemplate?this.wrapContent(this.options.layoutTemplate.replace("{entries}","<entries></entries>")):this.wrapContent("<div><entries></entries></div>");return b};e.prototype.wrapContent=function(a){return 0!==d.trim(a).indexOf("<")?d("<div>"+a+"</div>"):d(a)};e.prototype.applyEffect=function(a,b,c){switch(b){case "slide":a.slideDown("slow",c);break;case "slideFast":a.slideDown(c);break;case "slideSynced":this.effectQueue.push({element:a,effect:"slide"});
break;case "slideFastSynced":this.effectQueue.push({element:a,effect:"slideFast"})}};e.prototype.executeEffectQueue=function(a){var b=this;this.effectQueue.reverse();var c=function(){var f=b.effectQueue.pop();f?b.applyEffect(f.element,f.effect,c):a&&a()};c()};e.prototype.evaluateStringForEntry=function(a,b){var c=a,f=this;d(a.match(/(\{.*?\})/g)).each(function(){var a=this.toString();c=c.replace(a,f.getValueForToken(a,b))});return c};e.prototype.isRelevant=function(a,b){var c=this.getTokenMap(a);
return this.options.filter?this.options.filterLimit&&this.options.filterLimit===b.length?!1:this.options.filter(a,c):!0};e.prototype.getFormattedDate=function(a){if(this.options.dateFormatFunction)return this.options.dateFormatFunction(a);return"undefined"!==typeof moment?(a=moment(new Date(a)),a=a.locale?a.locale(this.options.dateLocale):a.lang(this.options.dateLocale),a.format(this.options.dateFormat)):a};e.prototype.getTokenMap=function(a){if(!this.feedTokens){var b=JSON.parse(JSON.stringify(this.feed));
delete b.entries;this.feedTokens=b}return d.extend({feed:this.feedTokens,url:a.link,author:a.author,date:this.getFormattedDate(a.publishedDate),title:a.title,body:a.content,shortBody:a.contentSnippet,bodyPlain:function(a){for(var a=a.content.replace(/<script[\\r\\\s\S]*<\/script>/mgi,"").replace(/<\/?[^>]+>/gi,""),b=0;b<e.htmlTags.length;b++)a=a.replace(RegExp("<"+e.htmlTags[b],"gi"),"");return a}(a),shortBodyPlain:a.contentSnippet.replace(/<\/?[^>]+>/gi,""),index:d.inArray(a,this.entries),totalEntries:this.entries.length,
teaserImage:function(a){try{return a.content.match(/(<img.*?>)/gi)[0]}catch(b){return""}}(a),teaserImageUrl:function(a){try{return a.content.match(/(<img.*?>)/gi)[0].match(/src="(.*?)"/)[1]}catch(b){return""}}(a)},this.options.tokens)};e.prototype.getValueForToken=function(a,b){var c=this.getTokenMap(b),d=a.replace(/[\{\}]/g,""),d=c[d];if("undefined"!==typeof d)return"function"===typeof d?d(b,c):d;throw Error("Unknown token: "+a+", url:"+this.url);};d.fn.rss=function(a,b,c){(new e(this,a,b,c)).render();
return this}})(jQuery);
...@@ -31,36 +31,19 @@ ...@@ -31,36 +31,19 @@
<!-- Twitter feed --> <!-- Twitter feed -->
<div class="card info-card box-shadow"> <div class="card info-card box-shadow">
<div id="twitter"> <div id="twitter">
<a class="twitter-timeline" data-height="600" data-dnt="true" data-theme="light" href="https://twitter.com/Turkukaupunki?ref_src=twsrc%5Etfw">Tweets by Turkukaupunki</a> <a class="twitter-timeline" data-height="600" data-dnt="true" data-theme="light" href="https://twitter.com/Turkukaupunki?ref_src=twsrc%5Etfw">
<script> Twiitit: Turkukaupunki
window.twttr = (function (d, s, id) { </a>
var js, fjs = d.getElementsByTagName(s)[0],
t = window.twttr || {};
if (d.getElementById(id)) return;
js = d.createElement(s);
js.id = id;
js.src = "https://platform.twitter.com/widgets.js";
fjs.parentNode.insertBefore(js, fjs);
t._e = [];
t.ready = function (f) {
t._e.push(f);
};
return t;
}(document, "script", "twitter-wjs"));
</script>
</div> </div>
</div> </div>
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
<!-- Visit Turku news feed with rssinclude.com --> <!-- Visit Turku news feed -->
<div class="card info-card box-shadow"> <div class="card info-card box-shadow">
<div class="card-header"> <div class="card-header">
<h3 class="card-title">Visit Turku -uutiset</h3> <h3 class="card-title">Visit Turku -uutiset</h3>
</div> </div>
<div id="visitTurku"> <div id="visitTurku" class="list-group list-group-flush" style="overflow-y: scroll"></div>
<script type="text/javascript" src="http://output92.rssinclude.com/output?type=js&amp;id=1172169&amp;hash=c1c032487ad85904644bb22308686454"></script>
</div>
</div> </div>
</div> </div>
</div> </div>
...@@ -71,13 +54,47 @@ ...@@ -71,13 +54,47 @@
{% block scripts %} {% block scripts %}
{{- super() }} {{- super() }}
<!-- TODO: once the cdnjs project hosts this, migrate to that -->
<script src="{{ util.static_url('js/jquery-rss/3.3.0/jquery.rss.min.js') }}"></script>
<script> <script>
$(document).ready(function () { $(document).ready(function () {
console.log("Document ready."); // Twitter initialization code
window.twttr = (function (d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0],
t = window.twttr || {};
if (d.getElementById(id)) return;
js = d.createElement(s);
js.id = id;
js.src = "https://platform.twitter.com/widgets.js";
fjs.parentNode.insertBefore(js, fjs);
t._e = [];
t.ready = function (f) {
t._e.push(f);
};
return t;
}(document, "script", "twitter-wjs"));
// TODO: consider making a docker image of https://github.com/sdepold/feedr and use that as custom host option, to mitigate potential downtime
// see: https://github.com/sdepold/jquery-rss
$('#visitTurku').rss(
'https://www.visitturku.fi/section/73193/rss.xml',
{
limit: 10,
layoutTemplate: '{entries}',
entryTemplate: `
<a href="{url}" class="list-group-item list-group-item-action flex-column align-items-start">
<div class="d-flex w-100 justify-content-between">
<h5 class="mb-1 text-foli">{title}</h5>
</div>
<p class="mb-1">{body}</p>
<small class="pull-right">{author} - {date}</small>
</a>`
}
).disableExternalLinks();
$('#visitTurku').disableExternalLinks();
$('#twitter').disableExternalLinks(); // in case the widget fails to load disable the link in the container as a placeholder $('#twitter').disableExternalLinks(); // in case the widget fails to load disable the link in the container as a placeholder
//$('#forecast7').disableExternalLinks(); // not working, iframes need to die out :)
twttr.ready(function (twttr) { twttr.ready(function (twttr) {
twttr.events.bind('loaded', function (e) { twttr.events.bind('loaded', function (e) {
......
...@@ -192,7 +192,7 @@ ...@@ -192,7 +192,7 @@
// TODO: is there a way to avoid flickering elements on full page load? // TODO: is there a way to avoid flickering elements on full page load?
$('.js-hide').removeClass('js-hide').addClass('sr-only'); $('.js-hide').removeClass('js-hide').addClass('sr-only');
moment.locale('{{ g.lang_code }}'); moment.locale('{% if localized %}{{ g.lang_code }}{% else %}{{ content_lang }}{% endif %}');
// clock implementation follows // clock implementation follows
$clock = $('#headerClock'); $clock = $('#headerClock');
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment