[REBOL] lister
From: Al::Bri::xtra::co::nz at: 12-Jul-2003 17:41
Beware!
I've had to change this line:
;test: system/version/4 = 3
to this:
test: true
Andrew J Martin
ICQ: 26227169 http://www.rebol.it/Valley/ http://Valley.150m.com/
-><-
#!rebol -cs
REBOL [
Name: 'lister
Title: "REBOL Email Discussion Web Pages"
File: %lister.r
Author: ["Carl Sassenrath"]
Version: 1.1.0
Date: 10-Jul-2003
Tabs: 4
Revisions: [
12/July/2003 1.1.0 [Al--Bri--xtra--co--nz] "Gold leafing..."
10-Jul-2003 1.0.3 [carl--rebol--com] {Minor cleanups.}
10-Jul-2003 1.0.1 [carl--rebol--com] {Released source code.}
]
]
; If we're on the devel system, set switch for rapid development:
;test: system/version/4 = 3
test: true
Folder: %web/
; Master index file name:
index-file: %index.html
; Source output file:
source-file: replace copy Rebol/script/header/File %.r %.html
css-file: replace copy Rebol/script/header/File %.r %.css
; Target directory for storing message HTML files:
msg-dir-ref: %list-msgs/
msg-dir: Folder/:msg-dir-ref
if not exists? msg-dir [
make-dir/deep msg-dir
]
; Message block format:
; * Each record is a block of: [id from subject date content]
; * Order is older to newer
; * DB currently selects only current month (to be changed)
; * Date field is currently a string (but should be REBOL date/time)
; Or using Rebol to describe it, it's like:
; [id [integer!] from [email!] subject [string!] date [string!] content
[string!]]
msgs: either test [
; Just use some test messages:
[
[10001 [carl--rebol--com] "Example Message" "3 Jul 2003" "Content here"]
[10002 [luke--rebol--com] "Another Message" "4 Jul 2003" "Happy Iday"]
]
][
; Read and parse the database for current month:
; (Note: the DB is huge text file right now, but REBOL parses
; it very fast, so we're being a bit lazy, but it needs to be
; optimized someday.)
msgs: do %load-msgs.r
]
encode-html: func [
; Translate only the most common HTML tags and escapes.
; (If you think others are needed, add them. But remember
; that this code runs at N-squared speed, so take it easy.)
code [string!] "Script to translate"
][
replacements: [#"&" "&" #"<" "<" #">" ">"]
foreach [from to] replacements [
replace/all code from to
]
]
Linkage: func [
Id1 [integer!] "First message number"
Index [integer!] "Current message number"
Id2 [integer!] "Last message number"
] [
rejoin [
either Id1 < Index [
rejoin [{<a href="} Index - 1 {.html">< Older</a> }]
] [
""
]
<a href="../index.html"> "Index" </a>
either Index < Id2 [
rejoin [{ <a href="} Index + 1 {.html">Newer ></a>}]
] [
""
]
]
]
write Folder/:css-file {
@media screen {
body {
color: #000000;
background: #FFFFFC;
}
body, p, td {
Font-Family: "Arial";
Font-Size: 10pt;
}
}
@media print {
}
}
Heading: func [
"Generates standard HTML header."
Title [string!] "The title to show."
] [
rejoin [
make string! 1000
<html><head>
<title> Title </title>
rejoin [{<link rel="stylesheet" type="text/css" href="} css-file {"
/>}]
</head>
]
]
emit-message-page: func [
"Generate a message as a very simple HTML web page."
msg [block!] "Message block: [id from subject date content]"
Id1 [integer!] "First message number"
Id2 [integer!] "Last message number"
][
write join msg-dir [msg/1 ".html"] rejoin [
make string! 1000
Heading join "REBOL List - " msg/3
<body bgcolor=#FFFFFC>
<h1> "REBOL Email Discussion List" </h1>
<h2> encode-html msg/3 </h2>
<b>
msg/2 <br />
msg/4 <br />
"#" msg/1 <br />
Linkage Id1 Msg/1 Id2
</b>
<hr><pre>
encode-html msg/5
</pre><hr><br />
<b> Linkage Id1 Msg/1 Id2 </b> <br />
<a href="http://www.rebol.com"><font color="gray"><b>"2003
REBOL.com"</b></font></a>
</body></html>
]
]
emit-index-line: func [
"Generate a message line in the master index"
msg [block!] "Message block: [id from subject date content]"
][
rejoin [
make string! 1000
pick [<tr> <tr bgcolor="#E0E8E0">] odd? msg/1
<td nowrap width="10" align="right"><font color="GRAY"> msg/1
</font></td>
<td><b> {<a href="} msg-dir-ref msg/1 {.html">} msg/3 </a></b></td>
<td> msg/2 </td>
<td nowrap> msg/4 </td>
</tr>
newline
]
]
emit-index-page: func [
{Generate the master message index page.
Messages are listed in reverse order.}
msgs [block!] "Block of messages"
/local html
][
html: rejoin [
make string! 10000
Heading "REBOL List Index"
<body bgcolor=#FFFFFC>
<h1> "REBOL Email Discussion List" </h1>
<b>
length? msgs " messages for " pick system/locale/months now/month "
as of " now "."
</b>
<br />
"You may need refresh/reload this page to see changes." <br />
"To post messages or learn more, "
<a href="http://www.rebol.com/discussion.html"> "go here" </a> "."
<hr>
<table border="0" cellpadding="4" cellspacing="0" width="100%">
]
foreach msg head reverse msgs [
insert tail html emit-index-line msg
]
write Folder/:index-file rejoin [
html
</table>
<hr>
<font size="1">
<a href="http://www.rebol.com">
<b> "2003 REBOL.com" </b> </a> <br />
rejoin [{<a href="} source-file {">}]
"Lister Source Code " system/script/header/version
</a>
</font>
</body></html>
]
write Folder/:source-file rejoin [
make string! 10000
Heading "REBOL List Source Code"
<body bgcolor=#FFFFFC><pre>
detab/size encode-html read/with Rebol/script/header/File CRLF 4
</pre>
</body></html>
]
]
foreach msg msgs [
emit-message-page msg first first msgs first last msgs
]
emit-index-page msgs
if test [
browse Folder/:index-file
]
quit