我是 clojure 的新手,一直在使用 enlive 来转换 html 文档的文本节点。我的最终目标是将结构转换回 html、标签和所有内容。
我目前能够获取 enlive-html/html-resource 返回的 structmap 并将其转换回 html 使用
(apply str (html/emit* nodes))
其中节点是结构图。
我还可以根据需要转换 structmap 的 :content 文本节点。然而,在转换了 structmap 的内容文本节点之后,我最终得到了 MapEntries 的lazyseq。我想将其转换回结构图,以便可以在其上使用 emit*。这有点棘手,因为lazyseqs & structmaps 是嵌套的。
tldr:
我如何转换:
([:tag :html]
[:attrs nil]
[:content
("\n"
([:tag :head]
[:attrs nil]
[:content
("\n "
([:tag :title] [:attrs nil] [:content ("Page Title")])
" \n")])
"\n"
([:tag :body]
[:attrs nil]
[:content
("\n "
([:tag :div]
[:attrs {:id "wrap"}]
[:content
("\n "
([:tag :h1] [:attrs nil] [:content ("header")])
"\n "
([:tag :p] [:attrs nil] [:content ("some paragrah text")])
"\n ")])
"\n")])
"\n\n")])
进入:
{:tag :html,
:attrs nil,
:content
("\n"
{:tag :head,
:attrs nil,
:content
("\n " {:tag :title, :attrs nil, :content ("Page Title")} " \n")}
"\n"
{:tag :body,
:attrs nil,
:content
("\n "
{:tag :div,
:attrs {:id "wrap"},
:content
("\n "
{:tag :h1, :attrs nil, :content ("header")}
"\n "
{:tag :p, :attrs nil, :content ("some paragrah text")}
"\n ")}
"\n")}
"\n\n")}
更新
kotarak 的回答为我指明了 的方向update-in
,我可以使用它来修改地图而不将其转换为序列,从而使我的问题变得无关紧要。
(defn modify-or-go-deeper
"If item is a map, updates its content, else if it's a string, modifies it"
[item]
(declare update-content)
(cond
(map? item) (update-content item)
(string? item) (modify-text item)))
(defn update-content
"Calls modify-or-go-deeper on each element of the :content sequence"
[coll]
(update-in coll [:content] (partial map modify-or-go-deeper)))
我以前for
在地图上使用过,但是update-in
要走的路。