aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCharles Cabergs <me@cacharle.xyz>2021-01-09 00:25:28 +0100
committerCharles Cabergs <me@cacharle.xyz>2021-01-09 00:25:28 +0100
commit92375a78f43d5f62c3036b00a79f78200714e672 (patch)
tree201a8db19603718331a07bc2df48c1b6eba13d84
parent21437030c5610a11c5d0664e114fe41b0896735c (diff)
downloadtemper-92375a78f43d5f62c3036b00a79f78200714e672.tar.gz
temper-92375a78f43d5f62c3036b00a79f78200714e672.tar.bz2
temper-92375a78f43d5f62c3036b00a79f78200714e672.zip
Added code interpolation
-rw-r--r--README.md11
-rw-r--r--temper.lisp54
-rw-r--r--test.html2
3 files changed, 39 insertions, 28 deletions
diff --git a/README.md b/README.md
index ade9374..4e1d866 100644
--- a/README.md
+++ b/README.md
@@ -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)))
diff --git a/test.html b/test.html
index fc91990..097ad56 100644
--- a/test.html
+++ b/test.html
@@ -1,5 +1,5 @@
<ul>
<% (dotimes (n 10) %>
- <li>test</li>
+ <li><%= (+ n 4 5) %></li>
<% ) %>
</ul>