(:file "compiler" :depends-on ("namespace"))
(:file "js-macrology" :depends-on ("compiler"))
(:file "ps-macrology" :depends-on ("utils" "js-macrology" "parse-lambda-list"))
- (:file "js-translation" :depends-on ("ps-macrology"))
- (:file "compilation-interface" :depends-on ("package" "js-translation"))
+ (:file "printer" :depends-on ("ps-macrology"))
+ (:file "compilation-interface" :depends-on ("package" "printer"))
(:file "deprecated-interface" :depends-on ("compilation-interface"))
;; standard library
(:module :lib
(parenscript-print (compile-parenscript-form script-form :expecting :statement) output-stream))
(defmacro ps (&body body)
- "A macro that returns a Javascript string of the supplied Parenscript forms."
+ "Given Parenscript forms (an implicit progn), expands to code which
+compiles those forms to a JavaScript string."
`(ps* '(progn ,@body)))
(defun ps* (&rest body)
Body is evaluated."
(compile-script `(progn ,@body)))
-(defun ps-inline* (form &optional (quote-char #\"))
- (let ((*js-quote-char* quote-char))
- (concatenate 'string
- "javascript:"
- (remove #\Newline
- (parenscript-print (compile-parenscript-form form :expecting :statement))
- :from-end t))))
+(defvar *js-inline-string-delimiter* #\"
+ "Controls the string delimiter char used when compiling Parenscript in ps-inline.")
-(defmacro ps-inline (form &optional (quote-char #\"))
- `(ps-inline* ',form ,quote-char))
+(defun ps-inline* (form &optional (*js-string-delimiter* *js-inline-string-delimiter*))
+ (concatenate 'string
+ "javascript:"
+ (parenscript-print (compile-parenscript-form form :expecting :statement))))
+
+(defmacro ps-inline (form &optional (string-delimiter '*js-inline-string-delimiter*))
+ `(ps-inline* ',form ,string-delimiter))
(print-ps ps-form)))))
(defun psw (obj) ;; parenscript-write
- (cond ((stringp obj) (write-string obj *ps-output-stream*))
- ((characterp obj) (write-char obj *ps-output-stream*))
- (t (princ obj *ps-output-stream*))))
+ (princ obj *ps-output-stream*))
(defgeneric ps-print% (special-form-name special-form-args))
(defgeneric ps-print (compiled-form))
-(defmethod ps-print ((form null)) ;; don't print nils (ex: result of defining macros, etc.)
+(defmethod ps-print ((form null)) ;; don't print top-level nils (ex: result of defining macros, etc.)
)
(defmethod ps-print ((compiled-form cons))
indent position."
(ps-print% (car compiled-form) (cdr compiled-form)))
-;;; indenter
-
-(defparameter *indent-num-space* 4)
+;;; indentation
+(defvar *ps-print-pretty* t)
+(defvar *indent-num-spaces* 4)
(defun newline-and-indent ()
- (when (fresh-line *ps-output-stream*)
- (loop repeat (* *indent-level* *indent-num-space*)
+ (when (and (fresh-line *ps-output-stream*) *ps-print-pretty*)
+ (loop repeat (* *indent-level* *indent-num-spaces*)
do (psw #\Space))))
;;; string literals
-(defvar *js-quote-char* #\'
- "Specifies which character JS should use for delimiting strings.
+(defvar *js-string-delimiter* #\'
+ "Specifies which character should be used for delimiting strings.
-This variable is useful when have to embed some javascript code
+This variable is used when you want to embed the resulting JavaScript
in an html attribute delimited by #\\\" as opposed to #\\', or
vice-versa.")
(defmethod ps-print ((string string))
(flet ((lisp-special-char-to-js (lisp-char)
(car (rassoc lisp-char *js-lisp-escaped-chars*))))
- (psw *js-quote-char*)
+ (psw *js-string-delimiter*)
(loop for char across string
for code = (char-code char)
for special = (lisp-special-char-to-js char)
- do (cond (special (psw #\\)
- (psw special))
+ do (cond (special (psw #\\) (psw special))
((or (<= code #x1f) (>= code #x80))
(format *ps-output-stream* "\\u~4,'0x" code))
- (t (psw char)))
- finally (psw *js-quote-char*))))
+ (t (psw char))))
+ (psw *js-string-delimiter*)))
(defmethod ps-print ((number number))
(format *ps-output-stream* (if (integerp number) "~S" "~F") number))