r8614: add string-elide, new tests
authorKevin M. Rosenberg <kevin@rosenberg.net>
Thu, 5 Feb 2004 16:38:41 +0000 (16:38 +0000)
committerKevin M. Rosenberg <kevin@rosenberg.net>
Thu, 5 Feb 2004 16:38:41 +0000 (16:38 +0000)
package.lisp
strings.lisp
tests.lisp

index 8e2e516e84e1f72f83bb8d81dc60f6189368daf6..79f5b9ea86183c6a556126b41297546300fa19e8 100644 (file)
@@ -66,6 +66,7 @@
    #:string-right-trim-one-char
    #:string-strip-ending
    #:string-maybe-shorten
+   #:string-elide
    #:shrink-vector
    #:collapse-whitespace
    #:string->list
index 8eb08f74e9faa7ac1b243ee78988db6b2a239444..732e8f075b9ac501e94443ae0b0324c778b23781 100644 (file)
@@ -552,11 +552,24 @@ for characters in a string"
        
 
 (defun string-maybe-shorten (str maxlen)
-  (let ((len (length str)))
-    (if (<= len maxlen)
-       str
-      (concatenate 'string (subseq str 0 (- maxlen 3)) "..."))))
+  (string-elide str maxlen :end))
 
+(defun string-elide (str maxlen position)
+  (declare (fixnum maxlen))
+  (let ((len (length str)))
+    (declare (fixnum len))
+    (cond
+     ((<= len maxlen)
+      str)
+     ((<= maxlen 3)
+      "...")
+     ((eq position :middle)
+      (multiple-value-bind (mid remain) (truncate maxlen 2)
+       (let ((end1 (- mid 1))
+             (start2 (- len (- mid 2) remain))) 
+         (concatenate 'string (subseq str 0 end1) "..." (subseq str start2)))))
+     ((or (eq position :end) t)
+      (concatenate 'string (subseq str 0 (- maxlen 3)) "...")))))
 
 (defun shrink-vector (str size)
   #+allegro
index ad50708b5dd6c7b64be0e20150a5e4ba0c7413e2..483fcf164b37008ebccc7f00d9f02daaeefafd5a 100644 (file)
     (ensure-keyword-default-case (read-from-string "type")) :type)
 
 
+(deftest se.1
+    (string-elide "A Test string" 10 :end) "A Test ..." )
+
+(deftest se.2
+    (string-elide "A Test string" 13 :end) "A Test string")
+
+(deftest se.3
+    (string-elide "A Test string" 11 :end) "A Test s..." )
+
+(deftest se.4
+    (string-elide "A Test string" 2 :middle) "...")
+
+(deftest se.5
+    (string-elide "A Test string" 11 :middle) "A Te...ring")
+
+(deftest se.6
+    (string-elide "A Test string" 12 :middle) "A Tes...ring")
+
  ;;; MOP Testing
 
 (eval-when (:compile-toplevel :load-toplevel :execute)