X-Git-Url: http://git.kpe.io/?a=blobdiff_plain;f=base.lisp;h=5a51d4f31cb694ce04a98839510ef1248be17e6a;hb=d886a915a553dbefdebcda142311a43981e3f4a0;hp=feca6b151a1f79dc54e24e938d1de29546bf515f;hpb=63a46255032f6cb25666c40205a23409677eb757;p=lml.git diff --git a/base.lisp b/base.lisp index feca6b1..5a51d4f 100644 --- a/base.lisp +++ b/base.lisp @@ -2,12 +2,12 @@ ;;;; ************************************************************************* ;;;; FILE IDENTIFICATION ;;;; -;;;; Name: lml.cl +;;;; Name: base.lisp ;;;; Purpose: Lisp Markup Language functions ;;;; Programmer: Kevin M. Rosenberg ;;;; Date Started: Aug 2002 ;;;; -;;;; $Id: base.lisp,v 1.4 2003/01/14 08:41:22 kevin Exp $ +;;;; $Id: base.lisp,v 1.23 2003/06/20 08:35:22 kevin Exp $ ;;;; ;;;; This file, part of LML, is Copyright (c) 2002 by Kevin M. Rosenberg ;;;; @@ -16,8 +16,7 @@ ;;;; (http://www.gnu.org/licenses/gpl.html) ;;;; ************************************************************************* -(declaim (optimize (debug 3) (speed 3) (safety 3) (compilation-speed 0))) -(in-package :lml) +(in-package #:lml) (defun html4-prologue-string () "") @@ -26,27 +25,35 @@ "") (defun xhtml-prologue-string () - "") + "") (defvar *print-spaces* nil) (defvar *indent* 0) (defun reset-indent () (setq *indent* 0)) -(defun lml-print (str &rest args) +(defun lml-format (str &rest args) (when (streamp *html-output*) (when *print-spaces* (indent-spaces *indent* *html-output*)) (if args (apply #'format *html-output* str args) - (princ str *html-output*)) - (when *print-spaces* (format *html-output* "~%")) - (values))) + (write-string str *html-output*)) + (when *print-spaces* (write-char #\newline *html-output*)))) -(defmacro lml-line (str &rest args) - `(lml-print ,str ,@args)) +(defun lml-princ (s) + (princ s *html-output*)) + +(defun lml-print (s) + (format *html-output* "~A~%" s)) + +(defun lml-write-char (char) + (write-char char *html-output*)) + +(defun lml-write-string (str) + (write-string str *html-output*)) (defun lml-print-date (date) - (lml-print (date-string date))) + (lml-write-string (date-string date))) (defmacro lml-exec-body (&body forms) `(progn @@ -54,12 +61,12 @@ #'(lambda (form) (etypecase form (string - `(lml-print ,form)) + `(lml-princ ,form)) (number - `(lml-print "~D" ,form)) + `(lml-format "~D" ,form)) (symbol (when form - `(lml-print ,form))) + `(lml-princ ,form))) (cons form))) forms))) @@ -67,22 +74,22 @@ (defmacro with-attr-string (tag attr-string &body body) (let ((attr (gensym))) `(let ((,attr ,attr-string)) - (lml-print "<~(~A~)~A>" ',tag + (lml-format "<~(~A~)~A>" ',tag (if (and (stringp ,attr) (plusp (length ,attr))) - (format nil "~A" ,attr) + (format nil " ~A" ,attr) "")) (incf *indent*) (lml-exec-body ,@body) (decf *indent*) - (lml-print "" ',tag)))) + (lml-format "" ',tag)))) (defmacro with-no-endtag-attr-string (tag attr-string) (let ((attr (gensym))) `(let ((,attr ,attr-string)) - (lml-print "<~(~A~)~A />" ',tag + (lml-format "<~(~A~)~A />" ',tag (if (and (stringp ,attr) (plusp (length ,attr))) - (format nil "~A" ,attr) - ""))))) + (format nil " ~A" ,attr) + ""))))) (defun one-keyarg-string (key value) "Return attribute string for keys" @@ -178,28 +185,32 @@ `(let ((,bound-keyargs ,(macroexpand `(bind-all-keyargs ,keyargs)))) ,(macroexpand `(with-no-endtag-keyargs ,tag ,bound-keyargs))))) +(defmacro jscript (&body body) + `(with script :language "JavaScript" :type "text/javascript" + ,@body)) + (defmacro xhtml-prologue () `(progn - (lml-print "~A~%" (xml-prologue-string)) - (lml-print "~A~%" (xhtml-prologue-string)))) + (lml-format "~A~%" (xml-prologue-string)) + (lml-format "~A~%" (xhtml-prologue-string)))) -(defmacro link (dest &body body) +(defmacro alink (dest &body body) `(with a :href ,dest ,@body)) -(defmacro link-c (class dest &body body) +(defmacro alink-c (class dest &body body) `(with a :href ,dest :class (quote ,class) ,@body)) (defmacro img (dest &rest args) - `(with-no-endtag :src ,dest ,@args)) + `(with-no-endtag img :src ,dest ,@args)) (defmacro input (&rest args) `(with-no-endtag input ,@args)) -(defmacro meta (name content) - `(with meta :name ,name :content ,content)) +(defmacro link (&rest args) + `(with-no-endtag link ,@args)) -(defmacro meta-key (&key name content http-equiv) - `(with meta :name ,name :content ,content :http-equiv ,http-equiv)) +(defmacro meta (&rest args) + `(with-no-endtag meta ,@args)) (defmacro br (&rest args) `(with-no-endtag br ,@args)) @@ -222,9 +233,11 @@ (eval-when (:compile-toplevel :load-toplevel :execute) (defparameter *macro-list* - '(a div span h1 h2 h3 h4 h5 h6 i b p li ul ol table tbody td tr body head - html title pre tt u dl dt dd kbd code form)) - (export '(link link-c br hr img input meta meta-key)) + '(a div span h1 h2 h3 h4 h5 h6 i b p li ul ol table tbody td th tr body + head html title pre tt u dl dt dd kbd code form textarea blockquote + var strong small samp big cite address dfn em q area del ins + object param caption col colgroup script noscript)) + (export '(jscript alink alink-c br hr img input meta link meta-key)) (export *macro-list*)) (loop for i in *macro-list* @@ -250,64 +263,6 @@ (defun new-string () (make-array 1024 :fill-pointer 0 :adjustable t :element-type 'character)) -(set-macro-character #\[ - #'(lambda (stream char) - (declare (ignore char)) - (let ((forms '()) - (curr-string (new-string)) - (paren-level 0) - (got-comma nil)) - (declare (type fixnum paren-level)) - (do ((ch (read-char stream t nil t) (read-char stream t nil t))) - ((eql ch #\])) - (if got-comma - (if (eql ch #\() - ;; Starting top-level ,( - (progn - #+cmu - (setf curr-string (coerce curr-string `(simple-array character (*)))) - - (push `(lml-print ,curr-string) forms) - (setq curr-string (new-string)) - (setq got-comma nil) - (vector-push #\( curr-string) - (do ((ch (read-char stream t nil t) (Read-char stream t nil t))) - ((and (eql ch #\)) (zerop paren-level))) - (when (eql ch #\]) - (format *trace-output* "Syntax error reading #\]") - (return nil)) - (case ch - (#\( - (incf paren-level)) - (#\) - (decf paren-level))) - (vector-push-extend ch curr-string)) - (vector-push-extend #\) curr-string) - (let ((eval-string (read-from-string curr-string)) - (res (gensym))) - (push - `(let ((,res ,eval-string)) - (when ,res - (lml-print ,res))) - forms)) - (setq curr-string (new-string))) - ;; read comma, then non #\( char - (progn - (unless (eql ch #\,) - (setq got-comma nil)) - (vector-push-extend #\, curr-string) ;; push previous command - (vector-push-extend ch curr-string))) - ;; previous character is not a comma - (if (eql ch #\,) - (setq got-comma t) - (progn - (setq got-comma nil) - (vector-push-extend ch curr-string))))) - - #+cmu - (setf curr-string (coerce curr-string `(simple-array character (*)))) - - (push `(lml-print ,curr-string) forms) - `(progn ,@(nreverse forms))))) +