anchor.diff:      (call-next-method))
     (values))
   
  +(defmethod html :around ((string string))
  +  (when (serapeum:string^= " " string)
  +    (cancel-space))
  +  (call-next-method)
  +  (values))
  +
   (defmethod html ((string string))
     (if *print-pretty*
         (fill-text (escape-string string) t)
         (escape-to-stream string #'escape-string-char *html*)))
  +
  +(defmethod html :around ((string escaped-string))
  +  (let ((string (escaped-string-value string)))
  +    (when (serapeum:string^= " " string)
  +      (cancel-space)))
  +  (call-next-method)
  +  (values))
  +
  +(defmethod html ((string escaped-string))
  +  (let ((string (escaped-string-value string)))
  +    (if *print-pretty*
  +        (fill-text string t)
  +        (write-string string *html*))))
   
   (defmethod html ((char character))
     (if-let (escape (escape-string-char char))
  
positive.code:     (setf *pending-space* nil)
      (write-char #\Space *html*)))
  
  (defmacro catch-output (arg &environment env)
    (labels ((print-escaped (x)
               `(fill-text ,(escape-string x) t))
             (punt (&optional (x arg))
               `(html ,x))
             (rec (arg)
               (typecase arg
                 (null nil)
                 (string (print-escaped arg))
                 ((or character number
                      ;; not symbol, because not evaluated.
                      keyword (member t nil))
  
negative.code:     (values))
    (:documentation "Handle writing OBJECT as HTML (for side-effects only)."))
  
  (serapeum:defconstructor escaped-string
    (value string))
  
  (define-compiler-macro html (object)
    `(locally (declare (notinline html))
       ,(if (typep object '(or string character number null keyword escaped-string))
            `(html ,object)
            (with-unique-names (temp)
              `(let ((,temp ,object))
                 (and ,temp (html ,temp)))))))
  
  (defmethod html :around (object)
    (declare (ignore object))
  