aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Andreas Benkard <code@mail.matthias.benkard.de>2011-03-03 16:48:04 +0100
committerMatthias Andreas Benkard <code@mail.matthias.benkard.de>2011-03-03 16:48:04 +0100
commit415bb34ffbf3e888972025dc7aada6bdf19861e1 (patch)
tree64cae4e35e51939e1fadc4ee2d0895a6ca00c809
parent612ec030df3ac71ebb726d54584fcfebde78a6df (diff)
Add “html” and “html-attr-value” formatters.
-rw-r--r--formatters.lisp46
-rw-r--r--json-template.asd4
-rw-r--r--json-template.lisp6
3 files changed, 50 insertions, 6 deletions
diff --git a/formatters.lisp b/formatters.lisp
new file mode 100644
index 0000000..6d86a98
--- /dev/null
+++ b/formatters.lisp
@@ -0,0 +1,46 @@
+;; -*- mode: lisp; coding: utf-8 -*-
+;;
+;; Copyright 2011, Matthias Andreas Benkard.
+;;
+;; Licensed under the Apache License, Version 2.0 (the "License");
+;; you may not use this file except in compliance with the License.
+;; You may obtain a copy of the License at
+;;
+;; http://www.apache.org/licenses/LICENSE-2.0
+;;
+;; Unless required by applicable law or agreed to in writing, software
+;; distributed under the License is distributed on an "AS IS" BASIS,
+;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+;; See the License for the specific language governing permissions and
+;; limitations under the License.
+
+
+(in-package #:json-template)
+
+
+(defun make-escaper (replacements)
+ (let* ((escapees (mapcar #'car replacements))
+ (escapee-p (lambda (x) (member x escapees :test #'char=))))
+ (lambda (string)
+ (with-output-to-string (out)
+ (loop with position = 0
+ for escapee-pos = (position-if escapee-p string :start position)
+ while escapee-pos
+ do (write-string string out :start position :end escapee-pos)
+ (write-string (cdr (assoc (char string escapee-pos)
+ replacements))
+ out)
+ (setq position (1+ escapee-pos))
+ finally (write-string string out :start position))))))
+
+
+(defvar *template-formatters*
+ `(("html" . ,(make-escaper '((#\< . "&#60;")
+ (#\> . "&#63;")
+ (#\& . "&#38;"))))
+ ("html-attr-value" . ,(make-escaper '((#\< . "&#60;")
+ (#\> . "&#63;")
+ (#\& . "&#38;")
+ (#\' . "&#39;")
+ (#\" . "&#34;"))))
+ ("raw" . identity)))
diff --git a/json-template.asd b/json-template.asd
index 39f94dc..2f1cfe8 100644
--- a/json-template.asd
+++ b/json-template.asd
@@ -20,4 +20,6 @@
:description "An implementation of a subset of the JSON Template language."
:license "Apache License, version 2.0"
:version "0.1.0"
- :components ((:file "json-template")))
+ :components ((:file "json-template")
+ (:file "formatters"))
+ :serial t)
diff --git a/json-template.lisp b/json-template.lisp
index 2acc811..9e36a42 100644
--- a/json-template.lisp
+++ b/json-template.lisp
@@ -24,11 +24,6 @@
(in-package #:json-template)
-(defvar *template-formatters*
- `(;;("html" . format-html)
- ;;("html-attr-value" . format-html-attr-value)
- ("raw" . identity)))
-
(defun tokenize-template-string (string)
(loop with in-command-p = nil
with skip-newline-p = nil
@@ -188,3 +183,4 @@
(expand-template-to-stream branch (cons ctx contexts) stream))
value)
(expand-template-to-stream alternative contexts stream))))))))
+