3 ;;;; This file is part of the CXML parser, released under Lisp-LGPL.
4 ;;;; See file COPYING for details.
6 ;;;; Copyright (c) 2004 David Lichteblau
7 ;;;; Author: David Lichteblau
11 (defclass broadcast-handler
(sax:abstract-handler
)
12 ((handlers :initform nil
14 :accessor broadcast-handler-handlers
)))
16 (defun make-broadcast-handler (&rest handlers
)
17 (make-instance 'broadcast-handler
:handlers handlers
))
19 (defclass sax-proxy
(broadcast-handler)
22 (defmethod initialize-instance
23 :after
((instance sax-proxy
) &key chained-handler
)
24 (setf (proxy-chained-handler instance
) chained-handler
))
26 (defmethod proxy-chained-handler ((instance sax-proxy
))
27 (car (broadcast-handler-handlers instance
)))
29 (defmethod (setf proxy-chained-handler
) (newval (instance sax-proxy
))
30 (setf (broadcast-handler-handlers instance
) (list newval
)))
33 (defmethod hax:%want-strings-p
((handler broadcast-handler
))
34 (hax:%want-strings-p
(car (broadcast-handler-handlers instance
))))
36 (macrolet ((define-proxy-method (name (&rest args
))
37 `(defmethod ,name
((handler broadcast-handler
) ,@args
)
39 (dolist (next (broadcast-handler-handlers handler
))
40 (setf result
(,name next
,@args
)))
42 (define-proxy-method sax
:start-document
())
43 (define-proxy-method sax
:start-element
(uri lname qname attributes
))
44 (define-proxy-method sax
:start-prefix-mapping
(prefix uri
))
45 (define-proxy-method sax
:characters
(data))
46 (define-proxy-method sax
:unescaped
(data))
47 (define-proxy-method sax
:processing-instruction
(target data
))
48 (define-proxy-method sax
:end-prefix-mapping
(prefix))
49 (define-proxy-method sax
:end-element
(namespace-uri local-name qname
))
50 (define-proxy-method sax
:end-document
())
51 (define-proxy-method sax
:comment
(data))
52 (define-proxy-method sax
:start-cdata
())
53 (define-proxy-method sax
:end-cdata
())
54 (define-proxy-method sax
:start-dtd
(name public-id system-id
))
55 (define-proxy-method sax
:end-dtd
())
56 (define-proxy-method sax
:start-internal-subset
())
57 (define-proxy-method sax
:end-internal-subset
())
58 (define-proxy-method sax
:unparsed-entity-declaration
(name pub sys not
))
59 (define-proxy-method sax
:external-entity-declaration
(kind name pub sys
))
60 (define-proxy-method sax
:internal-entity-declaration
(kind name value
))
61 (define-proxy-method sax
:notation-declaration
(name public-id system-id
))
62 (define-proxy-method sax
:element-declaration
(name model
))
63 (define-proxy-method sax
:attribute-declaration
(elt attr type default
))
64 (define-proxy-method sax
:entity-resolver
(resolver))
65 (define-proxy-method sax
::dtd
(dtd)))
67 (defmethod sax:register-sax-parser
:after
((handler broadcast-handler
) parser
)
68 (dolist (next (broadcast-handler-handlers handler
))
69 (sax:register-sax-parser next parser
)))