Hi SGP,
> Can the latest rev be posted here?
Attached.
This version fixes a couple other bugs as well, (and does the little
'rssx terminated' thingy for John). :)
Still no fix (or clues) for the W3 feed 'freeze' issue.
Regards,
Shawn K. Hall
http://ReliableAnswers.com/
'// ========================================================
Hatred paralyzes life; love releases it.
Hatred confuses life; love harmonizes it.
Hatred darkens life; love illumines it.
-- Martin Luther King, Jr. (1929-1968)
<search function="rssx">
<name>RSS Feed Parser</name>
<description>Parses an RSS feed and pops the results every 8 seconds (configurable).
<div class="helpboxDescLabels">Switches:</div>
<table class="helpboxDescTable">
<tr><td> url </td><td> - </td><td> URL of RSS Feed to process. </td></tr>
<tr><td> /stop </td><td> - </td><td> Terminate RSS processing and display </td></tr>
</table>
<div class="helpboxDescLabels">Examples:</div>
<table class="helpboxDescTable">
<tr><td> rssx http://ReliableAnswers.com/rss.asp </td></tr>
<tr><td> rssx http://slashdot.org/slashdot.rdf </td></tr>
<tr><td> rssx http://www.eff.org/rss/press.xml </td></tr>
<tr><td> rssx /stop </td></tr>
</table>
</description>
<category>Functions</category>
<link>http://ReliableAnswers.com/x/dqsd/</link>
<contributor>Shawn K. Hall</contributor>
<script><![CDATA[
function rssx(q){
if( q == "?" ){
qsfind("rssx /function");
return false;
}
if (q == "/stop"){
rssxSearchTerminate = true;
rssxDisplayAgain= false;
rssxSearchArray = rssxSearchArray.slice(rssxSearchArray.length);
setSearchWindowText("rssx terminated");
return false;
}
rssxSearchTerminate = false;
var sUrl = ((isURL(q)) ? q : "http://reliableanswers.com/rss.asp");
try{
//attempt to obtain the remote RSS feed
var xmlHttp = new ActiveXObject("Microsoft.XmlHttp");
xmlHttp.onreadystatechange = function() {
if (xmlHttp.readyState==4) {
rssxXmlParser( xmlHttp, sUrl );
}
};
xmlHttp.open("GET", sUrl, true);
xmlHttp.setRequestHeader ( "Accept", "application/xml, text/xml, text/rss, application/xml+rdf, */*" );
xmlHttp.setRequestHeader ( "User-Agent", "Mozilla/4.0 (compatible; DQSD ( http://www.dqsd.net/ ); rssx Search ( http://ReliableAnswers.com/x/dqsd/ ))" );
xmlHttp.send(null);
}catch(e){
alert("RSSX: Failure!\n" + e.number + "::" + e.description);
}
}
function rssxXmlParser( xmlHttp, sUrl ){
if (rssxSearchTerminate == true) {return false;}
var sBuild = "";
try{
//get the response content from the remote site
var sBody = xmlHttp.responseText;
sBody = sBody.replace(/(\<\?xml-stylesheet[^>]*>)/gim,"<!-- $1 -->");
var xBody = new ActiveXObject("MSXML2.DOMDocument");
xBody.loadXML( sBody );
if(xBody.parseError.errorCode != 0)
throw new Error(0, "RSS is not well-formed.\nParse error: " + xBody.parseError.reason + " line: " + xBody.parseError.line.toString() + ", col: " + xBody.parseError.linepos.toString() + "\n" + xBody.parseError.srcText);
//parse it
var xElement = xBody.documentElement;
//rss version, capabilities and format
//default paths and properties
var rDate = "pubdate";
var rLanguage= "";
var rItems = "item";
var rImage = "image";
var rInput = "textinput";
var rVersion = "";
var rSyPeriod= "";
var rSyFreq = "";
var rContent = "";
var rsTitle = "";
var rsImage = "";
var rsLink = "";
//document element name
var rDocElem = xElement.nodeName;
//version="1.0"
xNode = xElement.attributes.getNamedItem("version");
if (xNode != null) rVersion = xNode.nodeTypedValue;
switch (rVersion){
case "": rItems = "item"; rImage = "image"; rInput = "textinput"; break;
case "0.9":
case "0.91":
case "0.92":
case "1.0":
case "2.0":
default:
rItems = "channel/item"; rImage = "channel/image"; rInput = "channel/textinput"; break;
}
//xmlns="http://purl.org/rss/1.0/"
xNode = xElement.attributes.getNamedItem("xmlns");
var rXmlns = ((xNode != null) ? xNode.nodeTypedValue : "");
//xmlns:dc="http://purl.org/dc/elements/1.1/"
xNode = xElement.attributes.getNamedItem("xmlns:dc");
var rXmlnsDc = ((xNode != null) ? xNode.nodeTypedValue : "");
if (rXmlnsDc != "") {
rDate = "dc:date";
xNode = xElement.selectSingleNode("channel");
if (xNode != null) {
xNodeSub = xNode.selectSingleNode("dc:language");
if (xNodeSub != null) rLanguage = xNodeSub.nodeTypedValue;
}
}
//xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xNode = xElement.attributes.getNamedItem("xmlns:rdf");
var rXmlnsRdf= ((xNode != null) ? xNode.nodeTypedValue : "");
//xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xNode = xElement.attributes.getNamedItem("xmlns:sy");
var rXmlnsSy = ((xNode != null) ? xNode.nodeTypedValue : "");
if (rXmlnsSy != "") {
xNode = xElement.selectSingleNode("channel");
if (xNode != null) {
xNodeSub = xNode.selectSingleNode("sy:UpdatePeriod");
if (xNodeSub != null) rSyPeriod = xNodeSub.nodeTypedValue;
xNodeSub = xNode.selectSingleNode("sy:UpdateFrequency");
if (xNodeSub != null) rSyFreq = xNodeSub.nodeTypedValue;
}
}
//xmlns:content="http://purl.org/rss/1.0/modules/content/"
xNode = xElement.attributes.getNamedItem("xmlns:content");
var rXmlnsContent = ((xNode != null) ? xNode.nodeTypedValue : "");
if (rXmlnsContent != "") rContent = "content:encoded";
//obtain image/title/link properties
xNode = xElement.selectSingleNode( rImage );
if (xNode != null) {
xNodeSub = xNode.selectSingleNode("title");
if (xNodeSub != null) rsTitle= xNodeSub.nodeTypedValue;
xNodeSub = xNode.selectSingleNode("url");
if (xNodeSub != null) rsImage= xNodeSub.nodeTypedValue;
xNodeSub = xNode.selectSingleNode("link");
if (xNodeSub != null) rsLink = xNodeSub.nodeTypedValue;
}
//enumerate RSS items
var xNodes = xElement.selectNodes( rItems );
for (i=0; i < xNodes.length; i++){
//get variables for this resource
var xNode = xNodes.item(i);
xNodeSub = xNode.selectSingleNode("title");
var sTitle= ((xNodeSub != null) ? xNodeSub.nodeTypedValue : "");
xNodeSub = xNode.selectSingleNode("description");
var sDesc = ((xNodeSub != null) ? xNodeSub.nodeTypedValue : "");
sDesc = sDesc.replace(/<a[\s]*[^>]href="([^"]+)"[^>]*>/gim,"<a onClick=\"window.parent.openSearchWindow('$1')\">");
xNodeSub = xNode.selectSingleNode("link");
var sLink = ((xNodeSub != null) ? xNodeSub.nodeTypedValue : "");
if (sLink == ""){
xNodeSub = xNode.selectSingleNode("guid");
var sLink = ((xNodeSub != null) ? xNodeSub.nodeTypedValue : "");
}
if (rContent != ""){
xNodeSub = xNode.selectSingleNode( rContent );
var sContent = ((xNodeSub != null) ? xNodeSub.nodeTypedValue : "");
sContent = sContent.replace(/<a[\s]*[^>]href="([^"]+)"[^>]*>/gim,"<a onClick=\"window.parent.openSearchWindow('$1')\">");
}else{
var sContent = "";
}
//append this record
sBuild = "";
sBuild+= "<table width=\"100%\" border=\"0\" onClick=\"window.parent.openSearchWindow('" + sLink + "')\"><tr>";
if (rsLink != ""){
sBuild+= "<td width=\"5%\">";
sBuild+= "<a href=\"" + rsLink + "\" title=\"" + rsTitle + "\">";
if (rsImage != ""){
sBuild+= "<img src=\"" + rsImage + "\" border=\"0\" />";
}else{
sBuild+= rsTitle;
}
sBuild+= "</a></td>";
}else{
sBuild+= "<td width=\"5%\">";
sBuild+= "<a href=\"http://reliableanswers.com/x/dqsd/?rss=" + sUrl + "\">";
if (rsImage != ""){
sBuild+= "<img src=\"" + rsImage + "\" border=\"0\" />";
}else{
sBuild+= "[RSSX]";
}
sBuild+= "</a></td>";
}
sBuild+= "<td>";
sBuild+= "<p align=\"left\"><b>" + sTitle + "</b></p>";
sBuild+= "</td></tr>\n";
sBuild+= "<tr><td colspan=\"2\">";
sBuild+= "<p>" + sDesc + "</p>";
if (sContent != ""){
sBuild+= "<hr />" + sContent;
}
sBuild+= "</td></tr>\n";
sBuild+= "</table>\n\n";
rssxSearchArray[rssxSearchArray.length] = sBuild;
}
if (rssxSearchArray.length > 0){
if (rssxDisplayAgain == false) displayRssxSearchPopup();
}
}catch(e){
alert("RSSX: Failure!\n" + e.number + "::" + e.description);
}
}
var rssxSearchPopup;
var rssxSearchTerminate = false;
var rssxSearchIndex = 0;
var rssxSearchArray = Array();
var rssxDisplayAgain= false;
var rssxSearchURL = '';
if (typeof rssxTimeOutAfter == "undefined") rssxTimeOutAfter = 6000;
function displayRssxSearchPopup(){
if (typeof rssxTimeOutAfter == "undefined") rssxTimeOutAfter = 8000;
var windowW = 380;
var rssxContent = "undefined";
try{
if (rssxSearchArray.length>=1){
var rssxContent = rssxSearchArray[0];
rssxSearchArray = rssxSearchArray.slice(1);
}
}catch(e){}
if (rssxContent != "undefined") {
try{
rssxSearchPopup = window.createPopup();
var rssxSearchPopupBody = rssxSearchPopup.document.body;
var rssxSearchPopupBodyCode = "<html><head></head><body>";
rssxSearchPopupBodyCode += "<table id=rstable border=0 cellspacing=1 cellpadding=2 width=100% height=100%>";
rssxSearchPopupBodyCode += "<tr><td valign=top><style>" + convertStylesToInline() + "</style>";
rssxSearchPopupBodyCode += "<tr><td valign=top style='text-align: center' class=helpboxDescriptions>" + rssxContent;
rssxSearchPopupBodyCode += "</tr></td></table></body></html>";
rssxSearchPopupBody.innerHTML = rssxSearchPopupBodyCode;
rssxSearchPopup.document.body.style.border="outset 2px";
rssxSearchPopup.document.body.style.background='menu';
rssxSearchPopup.document.body.style.overflowY='auto';
// Temporarily show the popup to determine the proper final height for the popup.
rssxSearchPopup.show(0, 0, windowW, 0);
var windowH = rssxSearchPopupBody.scrollHeight + 6;
rssxSearchPopup.hide();
// Put a cap on the popup height
windowH = windowH > window.screen.height-100 ? window.screen.height-100 : windowH;
// Display it
rssxSearchPopup.show((buttonalign == "left" ? 0 : document.body.clientWidth - windowW), -windowH, windowW, windowH, document.body);
}catch(e){
rssxDisplayAgain = false;
}
}
// Set next display + timeout
try{
if (rssxSearchArray.length > 0){
rssxDisplayAgain = true;
setTimeout("try{rssxSearchPopup.hide();rssxSearchPopup='';displayRssxSearchPopup();}catch(e){}",rssxTimeOutAfter);
}else{
rssxDisplayAgain = false;
setTimeout("try{rssxSearchPopup.hide();rssxSearchPopup='';}catch(e){}",rssxTimeOutAfter);
}
}catch(e){
rssxDisplayAgain = false;
}
}
]]></script>
<copyright>
Copyright (c) 2004 Shawn K. Hall
Distributed under the terms of the GNU Public License, Version 2 (http://www.gnu.org/copyleft/gpl.txt)
</copyright>
</search>