/** * RSSリーダー(同一ドメインのみ) Version 1.3.1 * 複数指定したRSS1.0、RSS2.0を読み、日付の新しい順にソートして、指定件数分テーブルタグで出力する。 * 使い方:new CorebloRss(出力先タグID, RSSのUrlリスト(RSS毎に付加するスタイルクラス、付加タイトル[trueはRSSのタイトル]), 表示件数, newのスタイルクラスを設定する日数, 読み込み待ち時表示タグ, リンクを新しいウインドウで開くかどうか, 本文表示文字数(NULLでタグごと非表示、0で文字数制限なし), 除外する記事のタイトル文字列(前方一致)配列); * 例:new CorebloRss("target", new Array( * {url:"./rss/rss1.rdf", "class":"user1", "title": true} * , {url:"./rss/rss2.xml", "class":"user2", "title": "タイトル"} * ), 10, 5, "Now loading...", false, 0, new Array('PR: ', '[PR] ')); * * Copyright (C) 2012-2016 maverica corporation. All Rights Reserved. */ var CorebloRss = function(id, rssList, dispCnt, newDays, loadingStr, isNewWindow, bodyLength, excludeTitleStrList) { this.target = document.getElementById(id); if(loadingStr) { this.setText(loadingStr); } this.infoList = new Array(); this.rssList = rssList; this.dispCnt = dispCnt; this.newDays = newDays; this.isNewWindow = isNewWindow; this.bodyLength = bodyLength; this.excludeTitleStrList = excludeTitleStrList; var myObj = this; setTimeout(function() {myObj.getRss();}, 50); }; CorebloRss.prototype = { draw:function() { var child = this.target.firstChild; while(child.nextSibling) { this.target.removeChild(child.nextSibling); } this.target.removeChild(child); var newTime = new Date(); newTime -= (this.newDays * 86400000); if(this.infoList.length > 0) { var ulObj = document.createElement("ul"); this.target.appendChild(ulObj); for(var i=0; i/g, ""); if(this.bodyLength != 0 && textStr.length > this.bodyLength) { textStr = textStr.substr(0, this.bodyLength)+"..."; } divObj.appendChild(document.createTextNode(textStr)); liObj.appendChild(divObj); } } } } else { this.target.appendChild(document.createTextNode("ニュースはありません。")); } }, setText: function(str) { this.target.innerHTML = str; }, diffFunc:function(a, b) { return(b[0] - a[0]); }, getHttpObj:function() { if(window.XMLHttpRequest) { return new XMLHttpRequest(); } else if(window.ActiveXObject) { return new ActiveXObject("Microsoft.XMLHTTP"); } else { throw "err"; } }, getRss:function() { if(this.rssList.length > 0) { var rssInfo = this.rssList.shift(); try { var httpObj = this.getHttpObj(); httpObj.open("GET", rssInfo["url"], true); var myObj = this; httpObj.onreadystatechange = function(){ if(httpObj.readyState == 4) { if(httpObj.status == 200) { var xml = httpObj.responseXML; if(xml) { var title = ""; if(rssInfo["title"]) { if(typeof(rssInfo["title"]) == "string") { title = rssInfo["title"]; } else { title = xml.getElementsByTagName("title")[0].firstChild.nodeValue; } } var list = xml.getElementsByTagName("item"); //RSS if(list.length === 0) { list = xml.getElementsByTagName("entry"); //ATOM } if(list.length > 0) { for(var i=0; i < list.length; i++) { var contentsTitle = list[i].getElementsByTagName("title")[0].firstChild.nodeValue; if(myObj.excludeTitleStrList && Object.prototype.toString.call(myObj.excludeTitleStrList) === '[object Array]' && myObj.excludeTitleStrList.length > 0) { var isBreak = false; for(var j in myObj.excludeTitleStrList) { if(contentsTitle.indexOf(myObj.excludeTitleStrList[j])===0) { isBreak = true; break; } } if(isBreak) { continue; } } var dateTime = null; var tmpObj1 = list[i].getElementsByTagName("pubDate")[0]; //RSS2.0 var tmpObj2 = list[i].getElementsByTagName("dc:date")[0]; //RSS1.0 if(!tmpObj2) { tmpObj2 = list[i].getElementsByTagName("date")[0]; //RSS1.0 } if(!tmpObj2) { tmpObj2 = list[i].getElementsByTagName("published")[0]; //ATOM1.0 } if(!tmpObj2) { tmpObj2 = list[i].getElementsByTagName("issued")[0]; //ATOM0.3 } if(tmpObj1) { dateTime = Date.parse(tmpObj1.firstChild.nodeValue); } else if(tmpObj2) { dateTime = myObj.parseDate(tmpObj2.firstChild.nodeValue); } else { continue; } var bodyText = ""; var tmpObj3 = list[i].getElementsByTagName("content:encoded")[0]; //RSS1.0 if(!tmpObj3) { tmpObj3 = list[i].getElementsByTagName("description")[0]; //RSS2.0 if(!tmpObj3) { tmpObj3 = list[i].getElementsByTagName("content")[0]; //ATOM0.3/1.0 } } if(tmpObj3) { bodyText = tmpObj3.firstChild.nodeValue; } if(dateTime) { var classStr = ""; if(rssInfo["class"]) { classStr = rssInfo["class"]; } var link = ""; if(list[i].getElementsByTagName("link")[0].firstChild) { link = list[i].getElementsByTagName("link")[0].firstChild.nodeValue; //RSS } else { link = list[i].getElementsByTagName("link")[0].getAttribute("href"); //ATOM } myObj.infoList.push(new Array( dateTime ,contentsTitle ,link ,classStr ,title ,bodyText )); myObj.infoList.sort(myObj.diffFunc); if(myObj.infoList.length > myObj.dispCnt) { myObj.infoList = myObj.infoList.slice(0, myObj.dispCnt); } } } } setTimeout(function() {myObj.getRss();}, 50); } else { myObj.setText("Error:解析エラー["+rssInfo["url"]+"]"); } } else { myObj.setText("Error:HTTPエラー["+rssInfo["url"]+"]"); } } }; httpObj.send(""); } catch(e) { this.setText("Error:このブラウザではリクエストできません"); } } else { this.draw(); } }, parseDate:function(dateStr) { //ブラウザにより数値形式をパースできない場合がある //dateTime = Date.parse(dateStr); dateStr = dateStr.replace("Z", ""); var tmpList = dateStr.split("T"); var tmpDate = tmpList[0].split("-"); var timeStr = tmpList[1]; var pos = timeStr.indexOf("+"); if(pos !== -1) { timeStr = timeStr.substring(0, pos); } pos = timeStr.indexOf("-"); if(pos !== -1) { timeStr = timeStr.substring(0, pos); } var tmpTime = timeStr.split(":"); return Date.UTC(tmpDate[0], tmpDate[1]-1, tmpDate[2], tmpTime[0], tmpTime[1], tmpTime[2]); } };