Re: rants
Nicholas Bonfatti <[email protected]> Sun, 7 Mar 2004 02:21:10 -0500
| Newsgroups | gmane.org.ballistichelmet.devel |
|---|---|
| Message-ID | <[email protected]> |
You love scheme! On Mar 7, 2004, at 2:17 AM, dvanhorn wrote: > #| -*- > Scheme -*- > Copyright (c) 2003 David Van Horn > Licensed under the Academic Free License version 2.0 > > [email protected] > > removed dependency on SSAX, minor bug fixes, released under AFL 2.0. > Sun Mar 7 01:31:25 EST 2004 > > modified to make latest.html, an HTML fragment for inclusion in BH's > index.html > Sat Apr 5 18:15:47 EST 2003 > > modified to work as command line program, and cgi program. > Sat Oct 26 14:47:59 EDT 2002 > > original version > Sun Sep 15 03:31:58 EDT 2002 > |# > > #cs > (module rant mzscheme > (require (lib "cgi.ss" "net") > (lib "date.ss" "mzlib") > (lib "cmdline.ss" "mzlib") > (lib "xml.ss" "xml") > (lib "match.ss")) > > (provide cgi-add-rant > cmdline-add-rant > add-rant) > > (define base "/home/bh/www/rant/") > (define url-base "http://ballistichelmet.org/rant/") > (define (url+ s) > (format "http://ballistichelmet.org/rant/~a" s)) > > ;; this is the CGI interface for adding a rant. > ;; we extract the rant from the CGI environment variables `rant-subj' > ;; and `rant-text', add the rant, and then print out an html page to > ;; report to the user that all is well, and the rant is available for > ;; viewing. > (define (cgi-add-rant) > (output-http-headers) > (write-xml/content > (xexpr->xml > ;; add the rant and get the filename of the new rant > (let ((file (add-rant > (extract-binding/single 'rant-subj (get-bindings)) > (extract-binding/single 'rant-text > (get-bindings))))) > > ;; let user know where the new rant is placed. > `(html (head (title "rant submitted") > (link ((rel "stylesheet") > (href ,(url+ "rant.css"))))) > (body > (p "your rant has been submitted and is available now > at " > (a ((href ,(url+ file))) > ,(url+ file)) ".") > (p "thank you") > (p (a ((href ,url-base)) > "back to rant index")) > (p (a ((href "/")) > "back to ballistic helmet")))))))) > > ;; this is the command line interface for adding a rant. > ;; the rant subject and body may be given to us on the command line, > ;; otherwise we prompt the user for them. > (define (cmdline-add-rant) > (let ((subj null) (text null)) > (command-line "rant" (current-command-line-arguments) > (once-each > [("-s" "--subject") s "the subject of your rant" > (set! subj s)] > [("-b" "--body") b "the body of your rant" > (set! text b)])) > > ;; if the subject and text were not specified on the command line > ;; then prompt for them from the user. > (when (null? subj) (set! subj (prompt "subj: " #\newline))) > (when (null? text) (set! text (prompt "rant:\n" eof))) > > ;; let the user know where the rant has been placed > (printf "your rant has been submitted and is available now at > ~a~n" > (url+ (add-rant subj text))))) > > > ;; reads characters from the current input port until the character > is > ;; equal to the end object. returns a string of all characters read. > ;; the end object is trimmed (ie does not get returned at the end of > ;; the string) > (define (prompt p end-obj) > (printf p) > (if (eqv? end-obj #\newline) > (let loop () (let ((x (read-line))) (if (string=? "" x) (loop) > x))) > (apply string-append > (let loop ((lines null)) > (let ((line (read-line))) > (if (eof-object? line) > (reverse! lines) > (loop (cons (string-append line "\n") > lines)))))))) > > ;; add the rant and return the filename of the new rant > (define (add-rant subj text) ;; -> string > (let* ((seconds (current-seconds)) > (date (date->string (seconds->date seconds) #t)) > (file (string-append (number->string seconds) ".html")) > (item `(item () > (title () ,subj) > (link () ,file) > (pubDate () ,date) > (description () > ,(format "~n<pre>~a</pre>" > text))))) > > ;; Insert the new item into the RSS feed file. > > (match (xml->xexpr > (with-input-from-file (string-append base "rants.xml") > read-xml/element)) > (('rss att ('channel '() title link desc . items)) > (begin > (make-index (cons item items)) ;; make index.html > (with-output-to-file (string-append base "rants.xml") > (lambda () > (write-xml/content > (xexpr->xml > `(rss ,att (channel ,title ,link ,desc ,item > ,@items))))) > 'replace)))) > > ;; make a file for the rant > ;; the name of the file is the time (in seconds) plus .html > (with-output-to-file (string-append base file) > (lambda () > (write-xml/content > (xexpr->xml > `(html (head (title ,(format "rant - ~a" subj)) > (link ((rel "stylesheet") > (href ,(url+ "rant.css"))))) > (body (h1 ,subj) > (h2 "created " ,date) > (pre (tt ,text)) > (p (a ((href ,url-base)) > "back to rant index")) > (p (a ((href "/")) > "back to ballistic helmet")))))))) > > file)) ;; return the filename of the new rant. > > ; make an index.html page listing all the rants > (define (make-index rants) ;; listof item > (with-output-to-file (string-append base "index.html") > (lambda () > (display-xml/content > (xexpr->xml > `(html > (head (title "rant index") > (link ((rel "stylesheet") > (href ,(url+ "rant.css"))))) > (body > (table > ((style "width: 100%;")) > (tr > (td > (img ((border "0") > (src "http://www.uvm.edu/~dvanhorn/bh.png")))))) > (p ((style "text-align: right")) > (a ((href "/")) "back to bh")) > (img ((src "rant-top.png") (alt "RANTS"))) > ,(with-input-from-file (string-append base "about.txt") > read) > (img ((src "rant-write.png") (alt "write a new goddamn > rant"))) > (p "create a new rant " > (a ((href ,(url+ "new.html"))) > "here")) > (img ((src "rant-read.png") (alt "read a goddamn rant"))) > (table > ,@(map > (match-lambda > (('item '() ('title '() t) ('link '() l) ('pubDate > '() d) > . _) > `(tr (td ,d) > (td (a ((href ,l)) > ,t))))) > rants))))))) > 'replace)) > > ) ;; end of rant.ss > > _______________________________________________ > devel mailing list > [email protected] > http://ballistichelmet.org/mailman/listinfo/devel >