fixed sax:unescaped on the broadcast sink
[cxml/s11.git] / xml / sax-proxy.lisp
blobf2dc50fb50be603eb04f851a218b8e605a4582ed
1 ;;;; sax-proxy.lisp
2 ;;;;
3 ;;;; This file is part of the CXML parser, released under Lisp-LGPL.
4 ;;;; See file COPYING for details.
5 ;;;;
6 ;;;; Copyright (c) 2004 David Lichteblau
7 ;;;; Author: David Lichteblau
9 (in-package :cxml)
11 (defclass broadcast-handler (sax:abstract-handler)
12 ((handlers :initform nil
13 :initarg :handlers
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)
20 ())
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)))
32 #-rune-is-character
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)
38 (let (result)
39 (dolist (next (broadcast-handler-handlers handler))
40 (setf result (,name next ,@args)))
41 result))))
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)))