Сельмер: Как применять фильтры в настраиваемом теге?
Я экспериментирую с библиотекой Selmer (версия 1.12.33) и создал простой настраиваемый тег . Я хочу дополнительно изменить этот тег, чтобы разрешить использование фильтров в том же ключе, что и некоторые стандартные теги, например <tcode id="80057"></tcode>, <tcode id="80058"></tcode>, <tcode id="80059"></tcode>, и <tcode id="80060"></tcode> кажется, позволяет это.
Кажется, что документация не охватывает этого; Кто-нибудь знает как это сделать?
Вот несколько (очень упрощенный) пример кода, раскрывающий суть:
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!
2 ответа
Я предполагаю, что очевидным способом было бы кооптировать Сельмера для выполнения своих задач только с входным аргументом, не пытаясь заново изобрести колесо Сельмера. Пользовательский тег будет выглядеть примерно так:
(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:
(require '[selmer.filter-parser :as htmlp])
(require '[selmer.parser :as html])
(defn resolve-selmer-args
[args context-map]
(map #(if (htmlp/literal? %)
(htmlp/parse-literal %)
(html/render % context-map)) args))