X-Git-Url: http://git.kpe.io/?p=lml.git;a=blobdiff_plain;f=base.lisp;h=77ffa089e5d0fe726ec731b24f46bd6503ebffee;hp=3daf7b418b698c23590e5d77bc2086234edc5d14;hb=HEAD;hpb=c9eaac280a96aa795556b613fadd6586cfaaf007 diff --git a/base.lisp b/base.lisp index 3daf7b4..77ffa08 100644 --- a/base.lisp +++ b/base.lisp @@ -7,7 +7,7 @@ ;;;; Programmer: Kevin M. Rosenberg ;;;; Date Started: Aug 2002 ;;;; -;;;; $Id: base.lisp,v 1.21 2003/06/15 07:48:30 kevin Exp $ +;;;; $Id$ ;;;; ;;;; This file, part of LML, is Copyright (c) 2002 by Kevin M. Rosenberg ;;;; @@ -22,10 +22,10 @@ "") (defun xml-prologue-string () - "") + "") (defun xhtml-prologue-string () - "") + "") (defvar *print-spaces* nil) (defvar *indent* 0) @@ -36,7 +36,7 @@ (when (streamp *html-output*) (when *print-spaces* (indent-spaces *indent* *html-output*)) (if args - (apply #'format *html-output* str args) + (apply #'format *html-output* str args) (write-string str *html-output*)) (when *print-spaces* (write-char #\newline *html-output*)))) @@ -59,25 +59,25 @@ `(progn ,@(mapcar #'(lambda (form) - (etypecase form - (string - `(lml-princ ,form)) - (number - `(lml-format "~D" ,form)) - (symbol - (when form - `(lml-princ ,form))) - (cons - form))) + (etypecase form + (string + `(lml-princ ,form)) + (number + `(lml-format "~D" ,form)) + (symbol + (when form + `(lml-princ ,form))) + (cons + form))) forms))) (defmacro with-attr-string (tag attr-string &body body) (let ((attr (gensym))) `(let ((,attr ,attr-string)) (lml-format "<~(~A~)~A>" ',tag - (if (and (stringp ,attr) (plusp (length ,attr))) - (format nil " ~A" ,attr) - "")) + (if (and (stringp ,attr) (plusp (length ,attr))) + (format nil " ~A" ,attr) + "")) (incf *indent*) (lml-exec-body ,@body) (decf *indent*) @@ -87,39 +87,39 @@ (let ((attr (gensym))) `(let ((,attr ,attr-string)) (lml-format "<~(~A~)~A />" ',tag - (if (and (stringp ,attr) (plusp (length ,attr))) - (format nil " ~A" ,attr) - ""))))) + (if (and (stringp ,attr) (plusp (length ,attr))) + (format nil " ~A" ,attr) + ""))))) (defun one-keyarg-string (key value) "Return attribute string for keys" (format nil "~(~A~)=\"~A\"" key - (typecase value - (symbol - (string-downcase (symbol-name value))) - (string - value) - (t - (eval value))))) + (typecase value + (symbol + (string-downcase (symbol-name value))) + (string + value) + (t + (eval value))))) (defmacro with-keyargs (tag keyargs &body body) (let ((attr (gensym)) - (kv (gensym))) + (kv (gensym))) `(progn (let ((,attr '())) (dolist (,kv ,keyargs) - (awhen (cdr ,kv) - (push (one-keyarg-string (car ,kv) it) ,attr))) + (awhen (cdr ,kv) + (push (one-keyarg-string (car ,kv) it) ,attr))) (with-attr-string ,tag (list-to-spaced-string (nreverse ,attr)) ,@body))))) (defmacro with-no-endtag-keyargs (tag keyargs) (let ((attr (gensym)) - (kv (gensym))) + (kv (gensym))) `(progn (let ((,attr '())) (dolist (,kv ,keyargs) - (awhen (cdr ,kv) - (push (one-keyarg-string (car ,kv) it) ,attr))) + (awhen (cdr ,kv) + (push (one-keyarg-string (car ,kv) it) ,attr))) (with-no-endtag-attr-string ,tag (list-to-spaced-string (nreverse ,attr))))))) (defmacro bind-one-keyarg (keyarg) @@ -128,39 +128,39 @@ (defmacro bind-all-keyargs (keyargs) "Convert a list of keyarg pairs and convert eval/bind arguments" (let* ((npairs (length keyargs)) - (syms (make-array npairs)) - (ipair 0) - (ipair2 0)) + (syms (make-array npairs)) + (ipair 0) + (ipair2 0)) (declare (dynamic-extent syms)) (dotimes (i npairs) (setf (aref syms i) (gensym))) `(let ,(mapcar #'(lambda (ka) - (prog1 - (list (aref syms ipair) (cdr ka)) - (incf ipair))) - keyargs) + (prog1 + (list (aref syms ipair) (cdr ka)) + (incf ipair))) + keyargs) (list ,@(mapcar #'(lambda (ka) - (prog1 - `(cons ,(car ka) ,(aref syms ipair2)) - (incf ipair2))) - keyargs))))) + (prog1 + `(cons ,(car ka) ,(aref syms ipair2)) + (incf ipair2))) + keyargs))))) (defmacro with (tag &rest args) "Return a list of keyargs and also the body of LML form" (let ((body '()) - (keyargs '()) - (bound-keyargs (gensym))) + (keyargs '()) + (bound-keyargs (gensym))) (do* ((n (length args)) - (i 0 (+ 2 i)) - (arg (nth i args) (nth i args)) - (value (when (< (1+ i) n) - (nth (1+ i) args)) - (when (< (1+ i) n) - (nth (1+ i) args)))) - ((or (not (keyword-symbol? arg)) - (>= i n)) - (dotimes (j (- n i)) - (push (nth (+ i j) args) body))) + (i 0 (+ 2 i)) + (arg (nth i args) (nth i args)) + (value (when (< (1+ i) n) + (nth (1+ i) args)) + (when (< (1+ i) n) + (nth (1+ i) args)))) + ((or (not (keyword-symbol? arg)) + (>= i n)) + (dotimes (j (- n i)) + (push (nth (+ i j) args) body))) (push (cons arg value) keyargs)) (setq keyargs (nreverse keyargs)) (setq body (nreverse body)) @@ -170,21 +170,25 @@ (defmacro with-no-endtag (tag &rest args) "Return a list of keyargs body of LML form" (let ((keyargs '()) - (bound-keyargs (gensym))) + (bound-keyargs (gensym))) (do* ((n (length args)) - (i 0 (+ 2 i)) - (arg (nth i args) (nth i args)) - (value (when (< (1+ i) n) - (nth (1+ i) args)) - (when (< (1+ i) n) - (nth (1+ i) args)))) - ((or (not (keyword-symbol? arg)) - (>= i n))) + (i 0 (+ 2 i)) + (arg (nth i args) (nth i args)) + (value (when (< (1+ i) n) + (nth (1+ i) args)) + (when (< (1+ i) n) + (nth (1+ i) args)))) + ((or (not (keyword-symbol? arg)) + (>= i n))) (push (cons arg value) keyargs)) (setq keyargs (nreverse keyargs)) `(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-format "~A~%" (xml-prologue-string)) @@ -224,7 +228,7 @@ (let ((name (intern (format nil "~A-~A" tag :c)))) `(progn (defmacro ,name (&body body) - `(with ,',tag :class (quote ,(car body)) ,@(cdr body))) + `(with ,',tag :class (quote ,(car body)) ,@(cdr body))) (export ',name)))) (eval-when (:compile-toplevel :load-toplevel :execute) @@ -233,7 +237,7 @@ 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 '(alink alink-c br hr img input meta link meta-key)) + (export '(jscript alink alink-c br hr img input meta link meta-key)) (export *macro-list*)) (loop for i in *macro-list* @@ -249,9 +253,9 @@ (defmacro page (out-file &body body) `(with-open-file (*html-output* - (lml-file-name ,out-file :output) - :direction :output - :if-exists :supersede) + (lml-file-name ',out-file :output) + :direction :output + :if-exists :supersede) (xhtml-prologue) (html :xmlns "http://www.w3.org/1999/xhtml" ,@body))) @@ -261,4 +265,4 @@ - +