Каков наилучший способ сделать несколько проходов по шаблону в Live - PullRequest
0 голосов
/ 02 мая 2018

Я хочу взять извлеченную HTML-страницу и создать из нее оживляющий шаблон

(-> (fetch) ; function returns clj-http.client/get
    (:body)
    (clojure.java.io/reader)
    (html/html-resource) ; enlive
    (swap-header)
    (swap-body-tag))

Мои два подкачки выглядят так

(defn swap-header [body]
  (as-> (html/deftemplate temp body [content] [:body] (html/content content)) x
        (apply str (x "testing"))))

(defn swap-body-tag [body]
  (as-> (html/deftemplate temp body [disabled] [:body] (html/set-attr :disabled disabled)) x
        (apply str (x "yo-123"))))

Таким образом, дилемма состоит в том, что я могу закомментировать любой из этих двух обменов из обратного конвейера выборки, и он отлично работает. Попытка (в любом порядке) дает сбой. Я считаю, что результатом применения шаблона является неправильный формат для создания другого шаблона из него, но я не могу точно понять, где мне нужно быть.

Ошибка, которую я получаю, цепляя их, равна HTML resource not found.

Отредактировано для использования более заполненного кода и удаления компа

Обновление Я скопировал функцию из https://stackoverflow.com/a/38284236/736368, чтобы сделать строку читателем. который, кажется, заставляет это работать. Это хороший подход с точки зрения производительности?

(->> ctx
    (:request)
    (fetch)
    (:body)
    (clojure.java.io/reader)
    (html/html-resource)
    (swap-body-tag)
    (apply str)           ; new 
    (string->stream)      ; new
    (swap-header))

1 Ответ

0 голосов
/ 02 мая 2018

Есть ли у вас функции, обратные при вызове comp? Они применяются справа сначала. Может быть:

((comp swap-urls clean-footer clean-header) parsed)

что-то вроде этого:

(-> parsed
  clean-header
  clean-footer
  swap-urls)

Мне больше нравится макрос с первым потоком, чем comp, так как я думаю, что он понятнее.

...