AppJet
My Apps
Forum
Docs
sign in
App:
feedgen.appjet.net
(by
mayokara384
)
Overview
Source
Docs
Comments (0)
Clone This App
view as plaintext
/* 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
(
{
"
&
"
:
"
&
"
,
"
<
"
:
"
<
"
,
"
>
"
:
"
>
"
,
'
"
'
:
"
"
"
,
"
'
"
:
"
'
"
}
)
[
$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 "Content-Type" 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.