【问题标题】:What is the best way to do multiple passes over a template in enlive在enlive中对模板进行多次传递的最佳方法是什么
【发布时间】:2018-05-02 22:11:16
【问题描述】:

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

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

所以难题是我可以从获取返回管道中注释掉这两个交换中的任何一个,并且它工作正常。尝试(以任何一种顺序)都会失败。我相信应用模板的结果是错误的格式,无法从中制作另一个模板,但无法完全到达我需要的位置。

链接它们时我得到的错误是HTML resource not found.

修改为使用更多填写的代码并删除 comp

更新 我从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))

【问题讨论】:

  • 通过->->> 做同样的事情也很常见;比如(-> parsed clean-header clean-footer swap-urls etc)
  • 您能发布一些示例数据吗?这将使您更容易看到您正在尝试做什么以及哪里出了问题。

标签: clojure enlive


【解决方案1】:

您在调用comp 时是否有反转功能?它们首先从右侧应用。也许:

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

是这样的:

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

比起comp,我更喜欢线程优先宏,因为我认为它更清晰。

【讨论】:

  • 好吧,这并不是说我把清理过的东西弄乱了,它们取决于非常不同的部分。让我再补充一下我的问题吧。
猜你喜欢
  • 2013-12-29
  • 1970-01-01
  • 1970-01-01
  • 2013-04-18
  • 1970-01-01
  • 1970-01-01
  • 2018-10-06
  • 2018-12-20
  • 2010-09-10
相关资源
最近更新 更多