Selmer:如何在自定义标签中应用过滤器?
Selmer: How does one apply filters in a custom tag?
我正在玩弄 Selmer library (version 1.12.33) and have constructed a simple custom tag. I want to modify this tag further to allow the use of filters in a similar vein how some standard tags, e.g. if
, for
, script
, and style
似乎允许它。
文档似乎没有涵盖它; 有人知道怎么做吗?
这里是一些(非常简化的)示例代码,提取了本质:
1。定义自定义标签:
(selmer.parser/add-tag! :hello
(fn [[arg & _] ctx] ; use only first argument
(let [[name & filters] (clojure.string/split arg #"\|")] ; separate arg1 from appended filter(s)
(format "Hi, %s!" (or ((keyword name) ctx) name))))) ; look up in context map, else use as-is
显然,我需要在这里以某种方式使用 filters
,但我不知道如何...
2。渲染文本
(def myctx {:greet/name "world"})
(selmer.parser/render "{{greet/name|upper|safe}}" myctx)
; SUCCESS: expected & actual: WORLD
(selmer.parser/render "{% hello greet/name|upper|safe %}" myctx)
; FAIL: Expected: Hi, WORLD!, actual: Hi, world!
我想呃,显而易见的 方法是选择 Selmer 只在输入 arg 上做它的事情,而不是试图重新发明 Selmer 的轮子。自定义标签将类似于:
(selmer.parser/add-tag! :hello
(fn [[arg & _] ctx] ; use only first argument
(let [name (selmer.parser/render (str "{{" arg "}}") ctx)]
(format "Hello, %s!" name))))
太明显了?我将不胜感激,因为我对 Clojure 还很陌生,还不相信自己的洞察力。
我正在玩弄 Selmer library (version 1.12.33) and have constructed a simple custom tag. I want to modify this tag further to allow the use of filters in a similar vein how some standard tags, e.g. if
, for
, script
, and style
似乎允许它。
文档似乎没有涵盖它; 有人知道怎么做吗?
这里是一些(非常简化的)示例代码,提取了本质:
1。定义自定义标签:
(selmer.parser/add-tag! :hello
(fn [[arg & _] ctx] ; use only first argument
(let [[name & filters] (clojure.string/split arg #"\|")] ; separate arg1 from appended filter(s)
(format "Hi, %s!" (or ((keyword name) ctx) name))))) ; look up in context map, else use as-is
显然,我需要在这里以某种方式使用 filters
,但我不知道如何...
2。渲染文本
(def myctx {:greet/name "world"})
(selmer.parser/render "{{greet/name|upper|safe}}" myctx)
; SUCCESS: expected & actual: WORLD
(selmer.parser/render "{% hello greet/name|upper|safe %}" myctx)
; FAIL: Expected: Hi, WORLD!, actual: Hi, world!
我想呃,显而易见的 方法是选择 Selmer 只在输入 arg 上做它的事情,而不是试图重新发明 Selmer 的轮子。自定义标签将类似于:
(selmer.parser/add-tag! :hello
(fn [[arg & _] ctx] ; use only first argument
(let [name (selmer.parser/render (str "{{" arg "}}") ctx)]
(format "Hello, %s!" name))))
太明显了?我将不胜感激,因为我对 Clojure 还很陌生,还不相信自己的洞察力。