2017-12-21 15 views
2

インラインJavaScriptを生成しようとしていますが、(:script)内にparenscriptコードを入れ、cl-whoを使用して(str)タグを入れなければなりません。 ps,ps*,ps-inlineおよびps-inline*は、生成されたjsと大きな違いはないようです。cl-who、parenscript、hunchentootを使用したインラインJavaScriptの生成

コードの重複を避けるためにマクロを書く一般的な方法はありますか、それとも良い方法がありますか?

(in-package #:ps-test) 

(defmacro standard-page ((&key title) &body body) 
    `(with-html-output-to-string (*standard-output* nil :prologue t :indent t) 
    (:html 
     :lang "en" 
     (:head 
     (:meta :http-equiv "Content-Type" 
      :content "text/html;charset=utf-8") 
     (:title ,title) 
      (:link :type "text/css" 
       :rel "stylesheet" 
       :href "/style.css")) 
     (:body 
     ,@body))))  

(defun main() 
    (with-html-output (*standard-output* nil :indent t :prologue nil) 
    (standard-page (:title "Parenscript test") 
     (:div (str "Hello worldzors")) 
     (:script :type "text/javascript" 
      (str (ps (alert "Hello world as well"))))))) 

(define-easy-handler (docroot :uri "/")() 
    (main)) 

(defun start-ps-test() 
    (setf (html-mode) :html5) 
    (setf *js-string-delimiter* #\") 
    (start (make-instance 'hunchentoot:easy-acceptor :port 8080))) 

(defun stop-ps-test() 
    (stop *server*)) 

(defvar *server* (start-ps-test)) 

答えて

2

マクロは、このユースケースで罰金です:

は、ここに私のプログラムです。 トリックは、マクロが特定の順序で展開されることです。 と言ってください。jsマクロを定義してください。マクロ展開が with-html-outputになると、マクロ(js (alert "Ho Ho Ho"))の内部呼び出しが関数呼び出しのように見え、生成された コードのままになります。 jsマクロの場合、(:script ...)に展開された場合、:scriptは不明な関数です( はそのような関数に実際には名前を付けなかったとします)。 のコードワーカーを使用してコードを解釈するために(who:htm ...)式を囲む を発行する必要があります。

(defmacro js (code) 
    `(who:htm 
    (:script :type "text/javascript" (who:str (ps:ps ,code))))) 

これは、同封のwith-html-outputのコンテキストでのみ機能します。インラインJavaScriptが

、あなたは、その周りに<script>タグを持ちたい 、あなたは一般的に、単にps-inlineを使用することができません:あなたは、多くの場合、同じことを行う場合

(who:with-html-output (*standard-output*) 
    (:a :href (ps:ps-inline (void 0)) 
    "A link where the usual HREF behavior is canceled.")) 

;; prints: 
;; 
;; <a href='javascript:void(0)'>A link where the usual HREF behavior is canceled.</a> 

しかし、マクロを使用して自由に感じます物:

(defmacro link (&body body) 
    `(who:htm (:a :href #.(ps:ps-inline (void 0)) ,@body))) 

(who:with-html-output (*standard-output*) (link "Link")) 

;; prints: 
;; 
;; <a href='javascript:void(0)'>Link</a> 
関連する問題