Files
logseq/src/main/frontend/diff.cljs
2020-12-06 11:06:27 +08:00

61 lines
1.5 KiB
Clojure

(ns frontend.diff
(:require [clojure.string :as string]
["diff" :as jsdiff]
[goog.object :as gobj]
[cljs-bean.core :as bean]))
(defn diff
[s1 s2]
(-> ((gobj/get jsdiff "diffLines") s1 s2)
bean/->clj))
(defn diff-words
[s1 s2]
(-> ((gobj/get jsdiff "diffWords") s1 s2)
bean/->clj))
(defn removed?
[s1 s2]
(when (and s1 s2)
(let [diff-result (diff-words s1 s2)]
(->> diff-result
(some :removed)
(boolean)))))
;; (find-position "** hello _w_" "hello w")
(defn find-position
[markup text]
(cond
(<= (count markup) (count text))
(dec (count markup))
:else
(try
(let [markup (string/lower-case markup)
text (-> (string/replace text #"\s+" "")
(string/lower-case))
v1 (vec markup)
v2 (vec text)]
(loop [v1-chars v1
v2-chars v2
v1-idx 0
v2-idx 0]
(cond
(empty? v2-chars)
(dec v1-idx)
:else
(if (= (nth v1 v1-idx)
(nth v2 v2-idx))
(recur (rest v1-chars)
(rest v2-chars)
(inc v1-idx)
(inc v2-idx))
(recur (rest v1-chars)
v2-chars
(inc v1-idx)
v2-idx)))))
(catch js/Error e
(prn "diff error: " e)
(dec (count markup))))))