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 还很陌生,还不相信自己的洞察力。