在活动

时间:2018-05-01 22:00:22

标签: clojure enlive

我想获取一个获取的html页面并从中创建一个活跃的模板

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

我的两个交换fns看起来像这样

(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"))))

所以困境是我可以从fetch返回管道注释掉这两个交换中的任何一个并且它工作正常。试图(以任何顺序)给出失败。我相信应用模板的结果是错误的格式,可以从中制作另一个模板,但不能完全达到我需要的位置。

我链接它时得到的错误是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 :(得分:1)

在调用comp时,您的功能是否相反?它们首先应用于右侧。也许:

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

是这样的:

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

我倾向于喜欢线程优先的宏比comp更好,因为我认为它更清晰。