/* appjet:version 0.1 */

(function(){

page.setMode("plain");

const MAX_ITEMS_COUNT = 15;

var h = function(str){
    return String(str || "").replace(/[&<>"']/g, function($0){ return ({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"})[$0]; });
};
var fill = function(str, params){
    return String(str || "").replace(/\$\{(\w+)\}/g, function($0,$1){ return params[$1] || ""; });
};

var p = request.params;

if (!p.url || !p.re || !p.title || p.url.indexOf("http://") !== 0) {
    response.setContentType("text/html;charset=UTF-8");
    response.write("""<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <meta http-equiv="Content-Style-Type" content="text/css">
    <meta http-equiv="Content-Script-Type" content="text/javascript">
    <title>feedgen</title>
</head>
<body>
<h1>feedgen</h1>
<p>Generate RSS 2.0 from (X)HTML by URL and Regular Expression</p>
<p>Example: <a href="http://feedgen.appjet.net/?url=http%3A%2F%2Ffeedgen.appjet.net%2F&re=%3Cp%3E%28.*%3F%29%3Cbr%3E&title=1">http://feedgen.appjet.net/?url=http%3A%2F%2Ffeedgen.appjet.net%2F&re=%3Cp%3E%28.*%3F%29%3Cbr%3E&title=1</a></p>
<form method="get" action="/">
  <fieldset>
    <legend>required</legend>
    <p>url (URL)<br><input type="text" size="80" name="url" value="http://"></p>
    <p>re (Regular Expression for Items)<br><textarea rows="2" cols="60" name="re"></textarea></p>
    <p>title (Capturing Group Number for Item Title)<br><input type="text" size="80" name="title" value=""></p>
    <p><input type="submit" value="Generate"> <input type="reset" value="Clear"></p>
  </fieldset>
  <fieldset>
    <legend>optional</legend>
    <p>description (Capturing Group Number for Item Description)<br><input type="text" size="80" name="description" value=""></p>
    <p>feedtitle (Feed Title)<br><input type="text" size="80" name="feedtitle" value=""></p>
    <p>feeddescription (Feed Description)<br><input type="text" size="80" name="feeddescription" value=""></p>
    <p>language (Language)<br><input type="text" size="80" name="language" value=""></p>
    <p>charset (Character Set for HTTP &quot;Content-Type&quot; Header)<br><input type="text" size="80" name="charset" value=""></p>
  </fieldset>
</form>
</body>
</html>
""");
    return;
}

var res = wget(p.url, {}, {complete: true});
var charset = p.charset || (res.contentType.match(/;\s*charset=([^;]+)/) || {})[1] || (res.data.match(/<meta[^<]+http-equiv=(["'])Content-Type\1[^<]+content=(["'])[^<]+?charset=([^<;]+)[^<]*\2[^<]*>/i) || {})[3] || "";
var channel = {
    title: h(p.feedtitle || (res.data.match(/<title>([\s\S]+?)<\/title>/i) || {})[1] || p.url),
    link: h(p.url),
    description: h(p.feeddescription || (res.data.match(/<meta[^<]+name=(["'])description\1[^<]+content=(["'])([\s\S]+?)\2[^<]*>/i) || {})[3] || ""),
    language: h(p.language || (res.data.match(/<html[^<]+lang=(["'])([\s\S]+?)\1[^<]*>/i) || {})[2] || ""),
    date: h((res.headers["Last-Modified"] || res.headers["Date"] || [""])[0]),
    self: h("http://" + appjet.appName + "." + appjet.mainDomain + request.path + "?" + request.query),
};
var re = new RegExp(p.re, "mg"), items = [], m;
var assign = function(str, m){
    return String(str || "").replace(/(?:^|\s)(\d+)(?:\s|$)/g, function($0,$1){ return m[$1] || $0; });
};
while (m = re.exec(res.data)) {
    var guid = md5(m[0]);
    items.push({
        title: h(assign(p.title, m)),
        link: h(channel.link + "#" + guid),
        guid: guid,
        description: assign(p.description, m),
    });
}
if (items.length > MAX_ITEMS_COUNT) items.splice(MAX_ITEMS_COUNT);

response.setContentType("application/rss+xml" + (charset ? "; charset=" + charset : ""));
response.write(fill("""<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>${title}</title>
    <link>${link}</link>
    <description>${description}</description>
    <language>${language}</language>
    <pubDate>${date}</pubDate>
    <lastBuildDate>${date}</lastBuildDate>
    <atom:link href="${self}" rel="self" type="application/rss+xml" />
""", channel));

for (var i=0,l=items.length; i<l; i++) {
    response.write(fill("""    <item>
       <title>${title}</title>
       <link>${link}</link>
       <guid isPermaLink="false">${guid}</guid>
       <description><![CDATA[${description}]]></description>
    </item>
""", items[i]));
}

response.write("""  </channel>
</rss>
""");

})();


© Copyright 2007-2009 AppJet Inc.