wdgt H A
off
4men RSS
400
227
22
75
343
118
sb
364
74
16
122
#dddddd
true
reloadBtn
303
21
73
24
255
hiliteRefresh();
dimRefresh();
refresh();
H
4men男人風
1.0
www.4men.com.tw
(c) 1995-2008 4men! Taiwan.
4men男人風 頻道
>% % @+ A /*
簡單的客製化參數
gFeedURL 請填入您 blog 的 RSS 2.0 或 Atom Feed 網址
gNormalColor 請填入您想使用的文字醒目提示顏色,為 HTML RGB 色彩十六進
位代碼(如 "#000000" 代表黑色)
gHiliteColor 請填入您想使用的一般文字提示顏色,為 HTML RGB 色彩十六進
位代碼
*/
var gFeedURL = "http://www.4men.com.tw/4menrss.xml";
var gNormalColor = "#000000";
var gHiliteColor = "#cc7700";
/*
loadFeed 從 feedURL 載入 RSS feed 內容,並傳回一個 DOMDocument 物件。
如果不是 RSS 2.0 feed 或載入有問題時,將傳回 null。
注意,本 function 使用同步 XMLHttpRequest,當網路發生問題時,會有可能發生延滯現象。
input:
feedURL RSS Feed URL
Output:
DOMDocument 含有 RSS XML、已 parse 的結構化物件
*/
function loadFeed(feedURL) {
// 使用 XMLHttpRequest 將資料由 feedURL 指定的網址下載下來
var req = new XMLHttpRequest();
req.open("GET", feedURL, false);
// 先試著請伺服器傳回 Content-Type 為 text/xml 的資料,以方便直接 parse 成 XML
req.setRequestHeader("Content-Type", "text/xml");
req.send();
if (req.status != 200)
return null; // 沒有載入成功,傳回 null
if (req.responseXML == null) {
// 會沒有 DOMDocument 有可能伺服器回應的 Content-Type 不是 text/xml
//(有些會傳回 application/xml)
// 用 XMLDOM 強制來 parse 成 XML
try {
var xml = XMLDOM.parse(req.responseText);
} catch (e) {
return null; // 試著 parse 成 XML 但失敗,傳回 null
}
} else
var xml = req.responseXML;
// 檢查是否為 RSS 2.0
var rsss = xml.evaluate("rss"); // 使用 XPath 來取得我們要的 RSS 區段
if (rsss.length == 0) {
// 可能不是 RSS Feed,試試 Atom Feed
var atoms = xml.evaluate("feed");
if (atoms.length == 0)
return null; // 也沒有 Atom Feed,傳回 null
return {kind: 'atom', content: xml}; // 是 Atom Feed
}
if (parseFloat(rsss.item(0).getAttribute("version")) >= 2.0)
return {kind: 'rss', content: xml}; // 是 RSS 2.0 feed,傳回載入的 DOMDocument
else
return null; // 不是 RSS 2.0 feed,傳回 null
}
/*
showRSS 將 rssDOM 內含已 parse 過的 RSS DOMDocument object 來顯示於 widget 的 itemList frame 裡
*/
function showRSS(rssDOM) {
var theItem, newItem, titleView, timeView;
// 先清除目前 itemList frame 的內容
while ((theItem = gRSSItems.shift()) != null) {
theItem.view.removeFromSuperview();
}
var nodes = rssDOM.evaluate("rss/channel/item");
var curY = 0;
for (var i = 0; i < nodes.length; i++) {
newItem = new Array();
newItem.title = (nodes.item(i).getElementsByTagName("title")).item(0).firstChild.data;
newItem.link = (nodes.item(i).getElementsByTagName("link")).item(0).firstChild.data;
newItem.pubDate = new Date(Date.parse((nodes.item(i).getElementsByTagName("pubDate")).item(0).firstChild.data));
newItem.view = new Frame(); // 新增 RSS 新聞項目 sub frame
newItem.view.hOffset = 5;
newItem.view.vOffset = curY;
newItem.view.width = itemList.width;
newItem.view.height = 18;
newItem.view.onMouseEnter = "hiliteItem(" + i + ")";
newItem.view.onMouseExit = "dimItem(" + i + ")";
newItem.view.onMouseUp = "openURL('" + newItem.link + "')";
titleView = new Text(); // 新增 RSS 新聞項目的新聞 title 文字區塊
titleView.data = newItem.title;
titleView.vOffset = 15;
titleView.hOffset = 0;
titleView.font = "MS UI Gothic, Arial, Helvetica";
titleView.color = gNormalColor;
titleView.size = 12;
titleView.width = itemList.width - 90;
titleView.truncation = "end";
titleView.tooltip = newItem.title;
newItem.view.addSubview(titleView); // 加到 RSS 新聞項目 sub frame 中
timeView = new Text(); // 新增 RSS 新聞項目的新聞 title 文字區塊
timeView.data = newItem.pubDate.getFullYear() + "/" +
(newItem.pubDate.getMonth() + 1) + "/" +
newItem.pubDate.getDate();
timeView.vOffset = 15;
timeView.hOffset = itemList.width - 75;
timeView.font = "MS UI Gothic, Arial, Helvetica";
timeView.color = gNormalColor;
timeView.size = 12;
timeView.truncation = "end";
timeView.width = 110;
newItem.view.addSubview(timeView); // 加到 RSS 新聞項目 sub frame 中
gRSSItems.push(newItem); // 將所有 RSS 新聞項目記錄在 gRSSItems 陣列中
itemList.addSubview(newItem.view);
curY += 18;
updateNow();
}
}
/*
ISO8601 日期 / 時間分析函式(從 Atom Feed 來的日期時間字串轉成 JavaScript Date object)
來源:http://delete.me.uk/2005/03/iso8601.html
*/
Date.prototype.setISO8601 = function (string) {
var regexp = "([0-9]{4})(-([0-9]{2})(-([0-9]{2})" +
"(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?" +
"(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?";
var d = string.match(new RegExp(regexp));
var offset = 0;
var date = new Date(d[1], 0, 1);
if (d[3]) { date.setMonth(d[3] - 1); }
if (d[5]) { date.setDate(d[5]); }
if (d[7]) { date.setHours(d[7]); }
if (d[8]) { date.setMinutes(d[8]); }
if (d[10]) { date.setSeconds(d[10]); }
if (d[12]) { date.setMilliseconds(Number("0." + d[12]) * 1000); }
if (d[14]) {
offset = (Number(d[16]) * 60) + Number(d[17]);
offset *= ((d[15] == '-') ? 1 : -1);
}
offset -= date.getTimezoneOffset();
time = (Number(date) + (offset * 60 * 1000));
this.setTime(Number(time));
}
/*
showAtom 將 atomDOM 內含已 parse 過的 Atom Feed DOMDocument object 來顯示於 widget 的 itemList frame 裡
*/
function showAtom(atomDOM) {
var theItem, newItem, titleView, timeView;
// 先清除目前 itemList frame 的內容
while ((theItem = gRSSItems.shift()) != null) {
theItem.view.removeFromSuperview();
}
var nodes = atomDOM.evaluate("feed/entry");
var curY = 3, dateStr, links, j;
for (var i = 0; i < nodes.length; i++) {
newItem = new Array();
newItem.title = (nodes.item(i).getElementsByTagName("title")).item(0).firstChild.data;
links = nodes.item(i).getElementsByTagName("link");
if (links.length > 1) {
// 當有一篇文章有多個 link 時,須判別哪個才是我們要的
// 我們只要 rel 屬性為 'alternate' 的 link 中的 href
for (j = 0; j < links.length; j++) {
if (links.item(j).getAttribute('rel') == 'alternate') {
newItem.link = links.item(j).getAttribute('href');
break;
}
}
} else if (links.length == 1) {
newItem.link = links.item(0).getAttribute('href');
}
// 詭異的 blogger Atom Feed 居然沒有把 updated 這個必要 child node 放在 entry 中
// 所以先試試 updated,如果沒有,再試 issued
try {
dateStr = nodes.item(i).getElementsByTagName("updated").item(0).firstChild.data;
} catch (e) {
dateStr = nodes.item(i).getElementsByTagName("issued").item(0).firstChild.data;
}
// 將 Atom 的日期分解成 JavaScript Date object
newItem.pubDate = new Date();
newItem.pubDate.setISO8601(dateStr);
newItem.view = new Frame(); // 新增 RSS 新聞項目 sub frame
newItem.view.hOffset = 5;
newItem.view.vOffset = curY;
newItem.view.width = itemList.width;
newItem.view.height = 18;
newItem.view.onMouseEnter = "hiliteItem(" + i + ")";
newItem.view.onMouseExit = "dimItem(" + i + ")";
newItem.view.onMouseUp = "openURL('" + newItem.link + "')";
titleView = new Text(); // 新增 RSS 新聞項目的新聞 title 文字區塊
titleView.data = newItem.title;
titleView.vOffset = 15;
titleView.hOffset = 0;
titleView.font = "MS UI Gothic, Arial, Helvetica";
titleView.color = gNormalColor;
titleView.size = 12;
titleView.width = itemList.width - 90;
titleView.truncation = "end";
titleView.tooltip = newItem.title;
newItem.view.addSubview(titleView); // 加到 RSS 新聞項目 sub frame 中
timeView = new Text(); // 新增 RSS 新聞項目的新聞 title 文字區塊
timeView.data = newItem.pubDate.getFullYear() + "/" +
(newItem.pubDate.getMonth() + 1) + "/" +
newItem.pubDate.getDate();
timeView.vOffset = 15;
timeView.hOffset = itemList.width - 75;
timeView.font = "MS UI Gothic, Arial, Helvetica";
timeView.color = gNormalColor;
timeView.size = 12;
timeView.truncation = "end";
timeView.width = 110;
newItem.view.addSubview(timeView); // 加到 RSS 新聞項目 sub frame 中
gRSSItems.push(newItem); // 將所有 RSS 新聞項目記錄在 gRSSItems 陣列中
itemList.addSubview(newItem.view);
curY += 18;
updateNow();
}
}
function hiliteItem(i) {
gRSSItems[i].view.subviews[0].color = gHiliteColor;
gRSSItems[i].view.subviews[1].color = gHiliteColor;
}
function dimItem(i) {
gRSSItems[i].view.subviews[0].color = gNormalColor;
gRSSItems[i].view.subviews[1].color = gNormalColor;
}
function refresh() {
var theFeed = loadFeed(gFeedURL);
if (theFeed == null)
print("無法載入 RSS 或 Atom Feed");
else if (theFeed.kind == "rss")
showRSS(theFeed.content);
else {
showAtom(theFeed.content);
}
}
function hiliteRefresh() {
reloadBtn.src = "Resources/reload-small-down.png";
}
function dimRefresh() {
reloadBtn.src = "Resources/reload-small-up.png";
}
var gRSSItems = new Array();
refresh();U &