Commit 367d0ede by Wolfgang Berndt

Refactor for new rss format, move styling to parent html.

parent e24b366c
...@@ -4,11 +4,24 @@ ...@@ -4,11 +4,24 @@
<title>Newsticker</title> <title>Newsticker</title>
<item> <item>
<title>Allergisch? Ja, aber nicht gegen Fitness!</title> <title>Allergisch? Ja, aber nicht gegen Fitness!</title>
<description><![CDATA[Soll ich oder darf ich nicht - wer sich jetzt mit Heuschnupfen oder sonst einer Pollen-Allergie plagt, fragt sich vielleicht, ob ihm Training nicht schaden könnte. Das Gegenteil ist richtig. Körperliches Training ist neben angepasster Ernährung jetzt besonders wichtig. Denn Fitness trainiert nicht nur Muskeln und Herz-Kreislauf, sondern auch das Immunsystem und die Lungenfunktion. Und: Im Fitness-Studio trainieren Pollenallergiker weitgehend reizfrei.\nQuelle: shapeup media\nFoto: AntiMartina, shutterstock]]></description> <description><![CDATA[Soll ich oder darf ich nicht - wer sich jetzt mit Heuschnupfen oder sonst einer Pollen-Allergie plagt, fragt sich vielleicht, ob ihm Training nicht schaden könnte. Das Gegenteil ist richtig. Körperliches Training ist neben angepasster Ernährung jetzt besonders wichtig. Denn Fitness trainiert nicht nur Muskeln und Herz-Kreislauf, sondern auch das Immunsystem und die Lungenfunktion. Und: Im Fitness-Studio trainieren Pollenallergiker weitgehend reizfrei.
Quelle: shapeup media
Foto: AntiMartina, shutterstock]]></description>
<image> <image>
<url>http://tvlokal.de/customer/rss2files/images/1061_630_1.jpg</url> <url>http://tvlokal.de/customer/rss2files/images/1061_630_1.jpg</url>
</image> </image>
<link/>
</item> </item>
<head/> <item>
<title>Testtitel</title>
<description>Testtext ohne CDATA. Funktioniert auch, erlaubt dann aber keine Zeilenumbrüche, weil XML jegliches Steuerzeichen als Whitespace interpretiert.</description>
</item>
<item>
<title></title>
<description></description>
</item>
<item>
<title></title>
<description></description>
</item>
</channel>
</rss> </rss>
\ No newline at end of file
...@@ -3,7 +3,82 @@ ...@@ -3,7 +3,82 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<title>vertical-ticker</title> <title>vertical-ticker</title>
<link rel="stylesheet" href="style.css"> <style>
/* Fonts */
@font-face {
font-family: "tickertitel";
src: url("files/TitilliumWeb-Black.ttf") format("truetype");
}
@font-face {
font-family: "tickertext";
src: url("files/Oswald-Regular.woff") format("woff");
}
/* Hintergrundbild, etc... */
body {
padding: 0;
margin: 0;
background: url("files/demobg.jpg") no-repeat center fixed;
background-size: cover;
}
/* CSS Elemente für den Ticker */
#viewport {
position: fixed;
top: 0;
bottom: 0;
left: 0;
right: 0;
}
.tickercontainer {
position: fixed;
}
.tickeritem {
margin-left: 5%;
margin-right: 5%;
}
.tickeritem:after {
content: "";
display: table;
clear: both;
}
/* Style für RSS-Title */
h1 {
font-family: tickertitel;
font-size: 80px;
font-weight: normal;
color: #fff;
}
/* Style für RSS-Description */
p {
font-family: tickertext;
font-size: 60px;
text-align: justify;
color: #eee;
}
/* Style für RSS-Image */
img {
float: left;
margin: 15px 3% 0% 0%;
}
/* Style für Platzhalter zwischen den Tickerelementen */
.spacer {
width: 100%;
margin-top: 50px;
margin-bottom: 50px;
font-size: 36px;
color: darkgrey;
text-align: center;
}
</style>
<script src="jquery-3.2.1.min.js"></script> <script src="jquery-3.2.1.min.js"></script>
<script src="jquery.base64.min.js"></script> <script src="jquery.base64.min.js"></script>
<script src="ticker.min.js"></script> <script src="ticker.min.js"></script>
...@@ -18,57 +93,16 @@ ...@@ -18,57 +93,16 @@
ticker.init({ ticker.init({
// URL zum RSS-Feed. Der Feed wird vom Ticker automatisch alle 5 Minuten refreshed, ein Reload der Seite // URL zum RSS-Feed. Der Feed wird vom Ticker automatisch alle 5 Minuten refreshed, ein Reload der Seite
// ist nicht notwendig. // ist nicht notwendig.
// url: "https://git.doohcorp.net/wberndt/tvlokal.ticker/raw/master/demodata/test.xml",
// Testfeeds:
// http://www.tvlokal.de/customer/rss2files/630rss.xml
// https://git.doohcorp.net/wberndt/tvlokal.ticker/raw/master/demodata/5rss/5rss.xml
//
url: "https://git.doohcorp.net/wberndt/tvlokal.ticker/raw/master/demodata/5rss/5rss.xml",
// Proxy benutzen, falls das RSS von einem anderen Server kommt und dieser keinen // Proxy benutzen, falls das RSS von einem anderen Server kommt und dieser keinen
// "Access-Control-Allow-Origin"-Header gesetzt hat. Kann auf *.tvlokal.de vermutlich deaktivert werden. // "Access-Control-Allow-Origin"-Header gesetzt hat. Kann auf *.tvlokal.de vermutlich deaktivert werden.
useproxy: true, useproxy: true,
// Tickergeschwindigkeit in Sekunden pro 100 Pixel. // Tickergeschwindigkeit in Sekunden pro 100 Pixel.
speed: "2.5", speed: "2.5",
// Text für den Abstandshalter zwischen 2 Tickerelementen. Ist dieses Feld leer oder auskommentiert,
// Hintergrund des Tickers. Das Bild halt Priorität vor der Farbe, d.h. wenn beides gesetzt ist, wird // wird kein Abstandshalter eingeblendet (der Style für die Klasser ".spacer" kann in dem Fall ebenfalls
// das Bild angezeigt. // weggelassen werden).
background: { spacertext: "- - -"
color: "#000",
// Pfad zum Hintergrundbild. Das Bild wird unter Beibehaltung des Seitenverhältnis auf die Größe
// des Browserfensters skaliert.
image: "files/demobg.jpg"
},
// Schriftart. Der Oxygen-Player zeigt den Ticker mit IE11 an, das Format muss also EOT, WOFF oder
// TTF sein.
font: {
file: "files/TitilliumWeb-Black.ttf",
format: "truetype",
name: "Titillium WebBlack"
},
// Styling der Überschrift. Die Werte werden direkt ins CSS der Seite geschrieben, es sind also z.B.
// auch prozentuale Werte möglich.
headline: {
size: "80px",
color: "#fff",
},
// Styling für den Tickertext.
text: {
size: "60px",
color: "#eee",
align: "justify",
},
// Styling für den Abstandshalter zwischen den Ticker-Elementen. Ist das Feld "text" leer, wird
// kein Abstandshalter eingeblendet.
spacer: {
size: "48px",
color: "#001aab",
text: "- - -",
}
}); });
}); });
</script> </script>
......
body {
padding: 0;
margin: 0;
background-color: #000000;
font-family: sans-serif;
color: #FFFFFF;
}
#viewport {
position: fixed;
top: 0;
bottom: 0;
left: 0;
right: 0;
}
.spacer {
width: 100%;
margin-top: 50px;
margin-bottom: 50px;
font-size: 36px;
color: darkgrey;
text-align: center;
}
.tickercontainer {
position: fixed;
}
.tickeritem {
margin-left: 5%;
margin-right: 5%;
}
.tickeritem:after {
content: "";
display: table;
clear: both;
}
h1 {
font-size: 72px;
font-weight: normal;
}
p {
font-size: 36px;
text-align: justify;
}
img {
float: left;
margin: 15px 3% 0% 0%;
}
\ No newline at end of file
...@@ -11,31 +11,34 @@ var feedCache = { ...@@ -11,31 +11,34 @@ var feedCache = {
return cb(self.data); return cb(self.data);
} }
function rss2html(jqueryEl) {
// try to get some sensible data from this xml-"html"-mess
return jqueryEl.html()
.replace("<![CDATA[", "")
.replace("<!--[CDATA[<p-->", "<p>")
.replace("]]>", "")
.replace("]]&gt;", "")
.replace(/<\/?font[^>]*>/gi, "");
}
// renew cache otherwise // renew cache otherwise
$.ajax({ $.ajax({
url: (useproxy) ? 'http://proxy.doohmedia.net/get.php?url=' + $.base64.encode(url) : url, url: (useproxy) ? 'http://proxy.doohmedia.net/get.php?url=' + $.base64.encode(url) : url,
type: 'GET', type: 'GET',
success: function(data){ success: function(data){
var rss = $.parseXML(data);
var result = []; var result = [];
$(data).find("item").each(function () { $(rss).find("item").each(function () {
var item = $(this); var item = $(this);
var title = rss2html(item.find("title"));
var desc = rss2html(item.find("description"));
if (!title && !desc) return false; var titleNode = item.find("title");
if (!title && desc === "<p></p>") return false; var descrNode = item.find("description");
var imageNode = item.find("image > url");
result.push({title: title, desc: desc});
// Parse xml fields
var title = (titleNode.length > 0) ? titleNode[0].textContent.replace(/(?:\r\n|\r|\n)/g, '<br/>') : undefined;
var descr = (descrNode.length > 0) ? descrNode[0].textContent.replace(/(?:\r\n|\r|\n)/g, '<br/>') : undefined;
var image = (imageNode.length > 0) ? imageNode[0].textContent : undefined;
// Add to result if any field is set
if(title || descr || image) {
result.push({
title: title,
descr: descr,
image: image
});
}
}); });
if(result.length > 0) { if(result.length > 0) {
...@@ -66,8 +69,6 @@ var ticker = { ...@@ -66,8 +69,6 @@ var ticker = {
if(!config.url) return; if(!config.url) return;
self.config = config; self.config = config;
self._setupStyling();
// get data for first run // get data for first run
feedCache.getdata(self.config.url, self.config.useproxy, function (data) { feedCache.getdata(self.config.url, self.config.useproxy, function (data) {
self.currentFeedData = data; self.currentFeedData = data;
...@@ -78,36 +79,6 @@ var ticker = { ...@@ -78,36 +79,6 @@ var ticker = {
window.setInterval(function() { self._updateFeedData(); }, 60*1000); window.setInterval(function() { self._updateFeedData(); }, 60*1000);
}); });
}, },
_setupStyling: function() {
this.viewportHeight = $('#viewport').height();
if(this.config.font && this.config.font.file && this.config.font.format) {
var fontFamily = this.config.font.name || "customfont";
$('head').prepend('<style type="text/css">@font-face {font-family: "' + fontFamily + '"; src: url("' + this.config.font.file + '") format("' + this.config.font.format + '");}</style>');
$('body').css('font-family', fontFamily);
}
if(this.config.background.color) {
$('body').css('background-color',this.config.background.color);
}
if(this.config.background.image) {
$('body').css('background','url("' + this.config.background.image + '") no-repeat center fixed')
.css('background-size', 'cover');
}
this._styleFonts();
},
_styleFonts: function () {
if(this.config.text.size) $("p").css('font-size', this.config.text.size);
if(this.config.text.color) $("p").css('color', this.config.text.color);
if(this.config.text.align) $("p").css('text-align', this.config.text.align);
if(this.config.headline.size) $("h1").css('font-size', this.config.headline.size);
if(this.config.headline.color) $("h1").css('color', this.config.headline.color);
if(this.config.spacer.color) $(".spacer").css('color', this.config.spacer.color);
if(this.config.spacer.size) $(".spacer").css('font-size', this.config.spacer.size);
},
_updateFeedData: function () { _updateFeedData: function () {
var self = this; var self = this;
...@@ -137,7 +108,7 @@ var ticker = { ...@@ -137,7 +108,7 @@ var ticker = {
// Get the top position of the last ticker item (or the bottom position of the viewport for the first ticker) // Get the top position of the last ticker item (or the bottom position of the viewport for the first ticker)
var lastTicker = $(".tickercontainer:last").get(0); var lastTicker = $(".tickercontainer:last").get(0);
var top = (lastTicker) ? $(lastTicker).offset().top + $(lastTicker).height() : this.viewportHeight; var top = (lastTicker) ? $(lastTicker).offset().top + $(lastTicker).height() : $('#viewport').height();
// Add ticker container to DOM // Add ticker container to DOM
var newContainer = $('<div class="tickercontainer"></div>'); var newContainer = $('<div class="tickercontainer"></div>');
...@@ -145,18 +116,20 @@ var ticker = { ...@@ -145,18 +116,20 @@ var ticker = {
// Add ticker items to the container // Add ticker items to the container
for(var i=0;i<this.currentFeedData.length;i++) { for(var i=0;i<this.currentFeedData.length;i++) {
if(this.config.spacer.text.length > 0) { var newItem = '<div class="tickeritem">';
var newItem = $('<div class="tickeritem"><h1>' + this.currentFeedData[i].title + '</h1>' + this.currentFeedData[i].desc + '</div><div class="spacer">' + this.config.spacer.text + '</div>'); if(this.currentFeedData[i].title) newItem += '<h1>' + this.currentFeedData[i].title + '</h1>';
if(this.currentFeedData[i].image) newItem += '<img src="' + this.currentFeedData[i].image + '"/>';
if(this.currentFeedData[i].descr) newItem += '<p>' + this.currentFeedData[i].descr + '</p>';
if(this.config.spacertext) {
newItem += '</div><div class="spacer">' + this.config.spacertext + '</div>';
} else { } else {
var newItem = $('<div class="tickeritem"><h1>' + this.currentFeedData[i].title + '</h1>' + this.currentFeedData[i].desc + '</div>'); newItem += '</div>';
} }
$(newItem).children("p").addClass("text"); $(newContainer).append($(newItem));
$(newContainer).append(newItem);
} }
self._styleFonts();
// Set top position // Set top position
$(newContainer).css('top', top + "px"); $(newContainer).css('top', top + "px");
......
var feedCache={validCacheDuration:3e5,lastRequestDate:null,data:[],getdata:function(a,b,c){function d(a){return a.html().replace("<![CDATA[","").replace("\x3c!--[CDATA[<p--\x3e","<p>").replace("]]>","").replace("]]&gt;","").replace(/<\/?font[^>]*>/gi,"")}var e=this,f=new Date;if(this.lastRequestDate&&f-this.lastRequestDate<this.validCacheDuration)return c(e.data);$.ajax({url:b?"http://proxy.doohmedia.net/get.php?url="+$.base64.encode(a):a,type:"GET",success:function(a){var b=[];return $(a).find("item").each(function(){var a=$(this),c=d(a.find("title")),e=d(a.find("description"));return!(!c&&!e)&&(!(!c&&"<p></p>"===e)&&void b.push({title:c,desc:e}))}),b.length>0&&(e.data=b,e.lastRequestDate=new Date),c(e.data)},error:function(a){return console.log("error while getting feed data: ",a),c(e.data)}})}},ticker={currentFeedData:[],currentFeedIndex:-1,config:null,viewportHeight:null,init:function(a){var b=this;a.url&&(b.config=a,b._setupStyling(),feedCache.getdata(b.config.url,b.config.useproxy,function(a){b.currentFeedData=a,b._setupNewTicker(),window.setInterval(function(){b._updateFeedData()},6e4)}))},_setupStyling:function(){if(this.viewportHeight=$("#viewport").height(),this.config.font&&this.config.font.file&&this.config.font.format){var a=this.config.font.name||"customfont";$("head").prepend('<style type="text/css">@font-face {font-family: "'+a+'"; src: url("'+this.config.font.file+'") format("'+this.config.font.format+'");}</style>'),$("body").css("font-family",a)}this.config.background.color&&$("body").css("background-color",this.config.background.color),this.config.background.image&&$("body").css("background",'url("'+this.config.background.image+'") no-repeat center fixed').css("background-size","cover"),this._styleFonts()},_styleFonts:function(){this.config.text.size&&$("p").css("font-size",this.config.text.size),this.config.text.color&&$("p").css("color",this.config.text.color),this.config.text.align&&$("p").css("text-align",this.config.text.align),this.config.headline.size&&$("h1").css("font-size",this.config.headline.size),this.config.headline.color&&$("h1").css("color",this.config.headline.color),this.config.spacer.color&&$(".spacer").css("color",this.config.spacer.color),this.config.spacer.size&&$(".spacer").css("font-size",this.config.spacer.size)},_updateFeedData:function(){var a=this;feedCache.getdata(a.config.url,a.config.useproxy,function(b){a.currentFeedData=b})},_setupNewTicker:function(){var a=this;0!==a.currentFeedData.length&&(a._createTicker(),setTimeout(function(){a._createTicker()},500))},_createTicker:function(){var a=this;if(0!==this.currentFeedData.length){var b=$(".tickercontainer:last").get(0),c=b?$(b).offset().top+$(b).height():this.viewportHeight,d=$('<div class="tickercontainer"></div>');$("#viewport").append(d);for(var e=0;e<this.currentFeedData.length;e++){if(this.config.spacer.text.length>0)var f=$('<div class="tickeritem"><h1>'+this.currentFeedData[e].title+"</h1>"+this.currentFeedData[e].desc+'</div><div class="spacer">'+this.config.spacer.text+"</div>");else var f=$('<div class="tickeritem"><h1>'+this.currentFeedData[e].title+"</h1>"+this.currentFeedData[e].desc+"</div>");$(f).children("p").addClass("text"),$(d).append(f)}a._styleFonts(),$(d).css("top",c+"px");var g=c+$(d).height()+20,h=Math.round(g/100*this.config.speed);$(d).css("transition","transform "+h+"s linear"),$(d).css("transform","translate3d(0px, -"+g+"px ,0px)"),$(d).on("transitionend",function(){a._createTicker(),$(d).remove()})}}}; var feedCache={validCacheDuration:3e5,lastRequestDate:null,data:[],getdata:function(a,b,c){var d=this,e=new Date;if(this.lastRequestDate&&e-this.lastRequestDate<this.validCacheDuration)return c(d.data);$.ajax({url:b?"http://proxy.doohmedia.net/get.php?url="+$.base64.encode(a):a,type:"GET",success:function(a){var b=$.parseXML(a),e=[];return $(b).find("item").each(function(){var a=$(this),b=a.find("title"),c=a.find("description"),d=a.find("image > url"),f=b.length>0?b[0].textContent.replace(/(?:\r\n|\r|\n)/g,"<br/>"):void 0,g=c.length>0?c[0].textContent.replace(/(?:\r\n|\r|\n)/g,"<br/>"):void 0,h=d.length>0?d[0].textContent:void 0;(f||g||h)&&e.push({title:f,descr:g,image:h})}),e.length>0&&(d.data=e,d.lastRequestDate=new Date),c(d.data)},error:function(a){return console.log("error while getting feed data: ",a),c(d.data)}})}},ticker={currentFeedData:[],currentFeedIndex:-1,config:null,viewportHeight:null,init:function(a){var b=this;a.url&&(b.config=a,feedCache.getdata(b.config.url,b.config.useproxy,function(a){b.currentFeedData=a,b._setupNewTicker(),window.setInterval(function(){b._updateFeedData()},6e4)}))},_updateFeedData:function(){var a=this;feedCache.getdata(a.config.url,a.config.useproxy,function(b){a.currentFeedData=b})},_setupNewTicker:function(){var a=this;0!==a.currentFeedData.length&&(a._createTicker(),setTimeout(function(){a._createTicker()},500))},_createTicker:function(){var a=this;if(0!==this.currentFeedData.length){var b=$(".tickercontainer:last").get(0),c=b?$(b).offset().top+$(b).height():$("#viewport").height(),d=$('<div class="tickercontainer"></div>');$("#viewport").append(d);for(var e=0;e<this.currentFeedData.length;e++){var f='<div class="tickeritem">';this.currentFeedData[e].title&&(f+="<h1>"+this.currentFeedData[e].title+"</h1>"),this.currentFeedData[e].image&&(f+='<img src="'+this.currentFeedData[e].image+'"/>'),this.currentFeedData[e].descr&&(f+="<p>"+this.currentFeedData[e].descr+"</p>"),this.config.spacertext?f+='</div><div class="spacer">'+this.config.spacertext+"</div>":f+="</div>",$(d).append($(f))}$(d).css("top",c+"px");var g=c+$(d).height()+20,h=Math.round(g/100*this.config.speed);$(d).css("transition","transform "+h+"s linear"),$(d).css("transform","translate3d(0px, -"+g+"px ,0px)"),$(d).on("transitionend",function(){a._createTicker(),$(d).remove()})}}};
\ No newline at end of file \ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment