+ <li>New class <tt>broadcast-handler</tt> as a generalization

+      of the older <tt>sax-proxy</tt>.</li>

+      <li>New class <tt>tapping-source</tt>, a klacks source that
+      relays events from an upstream klacks source unchanged, while also
+      emitting them as SAX events to a user-specified handler at the
+      same time.</li>

+      Fixed serialize-event to generate
+      start-prefix-mapping and end-prefix-mapping events.  New function
+      map-current-namespace-declarations.</li>
This commit is contained in:
dlichteblau
2007-04-22 13:23:54 +00:00
parent c43b58dd3e
commit b8ba07a919
11 changed files with 264 additions and 37 deletions

View File

@ -39,12 +39,17 @@
;;;(defgeneric klacks:current-qname (source))
;;;(defgeneric klacks:current-characters (source))
(defgeneric klacks:current-cdata-section-p (source))
(defgeneric klacks:map-current-namespace-declarations (fn source))
(defgeneric klacks:map-previous-namespace-declarations (fn source))
(defgeneric klacks:current-line-number (source))
(defgeneric klacks:current-column-number (source))
(defgeneric klacks:current-system-id (source))
(defgeneric klacks:current-xml-base (source))
(defgeneric klacks:find-namespace-binding (prefix source))
(defgeneric klacks:decode-qname (qname source))
(defmacro klacks:with-open-source ((var source) &body body)
`(let ((,var ,source))
(unwind-protect
@ -74,12 +79,14 @@
(check-type key (member :characters))
characters))
(defun klacks:serialize-event (source handler)
(defun klacks:serialize-event (source handler &key (consume t))
(multiple-value-bind (key a b c) (klacks:peek source)
(let ((result nil))
(case key
(:start-document
(sax:start-document handler))
(sax:start-document handler)
(loop for (prefix . uri) in *initial-namespace-bindings* do
(sax:start-prefix-mapping handler prefix uri)))
(:characters
(cond
((klacks:current-cdata-section-p source)
@ -108,16 +115,28 @@
(slot-value source 'dom-impl-entity-resolver))
(sax::dtd handler (slot-value source 'dom-impl-dtd)))
(:start-element
(klacks:map-current-namespace-declarations
(lambda (prefix uri)
(sax:start-prefix-mapping handler prefix uri))
source)
(sax:start-element handler a b c (klacks:list-attributes source)))
(:end-element
(sax:end-element handler a b c))
(sax:end-element handler a b c)
(klacks:map-current-namespace-declarations
(lambda (prefix uri)
(declare (ignore uri))
(sax:end-prefix-mapping handler prefix))
source))
(:end-document
(loop for (prefix . nil) in *initial-namespace-bindings* do
(sax:end-prefix-mapping handler prefix))
(setf result (sax:end-document handler)))
((nil)
(error "serialize-event read past end of document"))
(t
(error "unexpected klacks key: ~A" key)))
(klacks:consume source)
(when consume
(klacks:consume source))
result)))
(defun serialize-declaration-kludge (list handler)