Files
CXML/xml/sax-proxy.lisp
dlichteblau 3373d65a55 SAX overhaul for HAX integration.
* dom/dom-builder.lisp (DOM-BUILDER): Inherit from
	sax:content-handler.

	* klacks/klacks-impl.lisp (KLACKS-DTD-HANDLER): Inherit from
	sax:default-handler.

	* klacks/klacks.lisp (KLACKS:SERIALIZE-EVENT): Bugfix -- call
	start-cdata and end-cdata on the handler, not the source.

	* xml/package.lisp: New export WITH-OUTPUT-SINK.

	* xml/sax-handler.lisp (SAX): New exports abstract-handler,
	content-handler, default-handler.  (STANDARD-ATTRIBUTE): Renamed
	from attribute.  (ATTRIBUTE-NAMESPACE-URI, ATTRIBUTE-LOCAL-NAME,
	ATTRIBUTE-QNAME, ATTRIBUTE-VALUE, ATTRIBUTE-SPECIFIED-P): Wrapper
	methods for standard-attribute.  Wrapper methods for
	hax:standard-attribute.  (all events): pulled into a common
	define-event form.  New dummy method on null.  Added a warning to
	the default method.   New error method on abstract-handler.  New
	dummy method on the respective default handler classes.

	* xml/sax-proxy.lisp (BROADCAST-HANDLER): Inherit from
	abstract-handler, not sax-parser-mixin.

	* xml/unparse.lisp (sink): Inherit from sax:content-handler.
	(WITH-OUTPUT-SINK): New macro.  (INVOKE-WITH-OUTPUT-SINK): New
	function.
2007-10-14 17:50:11 +00:00

65 lines
2.6 KiB
Common Lisp

;;;; sax-proxy.lisp
;;;;
;;;; This file is part of the CXML parser, released under Lisp-LGPL.
;;;; See file COPYING for details.
;;;;
;;;; Copyright (c) 2004 David Lichteblau
;;;; Author: David Lichteblau
(in-package :cxml)
(defclass broadcast-handler (sax:abstract-handler)
((handlers :initform nil
:initarg :handlers
:accessor broadcast-handler-handlers)))
(defun make-broadcast-handler (&rest handlers)
(make-instance 'broadcast-handler :handlers handlers))
(defclass sax-proxy (broadcast-handler)
())
(defmethod initialize-instance
:after ((instance sax-proxy) &key chained-handler)
(setf (proxy-chained-handler instance) chained-handler))
(defmethod proxy-chained-handler ((instance sax-proxy))
(car (broadcast-handler-handlers instance)))
(defmethod (setf proxy-chained-handler) (newval (instance sax-proxy))
(setf (broadcast-handler-handlers instance) (list newval)))
(macrolet ((define-proxy-method (name (&rest args))
`(defmethod ,name ((handler broadcast-handler) ,@args)
(let (result)
(dolist (next (broadcast-handler-handlers handler))
(setf result (,name next ,@args)))
result))))
(define-proxy-method sax:start-document ())
(define-proxy-method sax:start-element (uri lname qname attributes))
(define-proxy-method sax:start-prefix-mapping (prefix uri))
(define-proxy-method sax:characters (data))
(define-proxy-method sax:processing-instruction (target data))
(define-proxy-method sax:end-prefix-mapping (prefix))
(define-proxy-method sax:end-element (namespace-uri local-name qname))
(define-proxy-method sax:end-document ())
(define-proxy-method sax:comment (data))
(define-proxy-method sax:start-cdata ())
(define-proxy-method sax:end-cdata ())
(define-proxy-method sax:start-dtd (name public-id system-id))
(define-proxy-method sax:end-dtd ())
(define-proxy-method sax:start-internal-subset ())
(define-proxy-method sax:end-internal-subset ())
(define-proxy-method sax:unparsed-entity-declaration (name pub sys not))
(define-proxy-method sax:external-entity-declaration (kind name pub sys))
(define-proxy-method sax:internal-entity-declaration (kind name value))
(define-proxy-method sax:notation-declaration (name public-id system-id))
(define-proxy-method sax:element-declaration (name model))
(define-proxy-method sax:attribute-declaration (elt attr type default))
(define-proxy-method sax:entity-resolver (resolver))
(define-proxy-method sax::dtd (dtd)))
(defmethod sax:register-sax-parser :after ((handler broadcast-handler) parser)
(dolist (next (broadcast-handler-handlers handler))
(sax:register-sax-parser next parser)))