[Lisppaste-cvs] CVS update: lisppaste2/encode-for-pre.lisp
Brian Mastenbrook
bmastenbrook at common-lisp.net
Fri May 21 22:11:09 UTC 2004
Update of /project/lisppaste/cvsroot/lisppaste2
In directory common-lisp.net:/home/bmastenbrook/lisppaste2
Modified Files:
encode-for-pre.lisp
Log Message:
Thanks much to Xach for a rewrite
Date: Fri May 21 18:11:09 2004
Author: bmastenbrook
Index: lisppaste2/encode-for-pre.lisp
diff -u lisppaste2/encode-for-pre.lisp:1.13 lisppaste2/encode-for-pre.lisp:1.14
--- lisppaste2/encode-for-pre.lisp:1.13 Wed Mar 31 16:33:07 2004
+++ lisppaste2/encode-for-pre.lisp Fri May 21 18:11:09 2004
@@ -1,53 +1,70 @@
-;;;; $Id: encode-for-pre.lisp,v 1.13 2004/03/31 21:33:07 bmastenbrook Exp $
+;;;; $Id: encode-for-pre.lisp,v 1.14 2004/05/21 22:11:09 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 &optional only-in-dup)
- (let* ((new-length (loop for i from 0 to (1- (length str))
- summing (if (not only-in-dup)
- (if (char= (elt str i) char)
- (length repstr) 1)
- (if (> i 0)
- (if (and (member (elt str (1- i)) only-in-dup :test #'char=)
- (char= (elt str 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 (if only-in-dup
- (and (> i 0) (char= (elt str i) char)
- (member (elt str (1- i))
- only-in-dup :test #'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)))
- (incf j (length repstr)))
- (progn
- (setf (elt new-array j) (elt str i))
- (incf j))))
- new-array))
-
-(defun replace-in-string (str chars repstrs)
- (declare (type string str))
- (let ((stri str))
- (loop for char in chars for repstr in repstrs do
- (setf stri (replace-in-string-1 stri char repstr)))
- stri))
-
-(defun encode-for-pre (str)
- (replace-in-string str '(#\& #\< #\>) '("&" "<" ">")))
-
-(defun replace-first-space (str)
- (if (char= (elt str 0) #\space)
- (concatenate 'string " " (subseq str 1))
- str))
-
-(defun encode-for-tt (str)
- (replace-first-space (replace-in-string-1 (replace-in-string str '(#\& #\< #\> #\newline #\return #\linefeed #\tab) '("&" "<" ">" "<br>" "" "" " ")) #\space " " '(#\space #\>))))
-
-(defun encode-for-http (str)
- (replace-in-string-1 str #\> (format nil ">~%") nil))
+(defun encode-for-tt (string)
+ (let ((pos 0) (end (length string))
+ (char nil))
+ (flet ((next-char ()
+ (setf char (when (> end pos)
+ (prog1
+ (schar string pos)
+ (incf pos))))))
+ (with-output-to-string (out)
+ (block nil
+ (tagbody
+ escape-spaces
+ (next-char)
+ (when (eql char #\Space)
+ (write-string " " out)
+ (go escape-spaces))
+ process-char
+ (case char
+ ((nil) (return))
+ ((#\Newline)
+ (write-string "<br>" out)
+ (go escape-spaces))
+ ((#\&)
+ (write-string "&" out))
+ ((#\<)
+ (write-string "<" out))
+ ((#\>)
+ (write-string ">" out))
+ ((#\Tab)
+ (write-string " " out))
+ ((#\Space)
+ (write-char #\Space out)
+ (go escape-spaces))
+ ((#\Linefeed #\Return))
+ (t
+ (write-char char out)))
+ (next-char)
+ (go process-char)))))))
+
+
+(defun encode-for-pre (string)
+ (declare (simple-string string))
+ (let ((output (make-array (truncate (length string) 2/3)
+ :element-type 'character
+ :adjustable t
+ :fill-pointer 0)))
+ (with-output-to-string (out output)
+ (loop for char across string
+ do (case char
+ ((#\&) (write-string "&" out))
+ ((#\<) (write-string "<" out))
+ ((#\>) (write-string ">" out))
+ (t (write-char char out)))))
+ (coerce output 'simple-string)))
+
+
+(defun encode-for-http (string)
+ (declare (simple-string string))
+ (with-output-to-string (out)
+ (loop for char across string
+ do (write-char char out)
+ when (char= char #\>)
+ do (write-char #\Newline out))))
More information about the Lisppaste-cvs
mailing list