私はclojureを初めて使用し、enliveを使用してhtmlドキュメントのテキストノードを変換してきました。私の最終目標は、構造をhtml、タグ、その他すべてに変換することです。
現在、enlive-html / html-resourceによって返された構造マップを取得し、それを使用してhtmlに変換することができます。
(apply str (html/emit* nodes))
ここで、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
が、行く方法です。