Size: a a a

Clojure — русскоговорящее сообщество

2021 September 01

PP

Pavel Peganov in Clojure — русскоговорящее сообщество
Учитывая то, что там возможен произвольный Ruby-код, я б наверное написал DSL для сбора данных на Ruby (!), выполнил на реальном руби этот файл и выдал объявления из него JSON'ом.
Но зависит от того, насколько есть доверие входящим файлам, разумеется.
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
предполагаю, что внутри блока livecheck поля могут быть в произвольном порядке
источник

DL

Dmytro Lispyvnyi '(🌲... in Clojure — русскоговорящее сообщество
ну суть остаётся прежней - реплейсить так, чтобы руби превратить в edn
источник

DL

Dmytro Lispyvnyi '(🌲... in Clojure — русскоговорящее сообщество
парсим по парам - первое кейвордим, второе, при необходимости, в кавычки
источник

DL

Dmytro Lispyvnyi '(🌲... in Clojure — русскоговорящее сообщество
всё это дело в теории можно так же описать декларативно в replacements
источник
2021 September 02

T

Tim in Clojure — русскоговорящее сообщество
Спасибо огроомное, ребята, за готовые куски кода и идеи! Спокойной ночи всем =)
источник

AU

Alexander Ushanov in Clojure — русскоговорящее сообщество
это вообще нормально?
(let [test-map {:a/a 1 :a/b 2}
      test-spec (s/merge (s/keys :req [:a/a :a/b]) map?)]
  [(s/explain-data test-spec test-map)
   (s/valid? test-spec test-map)])
;;=>
[#:clojure.spec.alpha{:problems
                     ({:path [],
                       :pred clojure.core/map?,
                       :val #:a{:a 1, :b 2},
                       :via [],
                       :in []}),
                     :spec
                     #object[clojure.spec.alpha$merge_spec_impl$reify__2206 0x703ca106 "clojure.spec.alpha$merge_spec_impl$reify__2206@703ca106"],
                     :value #:a{:a 1, :b 2}}
true]
источник

AU

Alexander Ushanov in Clojure — русскоговорящее сообщество
explain говорит о проблемах, а valid? говорит, что все ок
источник

MB

Mike Bohdan in Clojure — русскоговорящее сообщество
А почему merge, а не and ?
источник

AU

Alexander Ushanov in Clojure — русскоговорящее сообщество
Вообще потому что с and не будут работать s/keys, изначально это использовалось в коде кастомного макроса. Я понимаю, что испольвание немного странное, но разве нормально, что explain и valid? говорят разные вещи?
источник

MB

Mike Bohdan in Clojure — русскоговорящее сообщество
And работает с keys нормально, попробуйте. А вот про мерже функции map? и спеки будут вылезать артефакты
источник

AU

Alexander Ushanov in Clojure — русскоговорящее сообщество
пока внутри ключей не будет чего-то с ветвлением, тогда при первой проверке s/conform внутри поменяет данные на вектор из пути и данных и второй s/keys отвалится, потому что будет опять проверять все ключи, а там уже вектор
источник

AU

Alexander Ushanov in Clojure — русскоговорящее сообщество
тоже странное поведение, но его хотя бы удалось объяснить)
источник

E

ETL in Clojure — русскоговорящее сообщество
А никто свои линтеры на писал на фронте, типа строку на вход, кучу span с раскрашенным синтаксисом и словами на выход? Может есть какие-то готовые вещицы?
источник

VM

Vyacheslav Mikushev in Clojure — русскоговорящее сообщество
Я писал. Получилось вот такая штука:
(defn- mark-elements
 "Splits string text into chunks delimited by elements. Earch element will be wrapped
  by react component. Elemnt may be any clojure structure."
 [text elements component]
 (let [length (count text)
       pos-infos (->> elements
                      (map (fn [word]
                             (let [word-str (str word)
                                   start (string/index-of (string/lower-case text)
                                                          (string/lower-case word-str))
                                   end (+ (or start 0) (count word-str))]
                               {:pos-start start
                                :pos-end end
                                :word (when start
                                        (subs text start end))})))
                      (remove #(nil? (:pos-start %)))
                      (sort-by :pos-start))
       {:keys [acc prev-end]}
       (reduce (fn [{:keys [acc prev-end]} {:keys [pos-start pos-end word]}]
                 {:acc (conj acc (subs text prev-end pos-start) [component word])
                  :prev-end pos-end})
               {:acc [] :prev-end 0}
               pos-infos)]
   (cond-> acc (not= length prev-end) (conj (.substring text prev-end)))))

(defn- mark-search-words-in-text
 "Splits string text into chunks delimited by words from search-string."
 [text search-string]
 (let [words (string/split search-string #" +")]
   (mark-elements text words mark)))

Используется так:
(into [:div]
                   (for [el (mark-search-words-in-text text search-string)]
                     ^{:key el}
                     (if (string? el)
                       ^{:key el} [:span {:style {:opacity 0.5}} el]
                       ^{:Key el} el)))

mark - это компонент:
(defn mark
 "Mark component. Highlights word with color."
 [word]
 [:span (stylefy/use-sub-style style :mark) word])
источник

VM

Vyacheslav Mikushev in Clojure — русскоговорящее сообщество
Но там была простенькая задача, сделать подсветку namespace'ов и функций в тексте.
источник

VM

Vyacheslav Mikushev in Clojure — русскоговорящее сообщество
Для спек-браузера использовали готовый компонент - paren-soup. Он сам подсвечивает и раскрашивает clojure-код. Потом остается с помощью cljs'а достать нужные элементы и добавить on-click обработчики.
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
Насколько я понимаю, надо распарсить строку в структуру а потом обернуть элементы структуры. Первое можно сделать через regex-спеки или банально регулярки, а атрнсформацию сделать через clojure.walk/zippers
источник

AU

Alexander Ushanov in Clojure — русскоговорящее сообщество
еще вопрос по спекам, вот как такое правильно проверять?
(s/def :db/id (s/or :long number? :string string?))
(s/def :map-with-ids
 (s/and
   (s/map-of :db/id (s/keys :req [:db/id]))
   (fn [[id val]] (= id (:db/id val))))
(s/valid? :map-with-ids {1 {:db/id 1}}) ;; => false
источник

AU

Alexander Ushanov in Clojure — русскоговорящее сообщество
false будет, потому что после s/confirm из-за s/or спеки в db/id уже будет лежать не 1, а [:long 1], но как быть, если нужно проверять такое и еще и заранее не знаешь, какие могут быть спеки у ключей?
источник