From: Kevin M. Rosenberg Date: Thu, 5 Feb 2004 16:38:41 +0000 (+0000) Subject: r8614: add string-elide, new tests X-Git-Tag: v1.96~86 X-Git-Url: http://git.kpe.io/?p=kmrcl.git;a=commitdiff_plain;h=ab5f800e2939665c968b9e97519d99bddb39251d r8614: add string-elide, new tests --- diff --git a/package.lisp b/package.lisp index 8e2e516..79f5b9e 100644 --- a/package.lisp +++ b/package.lisp @@ -66,6 +66,7 @@ #:string-right-trim-one-char #:string-strip-ending #:string-maybe-shorten + #:string-elide #:shrink-vector #:collapse-whitespace #:string->list diff --git a/strings.lisp b/strings.lisp index 8eb08f7..732e8f0 100644 --- a/strings.lisp +++ b/strings.lisp @@ -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 diff --git a/tests.lisp b/tests.lisp index ad50708..483fcf1 100644 --- a/tests.lisp +++ b/tests.lisp @@ -345,6 +345,24 @@ (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)