diff options
| author | Charles Cabergs <me@cacharle.xyz> | 2021-01-09 00:25:28 +0100 |
|---|---|---|
| committer | Charles Cabergs <me@cacharle.xyz> | 2021-01-09 00:25:28 +0100 |
| commit | 92375a78f43d5f62c3036b00a79f78200714e672 (patch) | |
| tree | 201a8db19603718331a07bc2df48c1b6eba13d84 | |
| parent | 21437030c5610a11c5d0664e114fe41b0896735c (diff) | |
| download | temper-92375a78f43d5f62c3036b00a79f78200714e672.tar.gz temper-92375a78f43d5f62c3036b00a79f78200714e672.tar.bz2 temper-92375a78f43d5f62c3036b00a79f78200714e672.zip | |
Added code interpolation
| -rw-r--r-- | README.md | 11 | ||||
| -rw-r--r-- | temper.lisp | 54 | ||||
| -rw-r--r-- | test.html | 2 |
3 files changed, 39 insertions, 28 deletions
@@ -5,7 +5,12 @@ Common Listp templating language. ## Usage ```html -{% (loop :for i in '(1 2 3)) %} - <li> {{ i }} </li> -{% ) %} +<% (loop :for i in '(1 2 3)) %> + <li> <%= i %> </li> +<% ) %> ``` + +## TODO + +* [x] value interpolation (e.g `<%= link %>`) +* [ ] insert variable in local scope diff --git a/temper.lisp b/temper.lisp index 2007a3b..26eb9ec 100644 --- a/temper.lisp +++ b/temper.lisp @@ -8,17 +8,24 @@ (defconstant +temper-open+ "<%") (defconstant +temper-close+ "%>") (defconstant +temper-close-len+ (length +temper-close+)) +(defconstant +temper-interpolate+ #\=) (defun lex (input) (let ((pos (search +temper-open+ input))) (if (null pos) (list (list 'string input)) - (let* ((before (subseq input 0 pos)) - (input (subseq input pos)) - (end-pos (search +temper-close+ input)) - (code (subseq input +temper-close-len+ end-pos)) - (input (subseq input (+ end-pos +temper-close-len+)))) - (append (list (list 'string before) (list 'code code)) (lex input)))))) + (let* ((before (subseq input 0 pos)) + (input (subseq input pos)) + (end-pos (search +temper-close+ input)) + (code (subseq input +temper-close-len+ end-pos)) + (input (subseq input (+ end-pos +temper-close-len+)))) + (append + (list + (list 'string before) + (if (equal (char code 0) +temper-interpolate+) + (list 'interpolation (subseq code 1)) + (list 'code code))) + (lex input)))))) (defun tokens-to-code-string (tokens) @@ -28,14 +35,22 @@ #'(lambda (token) (let ((token-type (first token)) (token-content (second token))) - (if (eql token-type 'string) - (format nil "~S" - `(setf buf (concatenate - 'string - buf - ,(string-trim '(#\linefeed #\space) token-content) - '(#\linefeed)))) - token-content))) + (cond + ((eql token-type 'code) token-content) + ((eql token-type 'interpolation) + (format nil "~S" + `(setf buf + (concatenate 'string + buf + (format nil "~A" ,(read-from-string token-content)) + '(#\linefeed))))) + ((eql token-type 'string) + (format nil "~S" + `(setf buf + (concatenate 'string + buf + ,(string-trim '(#\linefeed #\space) token-content) + '(#\linefeed)))))))) tokens))) (defun generate (tokens) @@ -48,15 +63,6 @@ ")"))))) - +; (format t "~A" (tokens-to-code-string (lex (read-all)))) (setq res (generate (lex (read-all)))) (format t "~A" (eval res)) -; (setq str (format t "~{~S~^ ~}" res)) - - - -; (princ str) - -; (print (eval (read-from-string str))) - -; (read-from-string (lex (read-all))) @@ -1,5 +1,5 @@ <ul> <% (dotimes (n 10) %> - <li>test</li> + <li><%= (+ n 4 5) %></li> <% ) %> </ul> |
