Update of /project/lisppaste/cvsroot/lisppaste2 In directory common-lisp.net:/tmp/cvs-serv14272
Modified Files: encode-for-pre.lisp lisppaste.asd lisppaste.lisp variable.lisp web-server.lisp Log Message: Add multiple channel support; allow line-wrapping of pastes
Date: Sat Jan 17 12:54:13 2004 Author: bmastenbrook
Index: lisppaste2/encode-for-pre.lisp diff -u lisppaste2/encode-for-pre.lisp:1.6 lisppaste2/encode-for-pre.lisp:1.7 --- lisppaste2/encode-for-pre.lisp:1.6 Sun Nov 30 17:32:45 2003 +++ lisppaste2/encode-for-pre.lisp Sat Jan 17 12:54:13 2004 @@ -1,18 +1,26 @@ -;;;; $Id: encode-for-pre.lisp,v 1.6 2003/11/30 22:32:45 bmastenbrook Exp $ +;;;; $Id: encode-for-pre.lisp,v 1.7 2004/01/17 17:54:13 bmastenbrook Exp $ ;;;; $Source: /project/lisppaste/cvsroot/lisppaste2/encode-for-pre.lisp,v $
;;;; See the LICENSE file for licensing information.
(in-package :lisppaste)
-(defun replace-in-string-1 (str char repstr) +(defun replace-in-string-1 (str char repstr &optional only-in-dup) (let* ((new-length (loop for i from 0 to (1- (length str)) - summing (if (char= (elt str i) char) - (length repstr) 1))) + summing (if (not only-in-dup) + (if (char= (elt str i) char) + (length repstr) 1) + (if (< i (1- (length str))) + (if (and (char= (elt str i) char) + (char= (elt str (1+ i)) char)) + (length repstr) 1) 1)))) (new-array (make-array `(,new-length) :element-type 'character))) (loop for i from 0 to (1- (length str)) with j = 0 - do (if (char= (elt str i) char) + do (if (if only-in-dup + (and (< i (1- (length str))) (and (char= (elt str i) char) + (char= (elt str (1+ i)) char))) + (char= (elt str i) char)) (progn (loop for k from 0 to (1- (length repstr)) do (setf (elt new-array (+ j k)) (elt repstr k))) @@ -33,4 +41,4 @@ (replace-in-string str '(#& #< #>) '("&" "<" ">")))
(defun encode-for-tt (str) - (replace-in-string str '(#& #< #> #\newline #\return #\linefeed #\space #\tab) '("&" "<" ">" "" "<br>" "" " " " "))) \ No newline at end of file + (replace-in-string-1 (replace-in-string str '(#& #< #> #\newline #\return #\linefeed #\tab) '("&" "<" ">" "" "<br>" "" " ")) #\space " " 1)) \ No newline at end of file
Index: lisppaste2/lisppaste.asd diff -u lisppaste2/lisppaste.asd:1.1.1.1 lisppaste2/lisppaste.asd:1.2 --- lisppaste2/lisppaste.asd:1.1.1.1 Mon Nov 3 12:17:53 2003 +++ lisppaste2/lisppaste.asd Sat Jan 17 12:54:13 2004 @@ -1,4 +1,4 @@ -;;;; $Id: lisppaste.asd,v 1.1.1.1 2003/11/03 17:17:53 eenge Exp $ +;;;; $Id: lisppaste.asd,v 1.2 2004/01/17 17:54:13 bmastenbrook Exp $ ;;;; $Source: /project/lisppaste/cvsroot/lisppaste2/lisppaste.asd,v $
;;;; See the LICENSE file for licensing information. @@ -20,7 +20,7 @@ paste text into it. Once pasted, lisppaste will notify a pre-configured IRC channel about the paste and where it can be located." - :depends-on (:araneida :net-nittin-irc) + :depends-on (:araneida :cl-irc) :components ((:file "package") (:file "variable" :depends-on ("package"))
Index: lisppaste2/lisppaste.lisp diff -u lisppaste2/lisppaste.lisp:1.2 lisppaste2/lisppaste.lisp:1.3 --- lisppaste2/lisppaste.lisp:1.2 Mon Nov 10 11:28:43 2003 +++ lisppaste2/lisppaste.lisp Sat Jan 17 12:54:13 2004 @@ -1,11 +1,11 @@ -;;;; $Id: lisppaste.lisp,v 1.2 2003/11/10 16:28:43 eenge Exp $ +;;;; $Id: lisppaste.lisp,v 1.3 2004/01/17 17:54:13 bmastenbrook Exp $ ;;;; $Source: /project/lisppaste/cvsroot/lisppaste2/lisppaste.lisp,v $
;;;; See the LICENSE file for licensing information.
(in-package :lisppaste)
-(defun start-lisppaste (&key (channel *default-channel*) +(defun start-lisppaste (&key (channels (list *default-channel*)) (nickname *default-nickname*) (server *default-irc-server*) (port *default-irc-server-port*)) @@ -15,8 +15,7 @@ :server server :port port))) (setf *connection* connection) - (setf *channel* channel) - (irc:join connection channel) + (setf *channels* channels) + (mapcar #'(lambda (channel) (irc:join connection channel)) channels) (araneida:start-listening *paste-listener*) - (irc:read-message-loop connection))) - + (irc:read-message-loop connection))) \ No newline at end of file
Index: lisppaste2/variable.lisp diff -u lisppaste2/variable.lisp:1.4 lisppaste2/variable.lisp:1.5 --- lisppaste2/variable.lisp:1.4 Tue Nov 11 23:19:38 2003 +++ lisppaste2/variable.lisp Sat Jan 17 12:54:13 2004 @@ -1,4 +1,4 @@ -;;;; $Id: variable.lisp,v 1.4 2003/11/12 04:19:38 bmastenbrook Exp $ +;;;; $Id: variable.lisp,v 1.5 2004/01/17 17:54:13 bmastenbrook Exp $ ;;;; $Source: /project/lisppaste/cvsroot/lisppaste2/variable.lisp,v $
;;;; See the LICENSE file for licensing information. @@ -55,4 +55,4 @@ (defvar *pastes* nil) (defvar *paste-counter* 0) (defvar *connection* nil) -(defvar *channel* "") \ No newline at end of file +(defvar *channels* nil) \ No newline at end of file
Index: lisppaste2/web-server.lisp diff -u lisppaste2/web-server.lisp:1.16 lisppaste2/web-server.lisp:1.17 --- lisppaste2/web-server.lisp:1.16 Wed Nov 12 01:23:43 2003 +++ lisppaste2/web-server.lisp Sat Jan 17 12:54:13 2004 @@ -1,4 +1,4 @@ -;;;; $Id: web-server.lisp,v 1.16 2003/11/12 06:23:43 bmastenbrook Exp $ +;;;; $Id: web-server.lisp,v 1.17 2004/01/17 17:54:13 bmastenbrook Exp $ ;;;; $Source: /project/lisppaste/cvsroot/lisppaste2/web-server.lisp,v $
;;;; See the LICENSE file for licensing information. @@ -13,7 +13,8 @@ (universal-time nil :type integer) (is-annotation nil :type boolean) (annotations nil :type list) - (annotation-counter 0 :type integer)) + (annotation-counter 0 :type integer) + (channel "" :type string))
(defclass new-paste-handler (araneida:handler) ())
@@ -81,11 +82,12 @@ (body (center (h2 "All pastes in system")) ((table :width "100%" :cellpadding 2) - (tr (td) (td "By") (td "When") (td "Titled") (td "Ann.")) + (tr (td) (td "By") (td "Where") (td "When") (td "Titled") (td "Ann.")) ,@(reverse (mapcar #'(lambda (paste) `(tr ((td :nowrap) ((a :href ,(araneida:urlstring (araneida:merge-url *display-paste-url* (prin1-to-string (paste-number paste))))) ,(concatenate 'string "#" (prin1-to-string (paste-number paste))))) ((td :nowrap) ,(encode-for-pre (paste-user paste))) + ((td :nowrap) ,(encode-for-pre (paste-channel paste))) ((td :nowrap) ,(time-delta (paste-universal-time paste) 1)) ((td :width "100%" :bgcolor "#F4F4F4" :nowrap) ,(encode-for-pre (paste-title paste))) ((td :nowrap) ,(length (paste-annotations paste))))) @@ -102,13 +104,18 @@ ((font :color red) (h2 ,message)) ((form :method post :action ,(araneida:urlstring *submit-paste-url*)) (p "Enter a username, title, and paste contents into the fields below. The -paste will be announced on " ,*channel* " @ " ,(irc:server-name *connection*) ".") +paste will be announced on the selected channel @ " ,(irc:server-name *connection*) ".") ,@(if annotate `((p "This paste will be used to annotate " ((a :href ,(araneida:urlstring (araneida:merge-url *display-paste-url* (prin1-to-string (paste-number annotate))))) ,(concatenate 'string (paste-title annotate) "."))) - ((input :type hidden :name "annotate" :value ,(prin1-to-string (paste-number annotate)))))) + ((input :type hidden :name "annotate" :value ,(prin1-to-string (paste-number annotate)))) + ((input :type hidden :name "channel" :value ,(paste-channel annotate))))) (hr) (table + ,@(if (not annotate) + `((tr + (th "Select a channel:") + (td ((select :name "channel") ,@(mapcar #'(lambda (e) `((option :value ,e) ,(encode-for-pre e))) *channels*)))))) (tr (th "Enter your username:") (td ((input :type text :name "username")))) @@ -127,7 +134,8 @@ (let ((username (araneida:body-param "username" (araneida:request-body request))) (title (araneida:body-param "title" (araneida:request-body request))) (text (araneida:body-param "text" (araneida:request-body request))) - (annotate (araneida:body-param "annotate" (araneida:request-body request)))) + (annotate (araneida:body-param "annotate" (araneida:request-body request))) + (channel (araneida:body-param "channel" (araneida:request-body request)))) (araneida:request-send-headers request)
(cond @@ -139,8 +147,9 @@ (new-paste-form request :message "Please enter your paste.")) ((and annotate (not (parse-integer annotate :junk-allowed t))) (new-paste-form request :message "Malformed annotation request.")) + ((not (member channel *channels* :test #'string-equal)) + (new-paste-form request :message "Whatever channel that is, I don't know about it.")) (t - (let* ((paste-number (if annotate (parse-integer annotate :junk-allowed t) (incf *paste-counter*))) (paste-to-annotate (if annotate (find paste-number *pastes* :key #'paste-number))) (annotation-number (if annotate (incf (paste-annotation-counter paste-to-annotate))))) @@ -155,11 +164,12 @@ :user username :title title :contents text - :universal-time (get-universal-time)))) - (irc:privmsg *connection* *channel* + :universal-time (get-universal-time) + :channel channel))) + (irc:privmsg *connection* channel (if annotate - (format nil "~A annotated #~A with ~A at ~A" username paste-number title url) - (format nil "~A pasted ~A at ~A" username title url))) + (format nil "~A annotated #~A with "~A" at ~A" username paste-number title url) + (format nil "~A pasted "~A" at ~A" username title url))) (if annotate (push paste (paste-annotations paste-to-annotate)) (push paste *pastes*)) @@ -169,7 +179,7 @@ (head (title "Paste number " ,*paste-counter*)) (body (h1 "Pasted!") - (p ,(if annotate "Your annotation should be available at " "Your paste should be available at ") ((a :href ,url) ,url) ", and was also sent to " ,*channel* " @ " ,(irc:server-name *connection*)) + (p ,(if annotate "Your annotation should be available at " "Your paste should be available at ") ((a :href ,url) ,url) ", and was also sent to " ,channel " @ " ,(irc:server-name *connection*)) (p "If you wish to paste a correction or addendum to this paste, you can annotate the paste using the submission button on the " ((a :href ,url) "paste's page.")) ,@(bottom-links))))))))))
@@ -196,6 +206,8 @@ ((td :align "left" :width "100%") ,(encode-for-pre (paste-user paste)))) (tr (td) ((td :align "left" :width "100%") ,(time-delta (paste-universal-time paste)))) + (tr (td) + ((td :align "left" :width "100%") ,(encode-for-pre (paste-channel paste)))) (tr ((td :align "left" :valign "top" :nowrap) "Paste contents:") ((td :width "100%"))) (tr (td (p)))