Html Clojurescript多词替换(及更多)

Html Clojurescript多词替换(及更多),html,clojurescript,reduce,Html,Clojurescript,Reduce,我在数据库中有卡片,每张卡片上都有一些段落的文字。我想用HTML符号替换“特定短语”。因此,当它们显示时,短语是符号而不是文本 我的代码工作得非常完美,除了调用final函数的方式 (我会尽量避免信息过载,但是) 我这样调用最后一个函数: ...{:__html (add-symbols (add-symbols

我在数据库中有卡片,每张卡片上都有一些段落的文字。我想用HTML符号替换“特定短语”。因此,当它们显示时,短语是符号而不是文本

我的代码工作得非常完美,除了调用final函数的方式

(我会尽量避免信息过载,但是) 我这样调用最后一个函数:

...{:__html                          (add-symbols
                                       (add-symbols
                                         (add-symbols
                                           (add-symbols
                                             (add-symbols
                                               (add-symbols
                                                 (add-symbols
                                                   (add-symbols
                                                     (add-symbols
                                                       (add-symbols
                                                         (add-symbols
                                                           (add-symbols
                                                             (:text card)))))))))))))}
我这样调用此函数的原因是,add symbols函数接受“card text”并找到第一个匹配项,然后返回更新后的“card text”或(:text card),然后再次调用它

由于第一次出现的符号已经消失,并被html编码的符号替换,我可以再次扫描和替换,等等,这个次数将覆盖文本的数量和符号的频率

但最近,我一直在与《勇敢者》杂志讨论Clojure,我偶然发现并注意到fn(减少…)

我知道这不一定容易。但我想的是这样的:

(reduce add-symbols (:text card))
就像我说的,我知道这不会那么容易,;)但是,我应该循环一下吗?还是什么

我以前的代码可以工作,但它太可怜了,完全遍历所有和任何文本,替换所有短语,无论段落长度如何,使用一些锐利的reduce,将是理想的


谢谢你的帮助

作为一个概括性的提纲,您可能需要:

{ :__html
  (loop [curr-card (:text card)]
    (if (is-finished curr-card)
      curr-card
      (recur (add-symbols curr-card)))) }

但是
功能已完成
功能,并且
添加符号
将取决于您的详细信息(请更新问题)。

作为一个大致的提纲,您可能需要:

{ :__html
  (loop [curr-card (:text card)]
    (if (is-finished curr-card)
      curr-card
      (recur (add-symbols curr-card)))) }

但是
功能已经完成
并且
添加符号
将取决于您的详细信息(请更新问题)。

好吧,我本来是在循环,然后我读了您的帖子,我想我可能在正确的轨道上,但是(这种语言很难,但当你成功的时候,你会有一种很好的感觉,就像“过去的日子”一样。)

我甚至尝试了letloop,因为我意识到我所做的只是“伪递归”手动调用我的函数,13次,然后说,那就足够了。在学习了这么多之后,最后,我决定(在 )由于“is finished”子句的原因,最好在时使用

此代码完成作业:

...{:__html
     (let [new-text (atom (add-symbols (:text card)))]
       (when (= @new-text (add-symbols @new-text))
         @new-text
         (swap! new-text #(add-symbols @new-text))))}...
使用循环

...{:__html
     (loop [new-text (:text card)]
       (if (= new-text (add-symbols new-text))
         new-text
         (recur (add-symbols new-text))))}...
他们(都)工作得干净利落、刻薄。我不想说“更多信息”的原因是因为我读到了《勇敢的Clojure》中的一句话:

“相比之下,Clojure的结构非常简单且一致。无论您使用的是哪种运算符或您操作的是哪种数据,结构都是相同的。”

这对我来说意味着,“看,无论你在做什么,翻转煎饼或换轮胎,如果你有操作员和数据,在某些“核心”操作将是相同的,我喜欢Clojure!我知道我并不坚持使用纯不变的对象,但我想一个原子最终必须得到使用

哦,基本上“完成”是检查,运行FN,文本有变化吗

谢谢

其他源代码:

(defn make-span [text symbol path]
  (.replace text (apply str symbol) (str "<img src='" path "'style=\"width:16px;height:16px;\"></img>")))

(defn add-symbols [card-text]
  (-> (if (nil? card-text) "" card-text)
  (make-span "[b]" "img/dc/me_bl.png")
  (make-span "[c]" "img/dc/me_cs.png")
  (make-span "[d]" "img/dc/me_dd.png")
  (make-span "[f]" "img/dc/me_fd.png")
  (make-span "[j]" "img/dc/me_ju.png")
  (make-span "[s]" "img/dc/me_sl.png")
  (make-span "[w]" "img/dc/me_wi.png")))

(defn- card-text
  "Generate text html representation a card"
  [card cursor]
  [:div
   [:h4 (:title card)]
   [:div.text
    [:p [:span.type (str (:type card))] (if (= (.toLowerCase (:type card)) (:Secondary card))
                                          ""
                                          (str ": " (:Secondary card)))]
    [:pre {:dangerouslySetInnerHTML #js {:__html
                                         (let [new-text (atom (add-symbols (:text card)))]
                                           (when (= @new-text (add-symbols @new-text))
                                             @new-text
                                             (swap! new-text #(add-symbols @new-text))))}}]]])
(defn make span[文本符号路径]
(.替换文本(应用str符号)(str“”))
(定义添加符号[卡片文本]
(->(如果(无?卡片文本)“”卡片文本)
(制作span“[b]”img/dc/me_bl.png)
(使span“[c]”img/dc/me_cs.png)
(制作span“[d]”img/dc/me\u dd.png)
(制作span“[f]”img/dc/me_fd.png)
(制作span“[j]”img/dc/me_ju.png)
(制作span“[s]”img/dc/me_sl.png)
(制作span“[w]”img/dc/me_wi.png)
(defn-卡片文本)
“生成卡片的文本html表示”
[卡片光标]
[:div
[:h4(:标题卡)]
[:div.text
[:p[:span.type(str(:type card))](如果((.toLowerCase(:type card))(:Secondary card))
""
(str:“(:辅助卡)))]
[:pre{:dangerouslysetinenerHTML#js{:u html
(让[新文本(atom(添加符号(:文本卡)))]
(当(=新文本时(在新文本时添加符号))
@新文本
(交换!新文本#(添加符号@新文本)))}]]

这里有更多的代码,但这并不是这个问题的真正目的或应用。我真的很兴奋能找到问题的确切点或“关键”,再次感谢!!

好吧,我本来是要循环的,然后我读了你的帖子,我想我可能走对了路,但是(这种语言很难,但当你成功的时候,你会有一种很好的感觉,就像“过去的日子”一样。)

我甚至尝试了letloop,因为我意识到我所做的只是“伪递归”手动调用我的函数,13次,然后说,那就足够了。在学习了这么多之后,最后,我决定(在 )由于“is finished”子句的原因,最好在
时使用

此代码完成作业:

...{:__html
     (let [new-text (atom (add-symbols (:text card)))]
       (when (= @new-text (add-symbols @new-text))
         @new-text
         (swap! new-text #(add-symbols @new-text))))}...
使用循环

...{:__html
     (loop [new-text (:text card)]
       (if (= new-text (add-symbols new-text))
         new-text
         (recur (add-symbols new-text))))}...
他们(都)工作得干净利落、刻薄。我不想说“更多信息”的原因是因为我读到了《勇敢的Clojure》中的一句话:

“相比之下,Clojure的结构非常简单且一致。无论您使用的是哪种运算符或您操作的是哪种数据,结构都是相同的。”

这对我来说意味着,“看,无论你在做什么,翻转煎饼或换轮胎,如果你有操作员和数据,在某些“核心”操作将是相同的,我喜欢Clojure!我知道我不坚持纯不变的对象,但我