+(defun write-ho-value (obj name type formatter cdata strm)
+ (declare (ignorable type))
+ (let* ((slot-data (slot-value obj name))
+ (fmt-data (if formatter
+ (funcall formatter slot-data)
+ slot-data))
+ (data (if cdata
+ (kmrcl:xml-cdata fmt-data)
+ fmt-data)))
+ (typecase data
+ (string
+ (write-string data strm))
+ (number
+ (write-string (write-to-string data) strm))
+ (t
+ (format strm "~A" data)))))
+
+(defun ppfc-html (title name type formatter cdata print-func)
+ (vector-push-extend '(write-string "<span class=\"" s) print-func)
+ (vector-push-extend `(write-string ,title s) print-func)
+ (vector-push-extend '(write-string "\">" s) print-func)
+ (vector-push-extend `(write-ho-value x ',name ',type ',formatter ,cdata s) print-func)
+ (vector-push-extend '(write-string "</span>" s) print-func))
+
+(defun ppfc-xml (tag name type formatter cdata print-func)
+ (vector-push-extend '(write-char #\< s) print-func)
+ (vector-push-extend `(write-string ,tag s) print-func)
+ (vector-push-extend '(write-char #\> s) print-func)
+ (vector-push-extend `(write-ho-value x ',name ',type ',formatter ,cdata s) print-func)
+ (vector-push-extend '(write-string "</" s) print-func)
+ (vector-push-extend `(write-string ,tag s) print-func)
+ (vector-push-extend '(write-char #\> s) print-func))
+
+(defun ppfc-html-labels (label name type formatter cdata print-func)
+ (vector-push-extend '(write-string "<span class=\"label\">" s) print-func)
+ (vector-push-extend `(write-string ,label s) print-func)
+ (vector-push-extend '(write-string "</span> " s) print-func)
+ (ppfc-html label name type formatter cdata print-func))
+
+(defun ppfc-xhtml-labels (label tag name type formatter cdata print-func)
+ (vector-push-extend '(write-string "<span class=\"label\">" s) print-func)
+ (vector-push-extend `(write-string ,label s) print-func)
+ (vector-push-extend '(write-string "</span> " s) print-func)
+ (ppfc-html tag name type formatter cdata print-func))
+
+(defun ppfc-xml-labels (label tag name type formatter cdata print-func)
+ (vector-push-extend '(write-string "<label>" s) print-func)
+ (vector-push-extend `(write-string ,label s) print-func)
+ (vector-push-extend '(write-string "</label> " s) print-func)
+ (ppfc-xml tag name type formatter cdata print-func))
+
+(defun ppfc-html-link (name type formatter cdata nlink print-func)
+ (declare (fixnum nlink))
+ (vector-push-extend '(write-char #\< s) print-func)
+ (vector-push-extend `(write-string (nth ,(+ nlink nlink) links) s) print-func)
+ (vector-push-extend '(write-char #\> s) print-func)
+ (vector-push-extend `(write-ho-value x ',name ',type ',formatter ,cdata s) print-func)
+ (vector-push-extend '(write-string "</" s) print-func)
+ (vector-push-extend `(write-string (nth ,(+ nlink nlink 1) links) s) print-func)
+ (vector-push-extend '(write-char #\> s) print-func))
+
+(defun ppfc-html-link-labels (label name type formatter cdata nlink print-func)
+ (vector-push-extend '(write-string "<label>" s) print-func)
+ (vector-push-extend `(write-string ,label s) print-func)
+ (vector-push-extend '(write-string "</label> " s) print-func)
+ (ppfc-html-link name type formatter cdata nlink print-func))
+
+(defun push-print-fun-code (category slot nlink print-func)
+ (let* ((formatter (esd-print-formatter slot))
+ (name (slot-definition-name slot))
+ (namestr-lower (string-downcase (symbol-name name)))
+ (xml-namestr (escape-xml-string namestr-lower))
+ (xml-tag (escape-xml-string namestr-lower))
+ (type (slot-value slot 'type))
+ (cdata (not (null
+ (and (in category :xml :xhtml :xml-link :xhtml-link
+ :xml-labels :ie-xml-labels
+ :xhtml-link-labels :xml-link-labels :ie-xml-link
+ :ie-xml-link-labels)
+ (or formatter
+ (lisp-type-is-a-string type))))))
+ (hyperlink (esd-hyperlink slot)))
+
+ (case category
+ (:compact-text
+ (vector-push-extend
+ `(write-ho-value x ',name ',type ',formatter ,cdata s) print-func))
+ (:compact-text-labels
+ (vector-push-extend `(write-string ,namestr-lower s) print-func)
+ (vector-push-extend '(write-char #\space s) print-func)
+ (vector-push-extend
+ `(write-ho-value x ',name ',type ',formatter ,cdata s) print-func))
+ ((or :html :xhtml)
+ (ppfc-html namestr-lower name type formatter cdata print-func))
+ (:xml
+ (ppfc-xml xml-tag name type formatter cdata print-func))
+ (:html-labels
+ (ppfc-html-labels namestr-lower name type formatter cdata print-func))
+ (:xhtml-labels
+ (ppfc-xhtml-labels xml-namestr namestr-lower name type formatter cdata print-func))
+ (:xml-labels
+ (ppfc-xml-labels xml-namestr xml-tag name type formatter cdata print-func))
+ ((or :html-link :xhtml-link)
+ (if hyperlink
+ (ppfc-html-link name type formatter cdata nlink print-func)
+ (ppfc-html namestr-lower name type formatter cdata print-func)))
+ ((or :xml-link :ie-xml-link)
+ (if hyperlink
+ (ppfc-html-link name type formatter cdata nlink print-func)
+ (ppfc-xml xml-tag name type formatter cdata print-func)))
+ (:html-link-labels
+ (if hyperlink
+ (ppfc-html-labels namestr-lower name type formatter cdata print-func)))
+ (:xhtml-link-labels
+ (if hyperlink
+ (ppfc-html-link-labels xml-namestr name type formatter cdata nlink
+ print-func)
+ (ppfc-xhtml-labels xml-tag namestr-lower name type formatter cdata
+ print-func)))
+ ((or :xml-link-labels :ie-xml-link-labels)
+ (if hyperlink
+ (ppfc-html-link-labels xml-namestr name type formatter cdata nlink
+ print-func)
+ (ppfc-xml-labels xml-tag namestr-lower name type formatter cdata
+ print-func))))))
+
+
+(defun view-has-links-p (view)
+ (in (category view) :html-link :xhtml-link :xml-link :ie-xml-link
+ :html-link-labels :xhtml-links-labels :xml-link-labels
+ :ie-xml-link-labels))
+
+(defun initialize-view-by-category (obj-cl view)
+ "Initialize a view based upon a preset category"
+ (unless (in (category view) :compact-text :compact-text-labels
+ :html :html-labels :html-link-labels
+ :xhtml :xhtml-labels :xhtml-link-labels
+ :xml :xml-labels :xml-link :ie-xml-link
+ :xml-link-labels :ie-xml-link-labels)
+ (error "Unknown view category ~A" (category view)))
+
+ (unless (slots view) (setf (slots view) (default-print-slots obj-cl)))
+
+ (let ((links '())
+ (print-func (make-array 10 :fill-pointer 0 :adjustable t)))
+
+ (do* ((slots (slots view) (cdr slots))
+ (slot-name (car slots) (car slots))
+ (slot (find-slot-by-name obj-cl slot-name)
+ (find-slot-by-name obj-cl slot-name)))
+ ((null slots))
+ (unless slot
+ (error "Slot ~A is not found in class ~S" slot-name obj-cl))
+
+ (push-print-fun-code (category view) slot (length links) print-func)
+ (when (> (length slots) 1)
+ (vector-push-extend '(write-char #\space s) print-func))
+
+ (when (and (view-has-links-p view) (esd-hyperlink slot))
+ (push (slot-definition-name slot) links)))
+
+ (setf (obj-data-print-code view) `(lambda (x s links)
+ (declare (ignorable links))
+ ,@(map 'list #'identity print-func)))
+
+ (setf (obj-data-func view)
+ (when print-func (compile nil (eval (obj-data-print-code view)))))
+
+ (setf (link-slots view) (nreverse links)))
+
+ (finalize-view-by-category view)
+ view)
+
+(defun finalize-view-by-category (view)
+ (case (category view)
+ ((or :compact-text :compact-text-labels)
+ (initialize-text-view view))
+ ((or :html :xhtml :html-labels :xhtml-labels)
+ (initialize-html-view view))
+ ((or :xml :xml-labels)
+ (initialize-xml-view view))
+ ((or :html-link :html-link-labels)
+ (initialize-html-view view)
+ (setf (link-href-start view) "a href=")
+ (setf (link-href-end view) "a")
+ (setf (link-ampersand view) "&"))
+ ((or :xhtml-link :xhtml-link-labels)
+ (initialize-html-view view)
+ (setf (link-href-start view) "a href=")
+ (setf (link-href-end view) "a")
+ (setf (link-ampersand view) "&"))
+ ((or :xml-link :xml-link-labels)
+ (initialize-xml-view view)
+ (setf (link-href-start view)
+ "xmllink xlink:type=\"simple\" xlink:href=")
+ (setf (link-href-end view) "xmllink")
+ (setf (link-ampersand view) "&"))
+ ((or :ie-xml-link :ie-xml-link-labels)
+ (initialize-xml-view view)
+ (setf (link-href-start view) "html:a href=")
+ (setf (link-href-end view) "html:a")
+ (setf (link-ampersand view) "&"))))
+
+#+ignore