(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
(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)