git.fiddlerwoaroof.com
angular.lisp
89bed873
 (ql:quickload :parenscript)
67a3d329
 (ql:quickload :cl-markup)
89bed873
 
 (defpackage :angular
   (:use :parenscript :cl)
   (:export main))
 (declaim (optimize (speed 0) (safety 2) (debug 2)))
 
 (in-package :angular)
 
 (defpsmacro macros (&body body)
   `(lisp (progn
            ,@(loop for form in body
                    collect `(defpsmacro ,@form))
            "")))
 
 
 (defmacro+ps scope-vars (&rest bindings)
   `(progn ,@(loop for (n v) in bindings collect `(scope-var ,n ,v))))
 
 (defmacro+ps scope-var (name value)
   `(setf ($s ,name) ,value))
 
 (defmacro+ps scope-function (name arguments &body body)
   `(scope-var ,name (lambda ,arguments
                       ,@body)))
 
 (defmacro+ps $s (&rest values) `(chain $scope ,@values))
 
 (defun build-lambda (dependencies body)
   `(list ,@(mapcar #'symbol-to-js-string dependencies)
          (lambda ,(loop for x in dependencies
                         collect x)
            ,@body
67a3d329
            )))
89bed873
 
 
 ; This is just for slimv's sake
 (defmacro defcontroller (name dependencies &body body)
   (declare (ignore name dependencies body)))
 
67a3d329
 
 (defmacro+ps resource (name url params &body body)
   `(var ,name
         ($resource ,url ,(cons 'create params)
                    ,(cons 'create (loop for (name form) in body
                                          append (list name (cons 'create form)))))))
 
 
 (defpsmacro defdirective (module-name name dependencies &body body)
   (let ((dependencies (cons '$scope dependencies)))
     `(chain ,module-name
             (directive ,(symbol-to-js-string name)
                        ,(build-lambda dependencies
                                       `((create
                                           ,@body)))))))
 (defpsmacro markup (&body body)
   `(lisp (cl-markup:markup ,@body)))
 
 (defun def-module-function (module-name block-name function-name)
   `(,block-name (name dependencies &body body)
                 (let ((dependencies (cons '$scope dependencies)))
                   `(chain ,',module-name
                           (,',function-name ,(symbol-to-js-string name)
                                             ,(build-lambda dependencies body))))))
 
 (defmacro+ps defmodule (module-name dependencies &body body)
   `(macrolet ((defdirective (name dependencies &body body)
89bed873
                 (let ((dependencies (cons '$scope dependencies)))
67a3d329
                   `(chain ,',module-name
                           (directive ,(symbol-to-js-string name)
                                      ,(build-lambda dependencies
                                                     `((create
                                                         ,@body)))))))
 
               ,(def-module-function module-name 'defservice 'service)
               ,(def-module-function module-name 'defcontroller 'controller))
89bed873
      (progn (var ,module-name ((@ angular module) ,(symbol-to-js-string module-name) ,dependencies))
             ,@body)))
 
 (defmacro+ps select-> (selector)
   `(chain document (query-selector ,selector)))
 
 (defmacro+ps select->element (selector)
   `(chain angular (element (select-> ,selector))))
 
 
 (defmacro+ps ng-ajax (mthd endpoint data resultS &body callback)
   `(chain $http
           (,mthd ,endpoint ,data)
           (success (lambda (,resultS)
                      ,@callback))))
 
 (defun translate-file (infile outfile)
   (let ((*JS-TARGET-VERSION* 1.9))
     (with-open-file (o outfile :direction :output :if-exists :supersede)
       (with-open-file (i infile :direction :input)
         (write-line (ps-compile-file i) o)))))
 
 (defun main (args)
   (in-package :angular)
   (apply #'translate-file (cdr args)))