-;;;; Output format classes for print hoes
-
-(defclass dataformat ()
- ((file-start-str :type string :initarg :file-start-str :reader file-start-str)
- (file-end-str :type string :initarg :file-end-str :reader file-end-str)
- (list-start-fmtstr :type string :initarg :list-start-fmtstr :reader list-start-fmtstr)
- (list-start-value-func :type function :initarg :list-start-value-func :reader list-start-value-func)
- (list-start-indent :initarg :list-start-indent :reader list-start-indent)
- (list-end-fmtstr :type string :initarg :list-end-fmtstr :reader list-end-fmtstr)
- (list-end-value-func :type function :initarg :list-end-value-func :reader list-end-value-func)
- (list-end-indent :initarg :list-end-indent :reader list-end-indent)
- (obj-start-fmtstr :type string :initarg :obj-start-fmtstr :reader obj-start-fmtstr)
- (obj-start-value-func :initarg :obj-start-value-func :reader obj-start-value-func)
- (obj-start-indent :initarg :obj-start-indent :reader obj-start-indent)
- (obj-end-fmtstr :type string :initarg :obj-end-fmtstr :reader obj-end-fmtstr)
- (obj-end-value-func :initarg :obj-end-value-func :reader obj-end-value-func)
- (obj-end-indent :initarg :obj-end-indent :reader obj-end-indent)
- (obj-data-indent :initarg :obj-data-indent :reader obj-data-indent)
- (obj-data-fmtstr :initarg :obj-data-fmtstr :reader obj-data-fmtstr)
- (obj-data-fmtstr-labels :initarg :obj-data-fmtstr-labels :reader obj-data-fmtstr-labels)
- (obj-data-end-fmtstr :initarg :obj-data-end-fmtstr :reader obj-data-end-fmtstr)
- (obj-data-value-func :initarg :obj-data-value-func :reader obj-data-value-func)
- (link-ref :initarg :link-ref :reader link-ref))
- (:default-initargs :file-start-str nil :file-end-str nil :list-start-fmtstr nil :list-start-value-func nil
- :list-start-indent nil :list-end-fmtstr nil :list-end-value-func nil :list-end-indent nil
- :obj-start-fmtstr nil :obj-start-value-func nil :obj-start-indent nil
- :obj-end-fmtstr nil :obj-end-value-func nil :obj-end-indent nil
- :obj-data-indent nil :obj-data-fmtstr nil :obj-data-fmtstr-labels nil :obj-data-end-fmtstr nil
- :obj-data-value-func nil :link-ref nil)
- (:documentation "Parent for all dataformat objects"))
-
-(defclass binaryformat (dataformat)
- ())
-
-(defclass nullformat (dataformat)
- ())
-
-(defun text-list-start-value-func (obj nitems)
- (values (ho-title obj) nitems))
-
-(defclass textformat (dataformat)
- ()
- (:default-initargs :list-start-fmtstr "~a~P:~%"
- :list-start-value-func #'text-list-start-value-func
- :list-start-indent t
- :obj-data-indent t
- :obj-data-fmtstr #'ho-fmtstr-text
- :obj-data-fmtstr-labels #'ho-fmtstr-text-labels
- :obj-data-end-fmtstr "~%"
- :obj-data-value-func #'ho-value-func))
-
-
-(defun htmlformat-list-start-value-func (x nitems)
- (values (ho-title x) nitems (ho-name x)))
-
-(defclass htmlformat (textformat)
- ()
- (:default-initargs :file-start-str "<html><body>~%"
- :file-end-str "</body><html>~%"
- :list-start-indent t
- :list-start-fmtstr "<p><b>~a~p:</b></p><div class=\"~A\"><ul>~%"
- :list-start-value-func #'htmlformat-list-start-value-func
- :list-end-fmtstr "</ul></div>~%"
- :list-end-indent t
- :list-end-value-func #'identity
- :obj-start-indent t
- :obj-start-fmtstr "<li>"
- :obj-start-value-func #'identity
- :obj-end-indent t
- :obj-end-fmtstr "</li>~%"
- :obj-end-value-func #'identity
- :obj-data-indent t
- :obj-data-fmtstr #'ho-fmtstr-html-labels
- :obj-data-fmtstr-labels #'ho-fmtstr-html-labels
- :obj-data-value-func #'ho-value-func))
-
-(defclass xhtmlformat (textformat)
- ()
- (:default-initargs :file-start-str "<html><body>~%"
- :file-end-str "</body><html>~%"
- :list-start-indent t
- :list-start-fmtstr "<p><b>~a~p:</b></p><div class=\"~A\"><ul>~%"
- :list-start-value-func #'htmlformat-list-start-value-func
- :list-end-fmtstr "</ul></div>~%"
- :list-end-indent t
- :list-end-value-func #'identity
- :obj-start-indent t
- :obj-start-fmtstr "<li>"
- :obj-start-value-func #'identity
- :obj-end-indent t
- :obj-end-fmtstr "</li>~%"
- :obj-end-value-func #'identity
- :obj-data-indent t
- :obj-data-fmtstr #'ho-fmtstr-html-labels
- :obj-data-fmtstr-labels #'ho-fmtstr-html-labels
- :obj-data-value-func #'ho-xml-value-func))
-
-
-(defun xmlformat-list-end-value-func (x)
- (format nil "~alist" (ho-name x)))
-
-(defun xmlformat-list-start-value-func (x nitems)
- (values (format nil "~alist" (ho-name x)) (ho-title x) nitems))
-
-(defclass xmlformat (textformat)
- ()
- (:default-initargs :file-start-str "" ; (std-xml-header)
- :list-start-indent t
- :list-start-fmtstr "<~a><title>~a~p:</title> ~%"
- :list-start-value-func #'xmlformat-list-start-value-func
- :list-end-indent t
- :list-end-fmtstr "</~a>~%"
- :list-end-value-func #'xmlformat-list-end-value-func
- :obj-start-fmtstr "<~a>"
- :obj-start-value-func #'ho-name
- :obj-start-indent t
- :obj-end-fmtstr "</~a>~%"
- :obj-end-value-func #'ho-name
- :obj-end-indent nil
- :obj-data-indent nil
- :obj-data-fmtstr #'ho-fmtstr-xml
- :obj-data-fmtstr-labels #'ho-fmtstr-xml-labels
- :obj-data-value-func #'ho-xml-value-func))
-
-(defclass link-ref ()
- ((fmtstr :type function :initarg :fmtstr :accessor fmtstr)
- (fmtstr-labels :type function :initarg :fmtstr-labels :accessor fmtstr-labels)
- (page-name :type string :initarg :page-name :accessor page-name)
- (href-head :type string :initarg :href-head :accessor href-head)
- (href-end :type string :initarg :href-end :accessor href-end)
- (ampersand :type string :initarg :ampersand :accessor ampersand))
- (:default-initargs :fmtstr nil
- :fmtstr-labels nil
- :page-name "disp-func1"
- :href-head nil :href-end nil :ampersand nil)
- (:documentation "Formatting for a linked reference"))
-
-(defclass html-link-ref (link-ref)
- ()
- (:default-initargs :fmtstr #'ho-fmtstr-html-ref
- :fmtstr-labels #'ho-fmtstr-html-ref-labels
- :href-head "a href="
- :href-end "a"
- :ampersand "&"))
-
-(defclass xhtml-link-ref (link-ref)
- ()
- (:default-initargs :fmtstr #'ho-fmtstr-html-ref
- :fmtstr-labels #'ho-fmtstr-html-ref-labels
- :href-head "a href="
- :href-end "a"
- :ampersand "&"))
-
-(defclass xml-link-ref (link-ref)
- ()
- (:default-initargs :fmtstr #'ho-fmtstr-xml-ref
- :fmtstr-labels #'ho-fmtstr-xml-ref-labels
- :href-head "xmllink xlink:type=\"simple\" xlink:href="
- :href-end "xmllink"
- :ampersand "&")
- (:documentation "Mozilla's and W3's idea of a link with XML"))
-
-(defclass ie-xml-link-ref (xml-link-ref)
- ()
- (:default-initargs :href-head "html:a href="
- :href-end "html:a" )
- (:documentation "Internet Explorer's idea of a link with XML"))
-
-
-(defclass htmlrefformat (htmlformat)
- ()
- (:default-initargs :link-ref (make-instance 'html-link-ref)))
-
-(defclass xhtmlrefformat (xhtmlformat)
- ()
- (:default-initargs :link-ref (make-instance 'xhtml-link-ref)))
-
-(defclass xmlrefformat (xmlformat)
- ()
- (:default-initargs :link-ref (make-instance 'xml-link-ref)))
-
-(defclass ie-xmlrefformat (xmlformat)
- ()
- (:default-initargs :link-ref (make-instance 'ie-xml-link-ref)))
-
-
-;;; File Start and Ends
-
-(defgeneric fmt-file-start (fmt s))
-(defmethod fmt-file-start ((fmt dataformat) (s stream)))
-
-(defmethod fmt-file-start ((fmt textformat) (s stream))
- (aif (file-start-str fmt)
- (format s it)))
-
-(defgeneric fmt-file-end (fmt s))
-(defmethod fmt-file-end ((fmt textformat) (s stream))
- (aif (file-end-str fmt)
- (format s it)))
-
-;;; List Start and Ends
-
-(defgeneric fmt-list-start (obj fmt s &optional indent num-items))
-(defmethod fmt-list-start (x (fmt textformat) (s stream) &optional (indent 0) (num-items 1))
- (if (list-start-indent fmt)
- (indent-spaces indent s))
- (aif (list-start-fmtstr fmt)
- (apply #'format s it
- (multiple-value-list
- (funcall (list-start-value-func fmt) x num-items)))))
-
-(defgeneric fmt-list-end (obj fmt s &optional indent num-items))
-(defmethod fmt-list-end (x (fmt textformat) (s stream) &optional (indent 0) (num-items 1))
- (declare (ignore num-items))
- (if (list-end-indent fmt)
- (indent-spaces indent s))
- (aif (list-end-fmtstr fmt)
- (apply #'format s it
- (multiple-value-list
- (funcall (list-end-value-func fmt) x)))))
-
-;;; Object Start and Ends
-
-(defgeneric fmt-obj-start (obj fmt s &optional indent))
-(defmethod fmt-obj-start (x (fmt textformat) (s stream) &optional (indent 0))
- (if (obj-start-indent fmt)
- (indent-spaces indent s))
- (aif (obj-start-fmtstr fmt)
- (apply #'format s it
- (multiple-value-list
- (funcall (obj-start-value-func fmt) x)))))
-
-(defgeneric fmt-obj-end (obj fmt s &optional indent))
-(defmethod fmt-obj-end (x (fmt textformat) (s stream) &optional (indent 0))
- (if (obj-end-indent fmt)
- (indent-spaces indent s))
- (aif (obj-end-fmtstr fmt)
- (apply #'format s it
- (multiple-value-list
- (funcall (obj-end-value-func fmt) x)))))
-
-;;; Object Data
-
-(defgeneric make-link-start (obj ref fieldname fieldfunc fieldvalue refvars))
-(defmethod make-link-start (obj (ref link-ref) fieldname fieldfunc fieldvalue refvars)
- (declare (ignore obj fieldname))
- (format nil "~a\"~a?func=~a~akey=~a~a\""
- (href-head ref) (make-url (page-name ref)) fieldfunc
- (ampersand ref) fieldvalue
- (if refvars
- (let ((varstr ""))
- (dolist (var refvars)
- (string-append varstr (format nil "~a~a=~a"
- (ampersand ref) (car var) (cadr var))))
- varstr)
- "")))
-
-(defgeneric make-link-end (obj ref fieldname))
-(defmethod make-link-end (obj (ref link-ref) fieldname)
- (declare (ignore obj fieldname))
- (format nil "~a" (href-end ref))
- )
-
-(defgeneric fmt-obj-data (obj fmt s &optional indent label refvars))
-(defmethod fmt-obj-data (x (fmt textformat) s
- &optional (indent 0) (label nil) (refvars nil))
- (if (obj-data-indent fmt)
- (indent-spaces indent s))
- (if (link-ref fmt)
- (fmt-obj-data-with-ref x fmt s label refvars)
- (fmt-obj-data-plain x fmt s label))
- (aif (obj-data-end-fmtstr fmt)
- (format s it)))
-
-(defgeneric fmt-obj-data-plain (obj fmt s label))
-(defmethod fmt-obj-data-plain (x (fmt textformat) s label)
- (if label
- (apply #'format s
- (funcall (obj-data-fmtstr-labels fmt) x)
- (multiple-value-list
- (funcall (funcall (obj-data-value-func fmt) x) x)))
- (apply #'format s (funcall (obj-data-fmtstr fmt) x)
- (multiple-value-list
- (funcall (funcall (obj-data-value-func fmt) x) x)))))
-
-(defgeneric fmt-obj-data-with-ref (obj fmt s label refvars))
-(defmethod fmt-obj-data-with-ref (x (fmt textformat) s label refvars)
- (let ((refstr (make-ref-data-str x fmt label))
- (refvalues nil)
- (field-values
- (multiple-value-list
- (funcall (funcall (obj-data-value-func fmt) x) x))))