Сельмер: Как применять фильтры в настраиваемом теге?

Я экспериментирую с библиотекой 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))
Другие вопросы по тегам