Skip to content

Commit

Permalink
Some minor renaming in the new event generation code for emitting ele…
Browse files Browse the repository at this point in the history
…ments
  • Loading branch information
senior committed Jun 26, 2012
1 parent 6f52675 commit bc00307
Showing 1 changed file with 43 additions and 32 deletions.
75 changes: 43 additions & 32 deletions src/main/clojure/clojure/data/xml.clj
Expand Up @@ -49,53 +49,64 @@
:cdata (.writeCData writer (:str event)) :cdata (.writeCData writer (:str event))
:comment (.writeComment writer (:str event)))) :comment (.writeComment writer (:str event))))


(defprotocol Flatten (defprotocol EventGeneration
(gen-event [e]) "Protocol for generating new events based on element type"
(next-events [e next])) (gen-event [item]

"Function to generate an event for e.")
(extend-protocol Flatten (next-events [item next-items]
"Returns the next set of events that should occur after e. next-events are the
events that should be generated after this one is complete."))

(extend-protocol EventGeneration
Element Element
(gen-event [e] (gen-event [element]
(Event. :start-element (:tag e) (:attrs e) nil)) (Event. :start-element (:tag element) (:attrs element) nil))
(next-events [e next] (next-events [element next-items]
(cons (:content e) (cons (:content element)
(cons (Event. :end-element (:tag e) nil nil) next))) (cons (Event. :end-element (:tag element) nil nil) next-items)))
Event Event
(gen-event [e] e) (gen-event [event] event)
(next-events [e next] next) (next-events [_ next-items]
next-items)


clojure.lang.Sequential clojure.lang.Sequential
(gen-event [e] (gen-event [coll]
(gen-event (first e))) (gen-event (first coll)))
(next-events [e next] (next-events [coll next-items]
(if-let [r (seq (rest e))] (if-let [r (seq (rest coll))]
(cons (next-events (first e) r) next) (cons (next-events (first coll) r) next-items)
(next-events (first e) next))) (next-events (first coll) next-items)))

String String
(gen-event [e] (gen-event [s]
(Event. :chars nil nil e)) (Event. :chars nil nil s))
(next-events [e next] next) (next-events [_ next-items]
next-items)


CData CData
(gen-event [e] (gen-event [cdata]
(Event. :cdata nil nil (:content e))) (Event. :cdata nil nil (:content cdata)))
(next-events [e next] next) (next-events [_ next-items]
next-items)


Comment Comment
(gen-event [e] (gen-event [comment]
(Event. :comment nil nil (:content e))) (Event. :comment nil nil (:content comment)))
(next-events [e next] next) (next-events [_ next-items]
next-items)


nil nil
(gen-event [e] (Event. :chars nil nil "")) (gen-event [_]
(next-events [e next] next)) (Event. :chars nil nil ""))
(next-events [_ next-items]
next-items))


(defn flatten-tree [elements] (defn flatten-elements [elements]
(when (seq elements) (when (seq elements)
(lazy-seq (lazy-seq
(let [e (first elements)] (let [e (first elements)]
(cons (gen-event e) (cons (gen-event e)
(flatten-tree (next-events e (rest elements)))))))) (flatten-elements (next-events e (rest elements))))))))


(defn element [tag & [attrs & content]] (defn element [tag & [attrs & content]]
(Element. tag (or attrs {}) (remove nil? content))) (Element. tag (or attrs {}) (remove nil? content)))
Expand Down Expand Up @@ -321,7 +332,7 @@
(check-stream-encoding stream (or (:encoding opts) "UTF-8"))) (check-stream-encoding stream (or (:encoding opts) "UTF-8")))


(.writeStartDocument writer (or (:encoding opts) "UTF-8") "1.0") (.writeStartDocument writer (or (:encoding opts) "UTF-8") "1.0")
(doseq [event (flatten-tree [e])] (doseq [event (flatten-elements [e])]
(emit-event event writer)) (emit-event event writer))
(.writeEndDocument writer) (.writeEndDocument writer)
stream)) stream))
Expand Down

0 comments on commit bc00307

Please sign in to comment.