[claw-cvs] r24 - trunk/main/claw-core/src

achiumenti at common-lisp.net achiumenti at common-lisp.net
Mon Mar 31 04:48:37 UTC 2008


Author: achiumenti
Date: Sun Mar 30 23:48:36 2008
New Revision: 24

Modified:
   trunk/main/claw-core/src/validators.lisp
Log:
beginning of local-time integration

Modified: trunk/main/claw-core/src/validators.lisp
==============================================================================
--- trunk/main/claw-core/src/validators.lisp	(original)
+++ trunk/main/claw-core/src/validators.lisp	Sun Mar 30 23:48:36 2008
@@ -30,10 +30,10 @@
 (in-package :claw)
 
 (defgeneric translator-encode (translator wcomponent)
-  (:documentation "Encodes the input component value, used when rendering the component"))
+  (:documentation "Encodes the input component value, used when rendering the component (Encodes from type to string)."))
 
 (defgeneric translator-decode (translator wcomponent)
-  (:documentation "Decodes the input component value after a form submit."))
+  (:documentation "Decodes the input component value after a form submit (Decodes from string to type)."))
 
 (defclass translator () 
   ()
@@ -63,6 +63,11 @@
   "*SIMPLE-TRANSLATOR* is the default translator for any CINPUT component. 
 Its encoder and decoder methods pass values unchanged")
 
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;;;;;;;;;;;;;;; Integer translator ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
 (defclass translator-integer (translator) 
   ((thousand-separator :initarg :thousand-separator
 	 :reader translator-thousand-separator
@@ -115,7 +120,9 @@
 	  (parse-integer (regex-replace-all (format nil "~a" thousand-separator) new-value ""))
 	  (parse-integer new-value)))))
 
-;;=========================================
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;;;;;;;;;;;;;;;Folating point number translator ;;;;;;;;;;;;;;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 (defclass translator-number (translator-integer) 
   ((decimals-separator :initarg :decimals-separator
@@ -197,7 +204,83 @@
 	    (coerce result type))))))
 
 
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;;;;;;;;;;;;;;; Dates translator ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+
+(defclass translator-date (translator) 
+  ((date-format :initarg :date-format
+		:reader translator-date-fromat
+		:documentation "Sets the format of a date using a list where element are joined together and :DATE :MONTH and :YEAR are
+expanded into day of the month for :DATE, month number for :MONTH and the year for :YEAR. The Default is the list '(:month \"/\" :date \"/\" :year)"))   
+  (:default-initargs :date-format '(:month "/" :date "/" :year))
+  (:documentation "A translator object encodes and decodes local-date object value passed to a html input component"))
+
+
+#|
+(defmethod translator-encode ((translator translator-number) (wcomponent wcomponent))
+  (let* ((page (htcomponent-page wcomponent))
+	 (visit-object (wcomponent-parameter-value wcomponent :visit-object))
+	 (accessor (wcomponent-parameter-value wcomponent :accessor))
+	 (reader (wcomponent-parameter-value wcomponent :reader))
+	 (thousand-separator (translator-thousand-separator translator))
+	 (grouping-size (translator-grouping-size translator))
+	 (decimal-digits (translator-decimal-digits translator))
+	 (decimals-separator (translator-decimals-separator translator))
+	 (signum-directive (if (translator-always-show-signum translator)
+			       "@"
+			       ""))
+	 (integer-control-string (if thousand-separator			   
+			     (format nil "~~~d,' ,v:~aD"  grouping-size signum-directive)
+			     (format nil "~~~ad"  signum-directive)))
+	 
+	 (value (page-req-parameter page (htcomponent-client-id wcomponent) nil)))    
+    (if (component-validation-errors wcomponent)
+	value
+	(progn 
+	  (when (null visit-object)
+	    (setf visit-object (htcomponent-page wcomponent)))
+	  (multiple-value-bind (int-value dec-value)
+	      (floor (cond
+		       ((and (null reader) accessor) (funcall (fdefinition accessor) visit-object))
+		       (t (funcall (fdefinition reader) visit-object))))
+	    (progn 	      
+	      (setf dec-value (coerce dec-value 'float))
+	    (format nil "~a~a" (if thousand-separator
+				 (string-trim " " (format nil integer-control-string thousand-separator int-value))
+				 (format nil integer-control-string int-value))		    
+		    (cond 
+		      ((and (= 0.0 (coerce dec-value 'double-float)) decimal-digits)
+		       (format nil "~a~a" decimals-separator (make-string decimal-digits :initial-element #\0)))
+		      (decimal-digits 
+		       (let ((frac-part (subseq (format nil "~f" dec-value) 2)))
+			 (if (> (length frac-part) decimal-digits)
+			     (setf frac-part (subseq frac-part 0 decimal-digits))
+			     (setf frac-part (concatenate 'string frac-part (make-string (- decimal-digits (length frac-part)) :initial-element #\0))))
+			 (format nil "~a~a" decimals-separator frac-part)))
+		      (t (format nil "~a~a" decimals-separator (subseq (format nil "~f" dec-value) 2)))))))))))
+
 
+(defmethod translator-decode ((translator translator-number) (wcomponent wcomponent))
+  (let* ((thousand-separator (translator-thousand-separator translator))
+	 (type (translator-coerce translator)) 
+	 (int-value)
+	 (dec-value))
+    (multiple-value-bind (client-id new-value)	
+	(component-id-and-value wcomponent)
+      (declare (ignore client-id))
+      (when thousand-separator
+	(setf new-value (regex-replace-all (format nil "~a" thousand-separator) new-value "")))
+      (let ((decomposed-string (all-matches-as-strings "[0-9]+" new-value))
+	    (result))
+	(setf int-value (parse-integer (concatenate 'string (first decomposed-string) (second decomposed-string)))
+	      dec-value (expt 10 (length (second decomposed-string)))
+	      result (/ int-value dec-value))
+	(if (integerp result)
+	    result
+	    (coerce result type))))))
+|#
 ;;----------------------------------------------------------------------------------------
 (defun add-exception (id reason) 
 "Adds an exception for the given input component identified by its ID with the message expressed by REASON"



More information about the Claw-cvs mailing list