Update of /project/cxml/cvsroot/cxml/klacks
In directory clnet:/tmp/cvs-serv13701/klacks
Modified Files:
klacks-impl.lisp klacks.lisp
Log Message:
klacks fixes
--- /project/cxml/cvsroot/cxml/klacks/klacks-impl.lisp 2007/02/18 11:07:40 1.2
+++ /project/cxml/cvsroot/cxml/klacks/klacks-impl.lisp 2007/02/18 14:35:15 1.3
@@ -31,7 +31,7 @@
(current-values)
(current-attributes)
(cdata-section-p :reader klacks:current-cdata-section-p)
- ;; extra with-source magic
+ ;; extra WITH-SOURCE magic
(data-behaviour :initform :DTD)
(namespace-stack :initform (list *initial-namespace-bindings*))
(temporary-streams :initform nil)
@@ -126,13 +126,18 @@
(apply #'make-source xstream args)))
(pathname
(let* ((xstream
- (make-xstream (open input :element-type '(unsigned-byte 8))))
- (source (apply #'make-source
- xstream
- :pathname input
- args)))
- (push xstream (slot-value source 'temporary-streams))
- source))
+ (make-xstream (open input :element-type '(unsigned-byte 8)))))
+ (setf (xstream-name xstream)
+ (make-stream-name
+ :entity-name "main document"
+ :entity-kind :main
+ :uri (pathname-to-uri (merge-pathnames input))))
+ (let ((source (apply #'make-source
+ xstream
+ :pathname input
+ args)))
+ (push xstream (slot-value source 'temporary-streams))
+ source)))
(rod
(let ((xstream (string->xstream input)))
(setf (xstream-name xstream)
@@ -152,8 +157,7 @@
(check-type entity-resolver (or null function symbol))
(check-type disallow-internal-subset boolean)
(let* ((context
- (make-context :handler nil
- :main-zstream input
+ (make-context :main-zstream input
:entity-resolver entity-resolver
:disallow-internal-subset disallow-internal-subset))
(source
@@ -167,6 +171,7 @@
:scratch-pad-2 *scratch-pad-2*
:scratch-pad-3 *scratch-pad-3*
:scratch-pad-4 *scratch-pad-4*)))
+ (setf (handler context) (make-instance 'klacks-dtd-handler :source source))
(setf (slot-value source 'continuation)
(lambda () (klacks/xmldecl source input)))
source))
@@ -208,25 +213,26 @@
(defun klacks/doctype (source input)
(with-source (source current-key current-values validate dtd)
(let ((cont (lambda () (klacks/finish-doctype source input)))
- ignoreme name extid)
+ l)
(prog1
(cond
((eq (peek-token input) :<!DOCTYPE)
- (setf (values ignoreme name extid)
- (p/doctype-decl input dtd))
+ (setf l (cdr (p/doctype-decl input dtd)))
(lambda () (klacks/misc*-2 source input cont)))
(dtd
- (setf (values ignoreme name extid)
- (synthesize-doctype dtd input))
+ (setf l (cdr (synthesize-doctype dtd input)))
cont)
((and validate (not dtd))
(validity-error "invalid document: no doctype"))
(t
(return-from klacks/doctype
(funcall cont))))
- (setf current-key :dtd)
- (setf current-values
- (list name (extid-public extid) (extid-system extid)))))))
+ (destructuring-bind (&optional name extid) l
+ (setf current-key :dtd)
+ (setf current-values
+ (list name
+ (and extid (extid-public extid))
+ (and extid (extid-system extid)))))))))
(defun klacks/finish-doctype (source input)
(with-source (source current-key current-values root data-behaviour)
@@ -323,7 +329,7 @@
(klacks/entity-reference source input name recurse)))
((:<!\[)
(setf current-key :characters)
- (setf current-values (list (process-cdata-section input sem)))
+ (setf current-values (list (process-cdata-section input)))
(setf cdata-section-p t)
recurse)
((:PI)
@@ -376,6 +382,58 @@
(set-full-speed input)
(klacks/content source input cont)))
+
+;;;; terrible kludges
+
+(defclass klacks-dtd-handler ()
+ ((handler-source :initarg :source :reader handler-source)
+ (internal-subset-p :initform nil :accessor handler-internal-subset-p)))
+
+(defmethod sax:start-internal-subset ((handler klacks-dtd-handler))
+ (setf (slot-value (handler-source handler) 'internal-declarations) '())
+ (setf (handler-internal-subset-p handler) t))
+
+(defmethod sax:end-internal-subset ((handler klacks-dtd-handler))
+ (setf (handler-internal-subset-p handler) nil))
+
+(defmethod sax:entity-resolver ((handler klacks-dtd-handler) fn)
+ (setf (slot-value (handler-source handler) 'dom-impl-entity-resolver) fn))
+
+(defmethod sax::dtd ((handler klacks-dtd-handler) dtd)
+ (setf (slot-value (handler-source handler) 'dom-impl-dtd) dtd))
+
+(defmethod sax:end-dtd ((handler klacks-dtd-handler))
+ (let ((source (handler-source handler)))
+ (when (slot-boundp source 'internal-declarations)
+ (setf (slot-value source 'internal-declarations)
+ (reverse (slot-value source 'internal-declarations)))
+ (setf (slot-value source 'external-declarations)
+ (reverse (slot-value source 'external-declarations))))))
+
+(macrolet
+ ((defhandler (name &rest args)
+ `(defmethod ,name ((handler klacks-dtd-handler) ,@args)
+ (let ((source (handler-source handler))
+ (spec (list ',name ,@args)))
+ (if (handler-internal-subset-p handler)
+ (push spec (slot-value source 'internal-declarations))
+ (push spec (slot-value source 'external-declarations)))))))
+ (defhandler sax:unparsed-entity-declaration
+ name public-id system-id notation-name)
+ (defhandler sax:external-entity-declaration
+ kind name public-id system-id)
+ (defhandler sax:internal-entity-declaration
+ kind name value)
+ (defhandler sax:notation-declaration
+ name public-id system-id)
+ (defhandler sax:element-declaration
+ name model)
+ (defhandler sax:attribute-declaration
+ element-name attribute-name type default))
+
+
+;;;; debugging
+
#+(or)
(trace CXML::KLACKS/DOCTYPE
CXML::KLACKS/EXT-PARSED-ENT
--- /project/cxml/cvsroot/cxml/klacks/klacks.lisp 2007/02/11 18:21:20 1.1
+++ /project/cxml/cvsroot/cxml/klacks/klacks.lisp 2007/02/18 14:35:15 1.2
@@ -18,7 +18,13 @@
(in-package :cxml)
-(defclass klacks:source () ())
+(defclass klacks:source ()
+ (
+ ;; fixme, terrible DTD kludges
+ (internal-declarations)
+ (external-declarations :initform nil)
+ (dom-impl-dtd :initform nil)
+ (dom-impl-entity-resolver :initform nil)))
(defgeneric klacks:close-source (source))
@@ -83,7 +89,19 @@
(sax:comment handler a))
(:dtd
(sax:start-dtd handler a b c)
- (sax:end-dtd handler))
+ (when (slot-boundp source 'internal-declarations)
+ (sax:start-internal-subset handler)
+ (serialize-declaration-kludge
+ (slot-value source 'internal-declarations)
+ handler)
+ (sax:end-internal-subset handler))
+ (serialize-declaration-kludge
+ (slot-value source 'external-declarations)
+ handler)
+ (sax:end-dtd handler)
+ (sax:entity-resolver handler
+ (slot-value source 'dom-impl-entity-resolver))
+ (sax::dtd handler (slot-value source 'dom-impl-dtd)))
(:start-element
(sax:start-element handler a b c (klacks:list-attributes source)))
(:end-element
@@ -93,3 +111,8 @@
(t
(error "unexpected klacks key: ~A" key)))
(klacks:consume source))))
+
+(defun serialize-declaration-kludge (list handler)
+ (loop
+ for (fn . args) in list
+ do (apply fn handler args)))