Замена нескольких слов в Clojurescript (и не только) - PullRequest
0 голосов
/ 12 мая 2018

У меня есть карты в базе данных с количеством параграфов для каждой карты.Я хочу заменить "Определенные фразы" на символы HTML.Так что, когда они отображаются, фраза (ы) являются символом (ами) вместо текста.

Мой код работает довольно безупречно, за исключением того, как я вызываю последнюю функцию.

(Я собираюсь попробовать и не слишком увлекаться информационной перегрузкой, но) я вызываю последнюю функцию следующим образом:

...{:__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-Функция «Символы» берет «текст карты» и находит первое вхождение, а затем возвращает обновленный «текст карты» или (: текстовая карта), в котором затем вызывается снова.

Поскольку первое вхождение уже прошлои заменив его символом в кодировке html, я могу сканировать снова и заменить и т. д., это количество раз будет охватывать объем текста и частоту символов.

Но в последнее время я обновляю Clojure с помощью Clojureдля храбрых, и я наткнулся и обратил внимание на fn (СНИЖЕНИЕ ...)

Я знал, что это не обязательно будет легко.Но я думал о чем-то вроде:

(reduce add-symbols (:text card))

Как я уже сказал, я знал, что это будет не так просто;) но я должен просто зацикливаться?или что?

Мой предыдущий код работает, но он настолько жалок, и полностью обрабатывает ВСЕ и ЛЮБОЙ текст и заменяет ВСЕ фразы независимо от того, какая длина абзацев с использованием некоторого острого сокращения будет идеальной!

Спасибо за любую помощь!

Ответы [ 3 ]

0 голосов
/ 12 мая 2018

Ладно, я шел с loop , потом я прочитал твой пост и подумал, что могу быть на верном пути, но тьфу (этот язык TOUGH, но когда ты добьешься успеха, ты получишь это хорошоОле приятное чувство, как в «старые времена».)

Я пытался с let и loop даже, потому что я понял, что все, что я делал, было "псевдо-рекурсивно «вызываю мою функцию 13 раз вручную и говорю, что этого будет достаточно.Изучив так много, в конце концов я решил (с некоторой помощью переопределить переменную let'd в цикле Clojure ) использовать при из-за того, что "готово"предложение это было бы лучше.

Этот код завершает работу:

...{:__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 for the Brave»:

«Структура Clojure очень проста и последовательна по сравнению. НетНезависимо от того, с каким оператором вы работаете или с какими данными вы работаете, структура одна и та же. "

Что для меня означало:" Смотри, что бы ты ни делал, переворачивая блины "или смена шин, если у вас есть оператор и данные, на каком-то «ядре» манипуляции будут такими же, и мне нравится Clojure за это! Я знаю, что не придерживался чистых неизменных объектов, но я считаю, что atom должен в конечном итоге привыкнуть ...

о, и в основном "готово" проверял, запустил 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))))}}]]])

Есть еще код, но это не совсем то, какова была цель или применение этого вопроса. Я был действительно взволнован, чтобы добраться доТОЧНАЯ ТОЧКА вопроса или "МЯСОВОПРОС ", еще раз спасибо !!

0 голосов
/ 13 мая 2018

Вы можете использовать reduce, если вы комбинируете его с iterate, чтобы создать последовательность новых текстовых значений, вместе с функцией, которая останавливает сокращение, когда изменений не видно. Это вычисляет фиксированную точку из add-symbols, начиная со значения (:text card):

(reduce #(if (= %1 %2) 
          (reduced %1) 
          %2) 
  (iterate add-symbols (:text card)))

В качестве бонуса, с ClojureScript 1.10.238 iterate создает , непосредственно уменьшаемый результат. Промежуточная последовательность не создается (очень похоже на низкоуровневый подход loop / recur).

0 голосов
/ 12 мая 2018

В общих чертах вы, вероятно, хотите что-то вроде:

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

Но функция is-finished и add-symbols будут зависеть от ваших данных (обновите вопрос).

...