;;; sgml.ol -- objective lisp interface to SGML
;;; $Id$
;;;

(require 'Stream)

(defClass SGML OStream
  (gi-stack)
  )

(defMethod SGML :empty (gi &optional attrs)
  [self :format "<~A" gi]
  (dolist (a attrs)
	  (let ((n (first a))
		(v (second a))
		)
	    [self :format " ~A=\"~A\"" n v])
	  )
  [self :format ">"]
  )

(defMethod SGML :start (gi &optional attrs)
  (push gi gi-stack)
  [self :empty gi attrs]
  )

(defMethod SGML :end (gi)
  (unless (eq gi (pop gi-stack))
	  (error "gi mismatch on" gi))
  [self :format "</~A>" gi]
  )

(defMethod SGML :ndata (data)
  ;;@@ watch out for markup (</) in ndata!
  [self :format "~A" data]
  )

(defMethod SGML :end-record ()
  [self :format "~%"]
  )

(defMethod SGML :pcdata (data)
  ;;@@ watch out for markup (<, &) in ndata!
  [self :format "~A" 
	(case (type-of data)
	      (string data)
	      (nil "")
	      (cons (concatenate 'string data))
	      (t (error "unknown pcdata representation:" data))
	      )]
  )

(defMethod SGML :doctype (gi)
  ;;@@ entities etc.
  ;;@@ public DTD's
  [self :format "<!DOCTYPE ~A SYSTEM>~%" gi]
  )

(provide 'sgml)
