💄 Format common code

This commit is contained in:
Andrey Antukh 2024-01-05 13:49:57 +01:00 committed by Alonso Torres
parent 0b29aaecc4
commit b6ecc8b1be
63 changed files with 825 additions and 880 deletions

View file

@ -6,8 +6,8 @@
(ns app.common.attrs (ns app.common.attrs
(:require (:require
[app.common.geom.shapes :as gsh] [app.common.geom.shapes :as gsh]
[app.common.math :as mth])) [app.common.math :as mth]))
(defn- get-attr (defn- get-attr
[obj attr] [obj attr]

View file

@ -14,10 +14,10 @@
(:require-macros [app.common.data])) (:require-macros [app.common.data]))
(:require (:require
#?(:cljs [cljs.reader :as r]
:clj [clojure.edn :as r])
#?(:cljs [cljs.core :as c] #?(:cljs [cljs.core :as c]
:clj [clojure.core :as c]) :clj [clojure.core :as c])
#?(:cljs [cljs.reader :as r]
:clj [clojure.edn :as r])
#?(:cljs [goog.array :as garray]) #?(:cljs [goog.array :as garray])
[app.common.math :as mth] [app.common.math :as mth]
[clojure.set :as set] [clojure.set :as set]
@ -589,8 +589,8 @@
(defn num-string? [v] (defn num-string? [v]
;; https://stackoverflow.com/questions/175739/built-in-way-in-javascript-to-check-if-a-string-is-a-valid-number ;; https://stackoverflow.com/questions/175739/built-in-way-in-javascript-to-check-if-a-string-is-a-valid-number
#?(:cljs (and (string? v) #?(:cljs (and (string? v)
(not (js/isNaN v)) (not (js/isNaN v))
(not (js/isNaN (parse-double v)))) (not (js/isNaN (parse-double v))))
:clj (not= (parse-double v :nan) :nan))) :clj (not= (parse-double v :nan) :nan)))
@ -846,26 +846,26 @@
(def ^:const trail-zeros-regex-2 #"(\.\d*[^0])0+$") (def ^:const trail-zeros-regex-2 #"(\.\d*[^0])0+$")
#?(:cljs #?(:cljs
(defn format-precision (defn format-precision
"Creates a number with predetermined precision and then removes the trailing 0. "Creates a number with predetermined precision and then removes the trailing 0.
Examples: Examples:
12.0123, 0 => 12 12.0123, 0 => 12
12.0123, 1 => 12 12.0123, 1 => 12
12.0123, 2 => 12.01" 12.0123, 2 => 12.01"
[num precision] [num precision]
(if (number? num) (if (number? num)
(try (try
(let [num-str (mth/to-fixed num precision) (let [num-str (mth/to-fixed num precision)
;; Remove all trailing zeros after the comma 100.00000 ;; Remove all trailing zeros after the comma 100.00000
num-str (str/replace num-str trail-zeros-regex-1 "")] num-str (str/replace num-str trail-zeros-regex-1 "")]
;; Remove trailing zeros after a decimal number: 0.001|00| ;; Remove trailing zeros after a decimal number: 0.001|00|
(if-let [m (re-find trail-zeros-regex-2 num-str)] (if-let [m (re-find trail-zeros-regex-2 num-str)]
(str/replace num-str (first m) (second m)) (str/replace num-str (first m) (second m))
num-str)) num-str))
(catch :default _ (catch :default _
(str num))) (str num)))
(str num)))) (str num))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Util protocols ;; Util protocols

View file

@ -24,7 +24,7 @@
keys in contrast to clojure.core/select-keys" keys in contrast to clojure.core/select-keys"
[target keys] [target keys]
(assert (vector? keys) "keys expected to be a vector") (assert (vector? keys) "keys expected to be a vector")
`{ ~@(mapcat (fn [key] [key (list `c/get target key)]) keys) ~@[] }) `{~@(mapcat (fn [key] [key (list `c/get target key)]) keys) ~@[]})
(defmacro get-in (defmacro get-in
"A macro version of `get-in`. Useful when the keys vector is known at "A macro version of `get-in`. Useful when the keys vector is known at

View file

@ -83,113 +83,112 @@
(sm/humanize-explain (::sm/explain data) opts))) (sm/humanize-explain (::sm/explain data) opts)))
#?(:clj #?(:clj
(defn format-throwable (defn format-throwable
[^Throwable cause & {:keys [summary? detail? header? data? explain? chain? data-level data-length trace-length] [^Throwable cause & {:keys [summary? detail? header? data? explain? chain? data-level data-length trace-length]
:or {summary? true :or {summary? true
detail? true detail? true
header? true header? true
data? true data? true
explain? true explain? true
chain? true chain? true
data-length 8 data-length 8
data-level 5}}] data-level 5}}]
(letfn [(print-trace-element [^StackTraceElement e] (letfn [(print-trace-element [^StackTraceElement e]
(let [class (.getClassName e) (let [class (.getClassName e)
method (.getMethodName e)] method (.getMethodName e)]
(let [match (re-matches #"^([A-Za-z0-9_.-]+)\$(\w+)__\d+$" (str class))] (let [match (re-matches #"^([A-Za-z0-9_.-]+)\$(\w+)__\d+$" (str class))]
(if (and match (= "invoke" method)) (if (and match (= "invoke" method))
(apply printf "%s/%s" (rest match)) (apply printf "%s/%s" (rest match))
(printf "%s.%s" class method)))) (printf "%s.%s" class method))))
(printf "(%s:%d)" (or (.getFileName e) "") (.getLineNumber e))) (printf "(%s:%d)" (or (.getFileName e) "") (.getLineNumber e)))
(print-explain [explain] (print-explain [explain]
(print " xp: ") (print " xp: ")
(let [[line & lines] (str/lines explain)] (let [[line & lines] (str/lines explain)]
(print line) (print line)
(newline) (newline)
(doseq [line lines] (doseq [line lines]
(println " " line)))) (println " " line))))
(print-data [data] (print-data [data]
(when (seq data) (when (seq data)
(print " dt: ") (print " dt: ")
(let [[line & lines] (str/lines (pp/pprint-str data :level data-level :length data-length))] (let [[line & lines] (str/lines (pp/pprint-str data :level data-level :length data-length))]
(print line) (print line)
(newline) (newline)
(doseq [line lines] (doseq [line lines]
(println " " line))))) (println " " line)))))
(print-trace-title [^Throwable cause] (print-trace-title [^Throwable cause]
(print " → ") (print " → ")
(printf "%s: %s" (.getName (class cause)) (printf "%s: %s" (.getName (class cause))
(-> (ex-message cause) (-> (ex-message cause)
(str/lines) (str/lines)
(first) (first)
(str/prune 130))) (str/prune 130)))
(when-let [^StackTraceElement e (first (.getStackTrace ^Throwable cause))] (when-let [^StackTraceElement e (first (.getStackTrace ^Throwable cause))]
(printf " (%s:%d)" (or (.getFileName e) "") (.getLineNumber e))) (printf " (%s:%d)" (or (.getFileName e) "") (.getLineNumber e)))
(newline)) (newline))
(print-summary [^Throwable cause] (print-summary [^Throwable cause]
(let [causes (loop [cause (ex-cause cause) (let [causes (loop [cause (ex-cause cause)
result []] result []]
(if cause (if cause
(recur (ex-cause cause) (recur (ex-cause cause)
(conj result cause)) (conj result cause))
result))] result))]
(when header? (when header?
(println "SUMMARY:")) (println "SUMMARY:"))
(print-trace-title cause) (print-trace-title cause)
(doseq [cause causes] (doseq [cause causes]
(print-trace-title cause)))) (print-trace-title cause))))
(print-trace [^Throwable cause] (print-trace [^Throwable cause]
(print-trace-title cause) (print-trace-title cause)
(let [st (.getStackTrace cause)] (let [st (.getStackTrace cause)]
(print " at: ") (print " at: ")
(if-let [e (first st)] (if-let [e (first st)]
(print-trace-element e) (print-trace-element e)
(print "[empty stack trace]")) (print "[empty stack trace]"))
(newline) (newline)
(doseq [e (if (nil? trace-length) (rest st) (take (dec trace-length) (rest st)))] (doseq [e (if (nil? trace-length) (rest st) (take (dec trace-length) (rest st)))]
(print " ") (print " ")
(print-trace-element e) (print-trace-element e)
(newline)))) (newline))))
(print-detail [^Throwable cause] (print-detail [^Throwable cause]
(print-trace cause) (print-trace cause)
(when-let [data (ex-data cause)] (when-let [data (ex-data cause)]
(when data? (when data?
(print-data (dissoc data ::s/problems ::s/spec ::s/value ::sm/explain))) (print-data (dissoc data ::s/problems ::s/spec ::s/value ::sm/explain)))
(when explain? (when explain?
(if-let [explain (explain data {:length data-length :level data-level})] (if-let [explain (explain data {:length data-length :level data-level})]
(print-explain explain))))) (print-explain explain)))))
(print-all [^Throwable cause] (print-all [^Throwable cause]
(when summary? (when summary?
(print-summary cause)) (print-summary cause))
(when detail? (when detail?
(when header? (when header?
(println "DETAIL:")) (println "DETAIL:"))
(print-detail cause) (print-detail cause)
(when chain? (when chain?
(loop [cause cause] (loop [cause cause]
(when-let [cause (ex-cause cause)] (when-let [cause (ex-cause cause)]
(newline) (newline)
(print-detail cause) (print-detail cause)
(recur cause)))))) (recur cause))))))]
]
(with-out-str (with-out-str
(print-all cause))))) (print-all cause)))))
#?(:clj #?(:clj
(defn print-throwable (defn print-throwable
[cause & {:as opts}] [cause & {:as opts}]
(println (format-throwable cause opts)))) (println (format-throwable cause opts))))

View file

@ -814,8 +814,8 @@
(defn- parents-frames (defn- parents-frames
"Go trough the parents and get all of them that are a frame." "Go trough the parents and get all of them that are a frame."
[id objects] [id objects]
(->> (cfh/get-parents-with-self objects id) (->> (cfh/get-parents-with-self objects id)
(filter cfh/frame-shape?))) (filter cfh/frame-shape?)))
(defmulti frames-changed (fn [_ change] (:type change))) (defmulti frames-changed (fn [_ change] (:type change)))

View file

@ -58,8 +58,8 @@
(defn set-undo-group (defn set-undo-group
[changes undo-group] [changes undo-group]
(cond-> changes (cond-> changes
(some? undo-group) (some? undo-group)
(assoc :undo-group undo-group))) (assoc :undo-group undo-group)))
(defn with-page (defn with-page
[changes page] [changes page]
@ -166,12 +166,12 @@
new-changes (if (< index (count redo-changes)) new-changes (if (< index (count redo-changes))
(->> (subvec (:redo-changes changes) index) (->> (subvec (:redo-changes changes) index)
(map #(-> % (map #(-> %
(assoc :page-id uuid/zero) (assoc :page-id uuid/zero)
(dissoc :component-id)))) (dissoc :component-id))))
[]) [])
new-file-data (cfc/process-changes file-data new-changes)] new-file-data (cfc/process-changes file-data new-changes)]
(vary-meta changes assoc ::file-data new-file-data (vary-meta changes assoc ::file-data new-file-data
::applied-changes-count (count redo-changes))) ::applied-changes-count (count redo-changes)))
changes)) changes))
;; Page changes ;; Page changes
@ -224,9 +224,9 @@
:option option-key :option option-key
:value option-val}) :value option-val})
(update :undo-changes conj {:type :set-option (update :undo-changes conj {:type :set-option
:page-id page-id :page-id page-id
:option option-key :option option-key
:value old-val}) :value old-val})
(apply-changes-local)))) (apply-changes-local))))
(defn update-page-option (defn update-page-option
@ -243,9 +243,9 @@
:option option-key :option option-key
:value new-val}) :value new-val})
(update :undo-changes conj {:type :set-option (update :undo-changes conj {:type :set-option
:page-id page-id :page-id page-id
:option option-key :option option-key
:value old-val}) :value old-val})
(apply-changes-local)))) (apply-changes-local))))
;; Shape tree changes ;; Shape tree changes
@ -292,7 +292,7 @@
(-> changes (-> changes
(update :redo-changes conj add-change) (update :redo-changes conj add-change)
(cond-> (cond->
(and (ctk/in-component-copy? parent) (not ignore-touched)) (and (ctk/in-component-copy? parent) (not ignore-touched))
(update :undo-changes conj restore-touched-change)) (update :undo-changes conj restore-touched-change))
(update :undo-changes conj del-change) (update :undo-changes conj del-change)
(apply-changes-local))))) (apply-changes-local)))))
@ -333,13 +333,13 @@
mk-undo-change mk-undo-change
(fn [undo-changes shape] (fn [undo-changes shape]
(let [prev-sibling (cfh/get-prev-sibling objects (:id shape))] (let [prev-sibling (cfh/get-prev-sibling objects (:id shape))]
(conj undo-changes (conj undo-changes
{:type :mov-objects {:type :mov-objects
:page-id (::page-id (meta changes)) :page-id (::page-id (meta changes))
:parent-id (:parent-id shape) :parent-id (:parent-id shape)
:shapes [(:id shape)] :shapes [(:id shape)]
:after-shape prev-sibling :after-shape prev-sibling
:index 0}))) ; index is used in case there is no after-shape (moving bottom shapes) :index 0}))) ; index is used in case there is no after-shape (moving bottom shapes)
restore-touched-change restore-touched-change
{:type :mod-obj {:type :mod-obj
@ -351,7 +351,7 @@
(-> changes (-> changes
(update :redo-changes conj set-parent-change) (update :redo-changes conj set-parent-change)
(cond-> (cond->
(ctk/in-component-copy? parent) (ctk/in-component-copy? parent)
(update :undo-changes conj restore-touched-change)) (update :undo-changes conj restore-touched-change))
(update :undo-changes #(reduce mk-undo-change % shapes)) (update :undo-changes #(reduce mk-undo-change % shapes))
(apply-changes-local))))) (apply-changes-local)))))
@ -501,10 +501,10 @@
objects (lookup-objects changes) objects (lookup-objects changes)
xform (comp xform (comp
(mapcat #(cons % (cfh/get-parent-ids objects %))) (mapcat #(cons % (cfh/get-parent-ids objects %)))
(map (d/getf objects)) (map (d/getf objects))
(filter #(contains? #{:group :bool} (:type %))) (filter #(contains? #{:group :bool} (:type %)))
(distinct)) (distinct))
all-parents (sequence xform ids) all-parents (sequence xform ids)
generate-operation generate-operation
@ -661,59 +661,59 @@
([changes id path name new-shapes updated-shapes main-instance-id main-instance-page] ([changes id path name new-shapes updated-shapes main-instance-id main-instance-page]
(add-component changes id path name new-shapes updated-shapes main-instance-id main-instance-page nil)) (add-component changes id path name new-shapes updated-shapes main-instance-id main-instance-page nil))
([changes id path name new-shapes updated-shapes main-instance-id main-instance-page annotation] ([changes id path name new-shapes updated-shapes main-instance-id main-instance-page annotation]
(assert-page-id! changes) (assert-page-id! changes)
(assert-objects! changes) (assert-objects! changes)
(let [page-id (::page-id (meta changes)) (let [page-id (::page-id (meta changes))
objects (lookup-objects changes) objects (lookup-objects changes)
lookupf (d/getf objects) lookupf (d/getf objects)
mk-change (fn [shape] mk-change (fn [shape]
{:type :mod-obj {:type :mod-obj
:page-id page-id :page-id page-id
:id (:id shape) :id (:id shape)
:operations [{:type :set :operations [{:type :set
:attr :component-id :attr :component-id
:val (:component-id shape)} :val (:component-id shape)}
{:type :set {:type :set
:attr :component-file :attr :component-file
:val (:component-file shape)} :val (:component-file shape)}
{:type :set {:type :set
:attr :component-root :attr :component-root
:val (:component-root shape)} :val (:component-root shape)}
{:type :set {:type :set
:attr :main-instance :attr :main-instance
:val (:main-instance shape)} :val (:main-instance shape)}
{:type :set {:type :set
:attr :shape-ref :attr :shape-ref
:val (:shape-ref shape)} :val (:shape-ref shape)}
{:type :set {:type :set
:attr :touched :attr :touched
:val (:touched shape)}]}) ] :val (:touched shape)}]})]
(-> changes (-> changes
(update :redo-changes (update :redo-changes
(fn [redo-changes] (fn [redo-changes]
(-> redo-changes (-> redo-changes
(conj (cond-> {:type :add-component (conj (cond-> {:type :add-component
:id id :id id
:path path :path path
:name name :name name
:main-instance-id main-instance-id :main-instance-id main-instance-id
:main-instance-page main-instance-page :main-instance-page main-instance-page
:annotation annotation} :annotation annotation}
(some? new-shapes) ;; this will be null in components-v2 (some? new-shapes) ;; this will be null in components-v2
(assoc :shapes (vec new-shapes)))) (assoc :shapes (vec new-shapes))))
(into (map mk-change) updated-shapes)))) (into (map mk-change) updated-shapes))))
(update :undo-changes (update :undo-changes
(fn [undo-changes] (fn [undo-changes]
(-> undo-changes (-> undo-changes
(conj {:type :del-component (conj {:type :del-component
:id id :id id
:skip-undelete? true}) :skip-undelete? true})
(into (comp (map :id) (into (comp (map :id)
(map lookupf) (map lookupf)
(map mk-change)) (map mk-change))
updated-shapes)))) updated-shapes))))
(apply-changes-local))))) (apply-changes-local)))))
(defn update-component (defn update-component
[changes id update-fn] [changes id update-fn]
@ -748,7 +748,7 @@
(update :redo-changes conj {:type :del-component (update :redo-changes conj {:type :del-component
:id id}) :id id})
(update :undo-changes conj {:type :restore-component (update :undo-changes conj {:type :restore-component
:id id}))) :id id})))
(defn restore-component (defn restore-component
([changes id] ([changes id]
@ -760,7 +760,7 @@
:id id :id id
:page-id page-id}) :page-id page-id})
(update :undo-changes conj {:type :del-component (update :undo-changes conj {:type :del-component
:id id})))) :id id}))))
(defn ignore-remote (defn ignore-remote
[changes] [changes]

View file

@ -603,7 +603,7 @@
(defn last-path (defn last-path
"Returns the last item of the path." "Returns the last item of the path."
[path] [path]
(last (split-path path))) (last (split-path path)))
(defn compact-name (defn compact-name
"Append the first item of the path and the name." "Append the first item of the path and the name."

View file

@ -621,13 +621,13 @@
(defmethod migrate 33 (defmethod migrate 33
[data] [data]
(letfn [(update-object [object] (letfn [(update-object [object]
; Ensure all root objects are well formed shapes. ;; Ensure all root objects are well formed shapes.
(if (= (:id object) uuid/zero) (if (= (:id object) uuid/zero)
(-> object (-> object
(assoc :parent-id uuid/zero (assoc :parent-id uuid/zero
:frame-id uuid/zero) :frame-id uuid/zero)
(cts/setup-shape)) (cts/setup-shape))
object)) object))
(update-container [container] (update-container [container]
(update container :objects update-vals update-object))] (update container :objects update-vals update-object))]

View file

@ -400,10 +400,10 @@
; Convert the shape in a frame. ; Convert the shape in a frame.
(log/debug :hint " -> set :type :frame") (log/debug :hint " -> set :type :frame")
(assoc shape :type :frame (assoc shape :type :frame
:fills [] :fills []
:hide-in-viewer true :hide-in-viewer true
:rx 0 :rx 0
:ry 0))] :ry 0))]
(log/dbg :hint "repairing shape :instance-head-not-frame" :id (:id shape) :name (:name shape) :page-id page-id) (log/dbg :hint "repairing shape :instance-head-not-frame" :id (:id shape) :name (:name shape) :page-id page-id)
(-> (pcb/empty-changes nil page-id) (-> (pcb/empty-changes nil page-id)

View file

@ -46,8 +46,8 @@
:y (:y wrapper-rect)}) :y (:y wrapper-rect)})
:vtop (let [top (:y rect)] :vtop (let [top (:y rect)]
{:x (:x wrapper-rect) {:x (:x wrapper-rect)
:y top}) :y top})
:vcenter (let [center (+ (:y rect) (/ (:height rect) 2))] :vcenter (let [center (+ (:y rect) (/ (:height rect) 2))]
{:x (:x wrapper-rect) {:x (:x wrapper-rect)

View file

@ -6,9 +6,9 @@
(ns app.common.geom.matrix (ns app.common.geom.matrix
(:require (:require
#?(:clj [app.common.fressian :as fres])
#?(:cljs [cljs.pprint :as pp] #?(:cljs [cljs.pprint :as pp]
:clj [clojure.pprint :as pp]) :clj [clojure.pprint :as pp])
#?(:clj [app.common.fressian :as fres])
[app.common.data :as d] [app.common.data :as d]
[app.common.data.macros :as dm] [app.common.data.macros :as dm]
[app.common.geom.point :as gpt] [app.common.geom.point :as gpt]
@ -100,7 +100,7 @@
(sg/small-double) (sg/small-double)
(sg/small-double) (sg/small-double)
(sg/small-double) (sg/small-double)
(sg/small-double) ) (sg/small-double))
(sg/fmap #(apply pos->Matrix %))) (sg/fmap #(apply pos->Matrix %)))
::oapi/type "string" ::oapi/type "string"
::oapi/format "matrix" ::oapi/format "matrix"
@ -248,8 +248,8 @@
([pt] ([pt]
(dm/assert! (gpt/point? pt)) (dm/assert! (gpt/point? pt))
(pos->Matrix 1 0 0 1 (pos->Matrix 1 0 0 1
(- (dm/get-prop pt :x)) (- (dm/get-prop pt :x))
(- (dm/get-prop pt :y)))) (- (dm/get-prop pt :y))))
([x y] ([x y]
(pos->Matrix 1 0 0 1 (- x) (- y)))) (pos->Matrix 1 0 0 1 (- x) (- y))))

View file

@ -7,11 +7,11 @@
(ns app.common.geom.point (ns app.common.geom.point
(:refer-clojure :exclude [divide min max abs]) (:refer-clojure :exclude [divide min max abs])
(:require (:require
#?(:cljs [cljs.pprint :as pp] #?(:clj [app.common.fressian :as fres])
:clj [clojure.pprint :as pp])
#?(:cljs [cljs.core :as c] #?(:cljs [cljs.core :as c]
:clj [clojure.core :as c]) :clj [clojure.core :as c])
#?(:clj [app.common.fressian :as fres]) #?(:cljs [cljs.pprint :as pp]
:clj [clojure.pprint :as pp])
[app.common.data :as d] [app.common.data :as d]
[app.common.data.macros :as dm] [app.common.data.macros :as dm]
[app.common.exceptions :as ex] [app.common.exceptions :as ex]

View file

@ -363,9 +363,9 @@
(cond-> bounds (cond-> bounds
(> target-height height) (> target-height height)
(-> (assoc :height target-height) (-> (assoc :height target-height)
(update :y - (/ (- target-height height ) 2))) (update :y - (/ (- target-height height) 2)))
(< target-height height) (< target-height height)
(-> (assoc :width target-width) (-> (assoc :width target-width)
(update :x - (/ (- target-width width ) 2))))) (update :x - (/ (- target-width width) 2)))))
bounds)) bounds))

View file

@ -171,9 +171,9 @@
layout-gap-row layout-gap-row
0) 0)
col-pad (if (or(and row? space-evenly?) col-pad (if (or (and row? space-evenly?)
(and row? space-around?) (and row? space-around?)
(and col? content-evenly?)) (and col? content-evenly?))
layout-gap-col layout-gap-col
0) 0)

View file

@ -30,7 +30,7 @@
(<= (+ b-y b-height) (+ a-y a-height)))) (<= (+ b-y b-height) (+ a-y a-height))))
(defn intersects? (defn intersects?
[[a-x a-y a-width a-height ] [[a-x a-y a-width a-height]
[b-x b-y b-width b-height]] [b-x b-y b-width b-height]]
(not (or (<= (+ b-x b-width) a-x) (not (or (<= (+ b-x b-width) a-x)
(<= (+ b-y b-height) a-y) (<= (+ b-y b-height) a-y)
@ -76,11 +76,9 @@
y2 (min ra-y rb-y) y2 (min ra-y rb-y)
height (- y2 y1) height (- y2 y1)
rb-x (+ b-x b-width) rb-x (+ b-x b-width)
width (- a-width (- rb-x a-x)) width (- a-width (- rb-x a-x))]
]
(when (and (> width 0) (> height 0)) (when (and (> width 0) (> height 0))
(make-area rb-x y1 width height))) (make-area rb-x y1 width height))))
)
(defn difference (defn difference
[area-a area-b] [area-a area-b]
@ -92,4 +90,4 @@
(into [] (into []
(keep #(% area-a area-b)) (keep #(% area-a area-b))
[top-rect left-rect right-rect bottom-rect]))) [top-rect left-rect right-rect bottom-rect])))

View file

@ -30,13 +30,13 @@
(let [parent-id (:id parent) (let [parent-id (:id parent)
parent-bounds @(get bounds parent-id) parent-bounds @(get bounds parent-id)
{pad-top :p1 pad-right :p2 pad-bottom :p3 pad-left :p4} layout-padding {pad-top :p1 pad-right :p2 pad-bottom :p3 pad-left :p4} layout-padding
pad-top (or pad-top 0) pad-top (or pad-top 0)
pad-right (or pad-right 0) pad-right (or pad-right 0)
pad-bottom (or pad-bottom 0) pad-bottom (or pad-bottom 0)
pad-left (or pad-left 0) pad-left (or pad-left 0)
layout-points (layout-content-points bounds parent layout-data)] layout-points (layout-content-points bounds parent layout-data)]
(if (d/not-empty? layout-points) (if (d/not-empty? layout-points)

View file

@ -82,7 +82,7 @@
(let [[size max-size] (let [[size max-size]
(case type (case type
:percent :percent
(let [value (/ (* total-value value) 100) ] (let [value (/ (* total-value value) 100)]
[value value]) [value value])
:fixed :fixed
@ -190,7 +190,7 @@
;; Apply assign-fr to the track-list ;; Apply assign-fr to the track-list
track-list track-list
(reduce (reduce
(fn [track-list [idx assignment] ] (fn [track-list [idx assignment]]
(-> track-list (-> track-list
(update-in [idx :size] max assignment))) (update-in [idx :size] max assignment)))
track-list track-list

View file

@ -54,13 +54,13 @@
current-range nil] current-range nil]
(if pending (if pending
(let [[next-shape rect :as next-shape+rects] (first pending)] (let [[next-shape rect :as next-shape+rects] (first pending)]
(if (or (not current-range) (overlaps-range? axis current-range rect)) (if (or (not current-range) (overlaps-range? axis current-range rect))
;; Add shape to current row ;; Add shape to current row
(let [current-track (conj current-track (:id next-shape)) (let [current-track (conj current-track (:id next-shape))
current-range (join-range axis current-range rect)] current-range (join-range axis current-range rect)]
(recur (next pending) result index current-track current-range)) (recur (next pending) result index current-track current-range))
;; New row ;; New row
(recur (next pending) (recur (next pending)
(conj result {:index index (conj result {:index index

View file

@ -176,7 +176,7 @@
[shape rect include-content?] [shape rect include-content?]
(when (d/not-empty? (:content shape)) (when (d/not-empty? (:content shape))
(let [ ;; If paths are too complex the intersection is too expensive (let [;; If paths are too complex the intersection is too expensive
;; we fallback to check its bounding box otherwise the performance penalty ;; we fallback to check its bounding box otherwise the performance penalty
;; is too big ;; is too big
;; TODO: Look for ways to optimize this operation ;; TODO: Look for ways to optimize this operation
@ -190,10 +190,10 @@
start-point (-> shape :content (first) :params (gpt/point))] start-point (-> shape :content (first) :params (gpt/point))]
(or (intersects-lines? rect-lines path-lines) (or (intersects-lines? rect-lines path-lines)
(if include-content? (if include-content?
(or (is-point-inside-nonzero? (first rect-points) path-lines) (or (is-point-inside-nonzero? (first rect-points) path-lines)
(is-point-inside-nonzero? start-point rect-lines)) (is-point-inside-nonzero? start-point rect-lines))
false))))) false)))))
(defn is-point-inside-ellipse? (defn is-point-inside-ellipse?
"checks if a point is inside an ellipse" "checks if a point is inside an ellipse"

View file

@ -25,8 +25,8 @@
(and strict? (ctl/fill-width? child) (ctl/flex-layout? child)) (and strict? (ctl/fill-width? child) (ctl/flex-layout? child))
(let [children (cfh/get-immediate-children objects (dm/get-prop child :id) {:remove-hidden true})] (let [children (cfh/get-immediate-children objects (dm/get-prop child :id) {:remove-hidden true})]
(max (ctl/child-min-width child) (max (ctl/child-min-width child)
(gpo/width-points (fb/layout-content-bounds bounds child children objects)))) (gpo/width-points (fb/layout-content-bounds bounds child children objects))))
(and (ctl/fill-width? child) (and (ctl/fill-width? child)
(ctl/grid-layout? child)) (ctl/grid-layout? child))

View file

@ -477,8 +477,7 @@
result) result)
last-start (if (= :move-to command) last-start (if (= :move-to command)
point point
last-start) last-start)]
]
(recur (first pending) (recur (first pending)
(rest pending) (rest pending)
result result
@ -523,7 +522,7 @@
"Point on line" "Point on line"
[position from-p to-p] [position from-p to-p]
(let [e1 (gpt/to-vec from-p to-p ) (let [e1 (gpt/to-vec from-p to-p)
e2 (gpt/to-vec from-p position) e2 (gpt/to-vec from-p position)
len2 (+ (mth/sq (:x e1)) (mth/sq (:y e1))) len2 (+ (mth/sq (:x e1)) (mth/sq (:y e1)))
@ -730,7 +729,7 @@
ray-t (get-line-tval ray-line curve-v)] ray-t (get-line-tval ray-line curve-v)]
(and (> ray-t 0) (and (> ray-t 0)
(> (mth/abs (- curve-tg-angle 180)) 0.01) (> (mth/abs (- curve-tg-angle 180)) 0.01)
(> (mth/abs (- curve-tg-angle 0)) 0.01)) )))] (> (mth/abs (- curve-tg-angle 0)) 0.01)))))]
(->> curve-ts (->> curve-ts
(mapv #(vector (curve-values curve %) (mapv #(vector (curve-values curve %)
(curve-windup curve %)))))) (curve-windup curve %))))))

View file

@ -74,7 +74,7 @@
points points
(if has-resize? (if has-resize?
(-> (:points shape) (-> (:points shape)
(gco/transform-points (ctm/modifiers->transform modifiers)) ) (gco/transform-points (ctm/modifiers->transform modifiers)))
points)] points)]
[modifiers points])] [modifiers points])]
(position-pixel-precision modifiers shape points precision ignore-axis))) (position-pixel-precision modifiers shape points precision ignore-axis)))

View file

@ -6,6 +6,6 @@
(defn update-strokes-width (defn update-strokes-width
[shape scale] [shape scale]
(update shape :strokes (update shape :strokes
(fn [strokes] (fn [strokes]
(mapv #(update-stroke-width % scale) strokes)))) (mapv #(update-stroke-width % scale) strokes))))

View file

@ -61,8 +61,8 @@
dy (dm/get-prop delta :y)] dy (dm/get-prop delta :y)]
(if (d/num? dx dy) (if (d/num? dx dy)
(mapv #(-> % (mapv #(-> %
(update :x + dx) (update :x + dx)
(update :y + dy)) (update :y + dy))
position-data) position-data)
position-data)))) position-data))))
@ -162,8 +162,8 @@
(-> (gmt/matrix) (-> (gmt/matrix)
(gmt/translate center) (gmt/translate center)
(cond-> (cond->
flip-x (gmt/scale (gpt/point -1 1)) flip-x (gmt/scale (gpt/point -1 1))
flip-y (gmt/scale (gpt/point 1 -1))) flip-y (gmt/scale (gpt/point 1 -1)))
(gmt/multiply (:transform-inverse shape (gmt/matrix))) (gmt/multiply (:transform-inverse shape (gmt/matrix)))
(gmt/translate (gpt/negate center))))) (gmt/translate (gpt/negate center)))))
@ -207,24 +207,24 @@
mb7 (/ (- x2 x1) det) mb7 (/ (- x2 x1) det)
mb8 (/ (- (* x1 y1) (* x2 y1)) det)] mb8 (/ (- (* x1 y1) (* x2 y1)) det)]
(gmt/matrix (+ (* ma0 mb0) (gmt/matrix (+ (* ma0 mb0)
(* ma1 mb3) (* ma1 mb3)
(* ma2 mb6)) (* ma2 mb6))
(+ (* ma3 mb0) (+ (* ma3 mb0)
(* ma4 mb3) (* ma4 mb3)
(* ma5 mb6)) (* ma5 mb6))
(+ (* ma0 mb1) (+ (* ma0 mb1)
(* ma1 mb4) (* ma1 mb4)
(* ma2 mb7)) (* ma2 mb7))
(+ (* ma3 mb1) (+ (* ma3 mb1)
(* ma4 mb4) (* ma4 mb4)
(* ma5 mb7)) (* ma5 mb7))
(+ (* ma0 mb2) (+ (* ma0 mb2)
(* ma1 mb5) (* ma1 mb5)
(* ma2 mb8)) (* ma2 mb8))
(+ (* ma3 mb2) (+ (* ma3 mb2)
(* ma4 mb5) (* ma4 mb5)
(* ma5 mb8))))))) (* ma5 mb8)))))))
(defn calculate-selrect (defn calculate-selrect
[points center] [points center]

View file

@ -239,7 +239,7 @@
#?(:clj #?(:clj
(defn slf4j-log-handler (defn slf4j-log-handler
{:no-doc true} {:no-doc true}
[_ _ _ {:keys [::logger ::level ::trace ::message] }] [_ _ _ {:keys [::logger ::level ::trace ::message]}]
(when-let [logger (enabled? logger level)] (when-let [logger (enabled? logger level)]
(let [message (cond-> @message (let [message (cond-> @message
(some? trace) (some? trace)
@ -312,8 +312,8 @@
(let [cljs? (:ns &env)] (let [cljs? (:ns &env)]
`(do `(do
(~(if cljs? (~(if cljs?
`(partial console-log-handler nil nil nil) `(partial console-log-handler nil nil nil)
`(partial slf4j-log-handler nil nil nil)) `(partial slf4j-log-handler nil nil nil))
{::logger ~(str *ns*) {::logger ~(str *ns*)
::level ~level ::level ~level
::message (delay ~message)}) ::message (delay ~message)})

View file

@ -44,11 +44,11 @@
"Determine a scale factor and unit for displaying a time." "Determine a scale factor and unit for displaying a time."
[measurement] [measurement]
(cond (cond
(> measurement 60) [(/ 60) "min"] (> measurement 60) [(/ 60) "min"]
(< measurement 1e-6) [1e9 "ns"] (< measurement 1e-6) [1e9 "ns"]
(< measurement 1e-3) [1e6 "µs"] (< measurement 1e-3) [1e6 "µs"]
(< measurement 1) [1e3 "ms"] (< measurement 1) [1e3 "ms"]
:else [1 "sec"])) :else [1 "sec"]))
(defn format-time (defn format-time
[value] [value]

View file

@ -51,52 +51,52 @@
['cljs.core/IRecord ['cljs.core/IRecord
'cljs.core/ICloneable 'cljs.core/ICloneable
`(~'-clone [~this-sym] `(~'-clone [~this-sym]
(new ~tagname ~@(generate-field-access this-sym val-sym fields))) (new ~tagname ~@(generate-field-access this-sym val-sym fields)))
'cljs.core/IHash 'cljs.core/IHash
`(~'-hash [~this-sym] `(~'-hash [~this-sym]
(caching-hash ~this-sym (caching-hash ~this-sym
(fn [coll#] (fn [coll#]
(bit-xor (bit-xor
~(hash (str tagname)) ~(hash (str tagname))
(cljs.core/hash-unordered-coll coll#))) (cljs.core/hash-unordered-coll coll#)))
(. ~this-sym ~'-$hash))) (. ~this-sym ~'-$hash)))
'cljs.core/IEquiv 'cljs.core/IEquiv
`(~'-equiv [~this-sym ~othr-sym] `(~'-equiv [~this-sym ~othr-sym]
(or (identical? ~this-sym ~othr-sym) (or (identical? ~this-sym ~othr-sym)
(and (some? ~othr-sym) (and (some? ~othr-sym)
(identical? (.-constructor ~this-sym) (identical? (.-constructor ~this-sym)
(.-constructor ~othr-sym)) (.-constructor ~othr-sym))
~@(map (fn [field] ~@(map (fn [field]
`(= (.. ~this-sym ~(property-symbol field)) `(= (.. ~this-sym ~(property-symbol field))
(.. ~(with-meta othr-sym {:tag tagname}) ~(property-symbol field)))) (.. ~(with-meta othr-sym {:tag tagname}) ~(property-symbol field))))
base-fields) base-fields)
(= (. ~this-sym ~'-$extmap) (= (. ~this-sym ~'-$extmap)
(. ~(with-meta othr-sym {:tag tagname}) ~'-$extmap))))) (. ~(with-meta othr-sym {:tag tagname}) ~'-$extmap)))))
`ICustomRecordEquiv `ICustomRecordEquiv
`(~'-equiv-with-exceptions [~this-sym ~othr-sym ~'exceptions] `(~'-equiv-with-exceptions [~this-sym ~othr-sym ~'exceptions]
(or (identical? ~this-sym ~othr-sym) (or (identical? ~this-sym ~othr-sym)
(and (some? ~othr-sym) (and (some? ~othr-sym)
(identical? (.-constructor ~this-sym) (identical? (.-constructor ~this-sym)
(.-constructor ~othr-sym)) (.-constructor ~othr-sym))
(and ~@(->> base-fields (and ~@(->> base-fields
(map (fn [field] (map (fn [field]
`(= (.. ~this-sym ~(property-symbol field)) `(= (.. ~this-sym ~(property-symbol field))
(.. ~(with-meta othr-sym {:tag tagname}) ~(property-symbol field)))))) (.. ~(with-meta othr-sym {:tag tagname}) ~(property-symbol field))))))
(== (count (. ~this-sym ~'-$extmap)) (== (count (. ~this-sym ~'-$extmap))
(count (. ~othr-sym ~'-$extmap)))) (count (. ~othr-sym ~'-$extmap))))
(reduce-kv (fn [~'_ ~'k ~'v] (reduce-kv (fn [~'_ ~'k ~'v]
(if (contains? ~'exceptions ~'k) (if (contains? ~'exceptions ~'k)
true true
(if (= (get (. ~this-sym ~'-$extmap) ~'k ::not-exists) ~'v) (if (= (get (. ~this-sym ~'-$extmap) ~'k ::not-exists) ~'v)
true true
(reduced false)))) (reduced false))))
true true
(. ~othr-sym ~'-$extmap))))) (. ~othr-sym ~'-$extmap)))))
'cljs.core/IMeta 'cljs.core/IMeta
@ -104,98 +104,98 @@
'cljs.core/IWithMeta 'cljs.core/IWithMeta
`(~'-with-meta [~this-sym ~val-sym] `(~'-with-meta [~this-sym ~val-sym]
(new ~tagname ~@(->> (replace {'$meta val-sym} fields) (new ~tagname ~@(->> (replace {'$meta val-sym} fields)
(generate-field-access this-sym val-sym)))) (generate-field-access this-sym val-sym))))
'cljs.core/ILookup 'cljs.core/ILookup
`(~'-lookup [~this-sym k#] `(~'-lookup [~this-sym k#]
(cljs.core/-lookup ~this-sym k# nil)) (cljs.core/-lookup ~this-sym k# nil))
`(~'-lookup [~this-sym ~key-sym else#] `(~'-lookup [~this-sym ~key-sym else#]
(case ~key-sym (case ~key-sym
~@(mapcat (fn [f] [(keyword f) `(. ~this-sym ~(property-symbol f))]) ~@(mapcat (fn [f] [(keyword f) `(. ~this-sym ~(property-symbol f))])
base-fields) base-fields)
(cljs.core/get (. ~this-sym ~'-$extmap) ~key-sym else#))) (cljs.core/get (. ~this-sym ~'-$extmap) ~key-sym else#)))
'cljs.core/ICounted 'cljs.core/ICounted
`(~'-count [~this-sym] `(~'-count [~this-sym]
(+ ~(count base-fields) (count (. ~this-sym ~'-$extmap)))) (+ ~(count base-fields) (count (. ~this-sym ~'-$extmap))))
'cljs.core/ICollection 'cljs.core/ICollection
`(~'-conj [~this-sym ~val-sym] `(~'-conj [~this-sym ~val-sym]
(if (vector? ~val-sym) (if (vector? ~val-sym)
(cljs.core/-assoc ~this-sym (cljs.core/-nth ~val-sym 0) (cljs.core/-nth ~val-sym 1)) (cljs.core/-assoc ~this-sym (cljs.core/-nth ~val-sym 0) (cljs.core/-nth ~val-sym 1))
(reduce cljs.core/-conj ~this-sym ~val-sym))) (reduce cljs.core/-conj ~this-sym ~val-sym)))
'cljs.core/IAssociative 'cljs.core/IAssociative
`(~'-contains-key? [~this-sym ~key-sym] `(~'-contains-key? [~this-sym ~key-sym]
~(if (seq base-fields) ~(if (seq base-fields)
`(case ~key-sym `(case ~key-sym
(~@(map keyword base-fields)) true (~@(map keyword base-fields)) true
(contains? (. ~this-sym ~'-$extmap) ~key-sym)) (contains? (. ~this-sym ~'-$extmap) ~key-sym))
`(contains? (. ~this-sym ~'-$extmap) ~key-sym))) `(contains? (. ~this-sym ~'-$extmap) ~key-sym)))
`(~'-assoc [~this-sym ~key-sym ~val-sym] `(~'-assoc [~this-sym ~key-sym ~val-sym]
(case ~key-sym (case ~key-sym
~@(mapcat (fn [fld] ~@(mapcat (fn [fld]
[(keyword fld) `(new ~tagname ~@(->> (replace {fld val-sym '$hash nil} fields) [(keyword fld) `(new ~tagname ~@(->> (replace {fld val-sym '$hash nil} fields)
(generate-field-access this-sym val-sym)))]) (generate-field-access this-sym val-sym)))])
base-fields) base-fields)
(new ~tagname ~@(->> (remove #{'$extmap '$hash} fields) (new ~tagname ~@(->> (remove #{'$extmap '$hash} fields)
(generate-field-access this-sym val-sym)) (generate-field-access this-sym val-sym))
(assoc (. ~this-sym ~'-$extmap) ~key-sym ~val-sym) nil))) (assoc (. ~this-sym ~'-$extmap) ~key-sym ~val-sym) nil)))
'cljs.core/ITransientAssociative 'cljs.core/ITransientAssociative
`(~'-assoc! [~this-sym ~key-sym ~val-sym] `(~'-assoc! [~this-sym ~key-sym ~val-sym]
(let [key# (if (keyword? ~key-sym) (let [key# (if (keyword? ~key-sym)
(.-fqn ~(with-meta key-sym {:tag `cljs.core/Keyword})) (.-fqn ~(with-meta key-sym {:tag `cljs.core/Keyword}))
~key-sym)] ~key-sym)]
(case ~key-sym (case ~key-sym
~@(mapcat ~@(mapcat
(fn [f] (fn [f]
[(keyword f) `(set! (. ~this-sym ~(property-symbol f)) ~val-sym)]) [(keyword f) `(set! (. ~this-sym ~(property-symbol f)) ~val-sym)])
base-fields) base-fields)
(set! (. ~this-sym ~'-$extmap) (cljs.core/assoc (. ~this-sym ~'-$extmap) ~key-sym ~val-sym))) (set! (. ~this-sym ~'-$extmap) (cljs.core/assoc (. ~this-sym ~'-$extmap) ~key-sym ~val-sym)))
~this-sym)) ~this-sym))
'cljs.core/IMap 'cljs.core/IMap
`(~'-dissoc [~this-sym ~key-sym] `(~'-dissoc [~this-sym ~key-sym]
(case ~key-sym (case ~key-sym
(~@(map keyword base-fields)) (~@(map keyword base-fields))
(cljs.core/-assoc ~this-sym ~key-sym nil) (cljs.core/-assoc ~this-sym ~key-sym nil)
(let [extmap1# (. ~this-sym ~'-$extmap) (let [extmap1# (. ~this-sym ~'-$extmap)
extmap2# (dissoc extmap1# ~key-sym)] extmap2# (dissoc extmap1# ~key-sym)]
(if (identical? extmap1# extmap2#) (if (identical? extmap1# extmap2#)
~this-sym ~this-sym
(new ~tagname ~@(->> (remove #{'$extmap '$hash} fields) (new ~tagname ~@(->> (remove #{'$extmap '$hash} fields)
(generate-field-access this-sym val-sym)) (generate-field-access this-sym val-sym))
(not-empty extmap2#) (not-empty extmap2#)
nil))))) nil)))))
'cljs.core/ISeqable 'cljs.core/ISeqable
`(~'-seq [~this-sym] `(~'-seq [~this-sym]
(seq (concat [~@(map (fn [f] (seq (concat [~@(map (fn [f]
`(cljs.core/MapEntry. `(cljs.core/MapEntry.
~(keyword f) ~(keyword f)
(. ~this-sym ~(property-symbol f)) (. ~this-sym ~(property-symbol f))
nil)) nil))
base-fields)] base-fields)]
(. ~this-sym ~'-$extmap)))) (. ~this-sym ~'-$extmap))))
'cljs.core/IIterable 'cljs.core/IIterable
`(~'-iterator [~this-sym] `(~'-iterator [~this-sym]
(cljs.core/RecordIter. 0 ~this-sym ~(count base-fields) (cljs.core/RecordIter. 0 ~this-sym ~(count base-fields)
[~@(map keyword base-fields)] [~@(map keyword base-fields)]
(if (. ~this-sym ~'-$extmap) (if (. ~this-sym ~'-$extmap)
(cljs.core/-iterator (. ~this-sym ~'-$extmap)) (cljs.core/-iterator (. ~this-sym ~'-$extmap))
(cljs.core/nil-iter)))) (cljs.core/nil-iter))))
'cljs.core/IKVReduce 'cljs.core/IKVReduce
`(~'-kv-reduce [~this-sym f# init#] `(~'-kv-reduce [~this-sym f# init#]
(reduce (fn [ret# [~key-sym v#]] (f# ret# ~key-sym v#)) init# ~this-sym))]))) (reduce (fn [ret# [~key-sym v#]] (f# ret# ~key-sym v#)) init# ~this-sym))])))
#?(:clj #?(:clj
(defn emit-impl-jvm (defn emit-impl-jvm
@ -208,144 +208,143 @@
['clojure.lang.IRecord ['clojure.lang.IRecord
'clojure.lang.IPersistentMap 'clojure.lang.IPersistentMap
`(~'equiv [~this-sym ~val-sym] `(~'equiv [~this-sym ~val-sym]
(and (some? ~val-sym) (and (some? ~val-sym)
(instance? ~tagname ~val-sym) (instance? ~tagname ~val-sym)
~@(map (fn [field] ~@(map (fn [field]
`(= (.. ~this-sym ~(property-symbol field)) `(= (.. ~this-sym ~(property-symbol field))
(.. ~(with-meta val-sym {:tag tagname}) ~(property-symbol field)))) (.. ~(with-meta val-sym {:tag tagname}) ~(property-symbol field))))
base-fields) base-fields)
(= (. ~this-sym ~'-$extmap) (= (. ~this-sym ~'-$extmap)
(. ~(with-meta val-sym {:tag tagname}) ~'-$extmap)))) (. ~(with-meta val-sym {:tag tagname}) ~'-$extmap))))
`(~'entryAt [~this-sym ~key-sym] `(~'entryAt [~this-sym ~key-sym]
(let [v# (.valAt ~this-sym ~key-sym ::not-found)] (let [v# (.valAt ~this-sym ~key-sym ::not-found)]
(when (not= v# ::not-found) (when (not= v# ::not-found)
(clojure.lang.MapEntry. ~key-sym v#)))) (clojure.lang.MapEntry. ~key-sym v#))))
`(~'valAt [~this-sym ~key-sym] `(~'valAt [~this-sym ~key-sym]
(.valAt ~this-sym ~key-sym nil)) (.valAt ~this-sym ~key-sym nil))
`(~'valAt [~this-sym ~key-sym ~'not-found] `(~'valAt [~this-sym ~key-sym ~'not-found]
(case ~key-sym (case ~key-sym
~@(mapcat (fn [f] [(keyword f) `(. ~this-sym ~(property-symbol f))]) base-fields) ~@(mapcat (fn [f] [(keyword f) `(. ~this-sym ~(property-symbol f))]) base-fields)
(clojure.core/get (. ~this-sym ~'-$extmap) ~key-sym ~'not-found))) (clojure.core/get (. ~this-sym ~'-$extmap) ~key-sym ~'not-found)))
`(~'count [~this-sym] `(~'count [~this-sym]
(+ ~(count base-fields) (count (. ~this-sym ~'-$extmap)))) (+ ~(count base-fields) (count (. ~this-sym ~'-$extmap))))
`(~'empty [~this-sym] `(~'empty [~this-sym]
(new ~tagname ~@(->> (remove #{'$extmap '$hash} fields) (new ~tagname ~@(->> (remove #{'$extmap '$hash} fields)
(generate-field-access this-sym nil)) (generate-field-access this-sym nil))
nil nil)) nil nil))
`(~'cons [~this-sym ~val-sym] `(~'cons [~this-sym ~val-sym]
(if (instance? java.util.Map$Entry ~val-sym) (if (instance? java.util.Map$Entry ~val-sym)
(let [^Map$Entry e# ~val-sym] (let [^Map$Entry e# ~val-sym]
(.assoc ~this-sym (.getKey e#) (.getValue e#))) (.assoc ~this-sym (.getKey e#) (.getValue e#)))
(if (instance? clojure.lang.IPersistentVector ~val-sym) (if (instance? clojure.lang.IPersistentVector ~val-sym)
(if (= 2 (count ~val-sym)) (if (= 2 (count ~val-sym))
(.assoc ~this-sym (nth ~val-sym 0) (nth ~val-sym 1)) (.assoc ~this-sym (nth ~val-sym 0) (nth ~val-sym 1))
(throw (IllegalArgumentException. (throw (IllegalArgumentException.
"Vector arg to map conj must be a pair"))) "Vector arg to map conj must be a pair")))
(reduce (fn [^clojure.lang.IPersistentMap m# (reduce (fn [^clojure.lang.IPersistentMap m#
^java.util.Map$Entry e#] ^java.util.Map$Entry e#]
(.assoc m# (.getKey e#) (.getValue e#))) (.assoc m# (.getKey e#) (.getValue e#)))
~this-sym ~this-sym
~val-sym)))) ~val-sym))))
`(~'assoc [~this-sym ~key-sym ~val-sym] `(~'assoc [~this-sym ~key-sym ~val-sym]
(case ~key-sym (case ~key-sym
~@(mapcat (fn [fld] ~@(mapcat (fn [fld]
[(keyword fld) `(new ~tagname ~@(->> (replace {fld val-sym '$hash nil} fields) [(keyword fld) `(new ~tagname ~@(->> (replace {fld val-sym '$hash nil} fields)
(generate-field-access this-sym val-sym)))]) (generate-field-access this-sym val-sym)))])
base-fields) base-fields)
(new ~tagname ~@(->> (remove #{'$extmap '$hash} fields) (new ~tagname ~@(->> (remove #{'$extmap '$hash} fields)
(generate-field-access this-sym val-sym)) (generate-field-access this-sym val-sym))
(assoc (. ~this-sym ~'-$extmap) ~key-sym ~val-sym) (assoc (. ~this-sym ~'-$extmap) ~key-sym ~val-sym)
nil))) nil)))
`(~'without [~this-sym ~key-sym] `(~'without [~this-sym ~key-sym]
(case ~key-sym (case ~key-sym
(~@(map keyword base-fields)) (~@(map keyword base-fields))
(.assoc ~this-sym ~key-sym nil) (.assoc ~this-sym ~key-sym nil)
(if-let [extmap1# (. ~this-sym ~'-$extmap)] (if-let [extmap1# (. ~this-sym ~'-$extmap)]
(let [extmap2# (.without ^clojure.lang.IPersistentMap extmap1# ~key-sym)] (let [extmap2# (.without ^clojure.lang.IPersistentMap extmap1# ~key-sym)]
(if (identical? extmap1# extmap2#) (if (identical? extmap1# extmap2#)
~this-sym ~this-sym
(new ~tagname ~@(->> (remove #{'$extmap '$hash} fields) (new ~tagname ~@(->> (remove #{'$extmap '$hash} fields)
(generate-field-access this-sym val-sym)) (generate-field-access this-sym val-sym))
(not-empty extmap2#) (not-empty extmap2#)
nil))) nil)))
~this-sym))) ~this-sym)))
`(~'seq [~this-sym] `(~'seq [~this-sym]
(seq (concat [~@(map (fn [f] (seq (concat [~@(map (fn [f]
`(clojure.lang.MapEntry/create `(clojure.lang.MapEntry/create
~(keyword f) ~(keyword f)
(. ~this-sym ~(property-symbol f)))) (. ~this-sym ~(property-symbol f))))
base-fields)] base-fields)]
(. ~this-sym ~'-$extmap)))) (. ~this-sym ~'-$extmap))))
`(~'iterator [~this-sym] `(~'iterator [~this-sym]
(clojure.lang.SeqIterator. (.seq ~this-sym))) (clojure.lang.SeqIterator. (.seq ~this-sym)))
'clojure.lang.IFn 'clojure.lang.IFn
`(~'invoke [~this-sym ~key-sym] `(~'invoke [~this-sym ~key-sym]
(.valAt ~this-sym ~key-sym)) (.valAt ~this-sym ~key-sym))
`(~'invoke [~this-sym ~key-sym ~'not-found] `(~'invoke [~this-sym ~key-sym ~'not-found]
(.valAt ~this-sym ~key-sym ~'not-found)) (.valAt ~this-sym ~key-sym ~'not-found))
'java.util.Map 'java.util.Map
`(~'size [~this-sym] `(~'size [~this-sym]
(clojure.core/count ~this-sym)) (clojure.core/count ~this-sym))
`(~'containsKey [~this-sym ~key-sym] `(~'containsKey [~this-sym ~key-sym]
~(if (seq base-fields) ~(if (seq base-fields)
`(case ~key-sym `(case ~key-sym
(~@(map keyword base-fields)) true (~@(map keyword base-fields)) true
(contains? (. ~this-sym ~'-$extmap) ~key-sym)) (contains? (. ~this-sym ~'-$extmap) ~key-sym))
`(contains? (. ~this-sym ~'-$extmap) ~key-sym))) `(contains? (. ~this-sym ~'-$extmap) ~key-sym)))
`(~'isEmpty [~this-sym] `(~'isEmpty [~this-sym]
(zero? (count ~this-sym))) (zero? (count ~this-sym)))
`(~'keySet [~this-sym] `(~'keySet [~this-sym]
(throw (UnsupportedOperationException. "not implemented"))) (throw (UnsupportedOperationException. "not implemented")))
`(~'entrySet [~this-sym] `(~'entrySet [~this-sym]
(throw (UnsupportedOperationException. "not implemented"))) (throw (UnsupportedOperationException. "not implemented")))
`(~'get [~this-sym ~key-sym] `(~'get [~this-sym ~key-sym]
(.valAt ~this-sym ~key-sym)) (.valAt ~this-sym ~key-sym))
`(~'containsValue [~this-sym ~val-sym] `(~'containsValue [~this-sym ~val-sym]
(throw (UnsupportedOperationException. "not implemented"))) (throw (UnsupportedOperationException. "not implemented")))
`(~'values [~this-sym] `(~'values [~this-sym]
(map val (.seq ~this-sym))) (map val (.seq ~this-sym)))
'java.lang.Object 'java.lang.Object
`(~'equals [~this-sym other#] `(~'equals [~this-sym other#]
(.equiv ~this-sym other#)) (.equiv ~this-sym other#))
`(~'hashCode [~this-sym] `(~'hashCode [~this-sym]
(clojure.lang.APersistentMap/mapHash ~this-sym)) (clojure.lang.APersistentMap/mapHash ~this-sym))
'clojure.lang.IHashEq 'clojure.lang.IHashEq
`(~'hasheq [~this-sym] `(~'hasheq [~this-sym]
(clojure.core/hash-unordered-coll ~this-sym)) (clojure.core/hash-unordered-coll ~this-sym))
'clojure.lang.IObj 'clojure.lang.IObj
`(~'meta [~this-sym] `(~'meta [~this-sym]
(. ~this-sym ~'-$meta)) (. ~this-sym ~'-$meta))
`(~'withMeta [~this-sym ~val-sym] `(~'withMeta [~this-sym ~val-sym]
(new ~tagname ~@(->> (replace {'$meta val-sym} fields) (new ~tagname ~@(->> (replace {'$meta val-sym} fields)
(generate-field-access this-sym val-sym)))) (generate-field-access this-sym val-sym))))])))
])))
(defmacro defrecord (defmacro defrecord
[rsym fields & impls] [rsym fields & impls]
@ -367,14 +366,14 @@
~@(when (:ns &env) ~@(when (:ns &env)
['cljs.core/IPrintWithWriter ['cljs.core/IPrintWithWriter
`(~'-pr-writer [~'this writer# opts#] `(~'-pr-writer [~'this writer# opts#]
(let [pr-pair# (fn [keyval#] (let [pr-pair# (fn [keyval#]
(cljs.core/pr-sequential-writer writer# (~'js* "cljs.core.pr_writer") (cljs.core/pr-sequential-writer writer# (~'js* "cljs.core.pr_writer")
"" " " "" opts# keyval#))] "" " " "" opts# keyval#))]
(cljs.core/pr-sequential-writer (cljs.core/pr-sequential-writer
writer# pr-pair# ~(str ident "{") ", " "}" opts# writer# pr-pair# ~(str ident "{") ", " "}" opts#
(concat [~@(for [f fields'] (concat [~@(for [f fields']
`(vector ~(keyword f) (. ~'this ~(property-symbol f))))] `(vector ~(keyword f) (. ~'this ~(property-symbol f))))]
(. ~'this ~'-$extmap)))))])) (. ~'this ~'-$extmap)))))]))
~@(when-not (:ns &env) ~@(when-not (:ns &env)
[`(defmethod print-method ~rsym [o# ^java.io.Writer w#] [`(defmethod print-method ~rsym [o# ^java.io.Writer w#]

View file

@ -122,9 +122,7 @@
:encoders (mt/-string-encoders)} :encoders (mt/-string-encoders)}
{:name :collections {:name :collections
:decoders coders :decoders coders
:encoders coders} :encoders coders})))
)))
(defn validator (defn validator
[s] [s]
@ -304,7 +302,7 @@
options (into {:type :validation options (into {:type :validation
:code :data-validation :code :data-validation
::explain explain} ::explain explain}
options) options)
hint (get options :hint "schema validation error")] hint (get options :hint "schema validation error")]
(throw (ex-info hint options))))))) (throw (ex-info hint options)))))))

View file

@ -169,15 +169,14 @@
(map (fn [[k _ s]] (map (fn [[k _ s]]
(str (pad " " level) (str/camel k) (str (pad " " level) (str/camel k)
(when (contains? optional k) "?") (when (contains? optional k) "?")
": " s ))) ": " s)))
(str/join ",\n")) (str/join ",\n"))
header (cond-> (if (zero? level) header (cond-> (if (zero? level)
(str "type " title) (str "type " title)
(str title)) (str title))
closed? (str "!") closed? (str "!")
(some? title) (str " ") (some? title) (str " "))]
)]
(str header "{\n" entries "\n" (pad "}" level)))))) (str header "{\n" entries "\n" (pad "}" level))))))

View file

@ -74,17 +74,17 @@
(defn word-string (defn word-string
[] []
(->> (tg/such-that #(re-matches #"\w+" %) (->> (tg/such-that #(re-matches #"\w+" %)
tg/string-alphanumeric tg/string-alphanumeric
50) 50)
(tg/such-that (complement str/blank?)))) (tg/such-that (complement str/blank?))))
(defn uri (defn uri
[] []
(tg/let [scheme (tg/elements ["http" "https"]) (tg/let [scheme (tg/elements ["http" "https"])
domain (as-> (word-string) $ domain (as-> (word-string) $
(tg/such-that (fn [x] (> (count x) 5)) $ 100) (tg/such-that (fn [x] (> (count x) 5)) $ 100)
(tg/fmap str/lower $)) (tg/fmap str/lower $))
ext (tg/elements ["net" "com" "org" "app" "io"])] ext (tg/elements ["net" "com" "org" "app" "io"])]
(u/uri (str scheme "://" domain "." ext)))) (u/uri (str scheme "://" domain "." ext))))
(defn uuid (defn uuid
@ -102,11 +102,11 @@
([dest elements] ([dest elements]
(->> (apply tg/tuple (repeat (count elements) tg/boolean)) (->> (apply tg/tuple (repeat (count elements) tg/boolean))
(tg/fmap (fn [bools] (tg/fmap (fn [bools]
(into dest (into dest
(comp (comp
(c/filter first) (c/filter first)
(c/map second)) (c/map second))
(c/map list bools elements))))))) (c/map list bools elements)))))))
(defn set (defn set
[g] [g]

View file

@ -6,9 +6,9 @@
(ns app.common.svg (ns app.common.svg
(:require (:require
#?(:cljs ["./svg/optimizer.js" :as svgo])
#?(:clj [clojure.xml :as xml] #?(:clj [clojure.xml :as xml]
:cljs [tubax.core :as tubax]) :cljs [tubax.core :as tubax])
#?(:cljs ["./svg/optimizer.js" :as svgo])
[app.common.data :as d] [app.common.data :as d]
[app.common.data.macros :as dm] [app.common.data.macros :as dm]
[app.common.geom.matrix :as gmt] [app.common.geom.matrix :as gmt]
@ -115,8 +115,7 @@
:tspan :tspan
:use :use
:view :view
:vkern :vkern})
})
;; https://www.w3.org/TR/SVG11/attindex.html ;; https://www.w3.org/TR/SVG11/attindex.html
(def svg-attr-list (def svg-attr-list
@ -680,7 +679,7 @@
;; Removed this warning because slows a lot rendering with big svgs ;; Removed this warning because slows a lot rendering with big svgs
#_(let [filtered-props (->> attrs (remove known-property?) (map first))] #_(let [filtered-props (->> attrs (remove known-property?) (map first))]
(when (seq filtered-props) (when (seq filtered-props)
(.warn js/console "Unknown properties: " (str/join ", " filtered-props )))) (.warn js/console "Unknown properties: " (str/join ", " filtered-props))))
(into {} (into {}
(comp (filter known-property?) (comp (filter known-property?)
@ -740,7 +739,7 @@
node-defs (->> rec-result (map first) (reduce merge current-node-defs))] node-defs (->> rec-result (map first) (reduce merge current-node-defs))]
[ node-defs node ]))) [node-defs node])))
(defn find-attr-references [attrs] (defn find-attr-references [attrs]
(->> attrs (->> attrs
@ -1048,7 +1047,7 @@
(conj {:href (or (:href attrs) (:xlink:href attrs)) (conj {:href (or (:href attrs) (:xlink:href attrs))
:width (d/parse-integer (:width attrs) 0) :width (d/parse-integer (:width attrs) 0)
:height (d/parse-integer (:height attrs) 0)})))] :height (d/parse-integer (:height attrs) 0)})))]
(reduce-nodes redfn [] svg-data ))) (reduce-nodes redfn [] svg-data)))
#?(:clj #?(:clj
(defn- secure-parser-factory (defn- secure-parser-factory

View file

@ -292,8 +292,8 @@
(let [;; We need to reverse the second path when making a difference/intersection/exclude (let [;; We need to reverse the second path when making a difference/intersection/exclude
;; and both shapes are in the same direction ;; and both shapes are in the same direction
should-reverse? (and (not= :union bool-type) should-reverse? (and (not= :union bool-type)
(= (ups/clockwise? content-b) (= (ups/clockwise? content-b)
(ups/clockwise? content-a))) (ups/clockwise? content-a)))
content-a (-> content-a content-a (-> content-a
(close-paths) (close-paths)

View file

@ -159,8 +159,8 @@
point->handlers (content->handlers content) point->handlers (content->handlers content)
handlers (->> point handlers (->> point
(point->handlers ) (point->handlers)
(filter (fn [[ci cp]] (and (not= index ci) (not= prefix cp)) )))] (filter (fn [[ci cp]] (and (not= index ci) (not= prefix cp)))))]
(cond (cond
(= (count handlers) 1) (= (count handlers) 1)

View file

@ -107,8 +107,7 @@
[:c2x :number] [:c2x :number]
[:c2y :number] [:c2y :number]
[:x :number] [:x :number]
[:y :number]]) [:y :number]])]
]
(for [params param-list] (for [params param-list]
{:command :curve-to {:command :curve-to
:relative relative :relative relative
@ -228,7 +227,7 @@
(d/update-in-when [:params :y] + (:y prev-pos)) (d/update-in-when [:params :y] + (:y prev-pos))
(cond-> (cond->
(= :line-to-horizontal (:command command)) (= :line-to-horizontal (:command command))
(d/update-in-when [:params :value] + (:x prev-pos)) (d/update-in-when [:params :value] + (:x prev-pos))
(= :line-to-vertical (:command command)) (= :line-to-vertical (:command command))

View file

@ -132,8 +132,7 @@
[:c2x :number] [:c2x :number]
[:c2y :number] [:c2y :number]
[:x :number] [:x :number]
[:y :number]]) [:y :number]])]
]
(for [params param-list] (for [params param-list]
{:command :curve-to {:command :curve-to
:relative relative :relative relative
@ -254,8 +253,7 @@
dtheta (unit-vector-angle v1x v1y v2x v2y) dtheta (unit-vector-angle v1x v1y v2x v2y)
dtheta (if (and (= fs 0) (> dtheta 0)) (- dtheta (* mth/PI 2)) dtheta) dtheta (if (and (= fs 0) (> dtheta 0)) (- dtheta (* mth/PI 2)) dtheta)
dtheta (if (and (= fs 1) (< dtheta 0)) (+ dtheta (* mth/PI 2)) dtheta) dtheta (if (and (= fs 1) (< dtheta 0)) (+ dtheta (* mth/PI 2)) dtheta)]
]
[cx cy theta1 dtheta])) [cx cy theta1 dtheta]))
@ -302,8 +300,7 @@
(and (zero? rx) (and (zero? rx)
(zero? ry))) (zero? ry)))
[] []
(let [ (let [rx (mth/abs rx)
rx (mth/abs rx)
ry (mth/abs ry) ry (mth/abs ry)
lambda (+ (/ (* x1p x1p) (* rx rx)) lambda (+ (/ (* x1p x1p) (* rx rx))
(/ (* y1p y1p) (* ry ry))) (/ (* y1p y1p) (* ry ry)))
@ -380,7 +377,7 @@
(d/update-in-when [:params :y] + (:y prev-pos)) (d/update-in-when [:params :y] + (:y prev-pos))
(cond-> (cond->
(= :line-to-horizontal (:command command)) (= :line-to-horizontal (:command command))
(d/update-in-when [:params :value] + (:x prev-pos)) (d/update-in-when [:params :value] + (:x prev-pos))
(= :line-to-vertical (:command command)) (= :line-to-vertical (:command command))

View file

@ -273,29 +273,29 @@
"Given a root node of a text content extracts the texts with its associated styles" "Given a root node of a text content extracts the texts with its associated styles"
[node] [node]
(letfn (letfn
[(rec-style-text-map [acc node style] [(rec-style-text-map [acc node style]
(let [node-style (merge style (select-keys node text-attrs)) (let [node-style (merge style (select-keys node text-attrs))
head (or (-> acc first) [{} ""]) head (or (-> acc first) [{} ""])
[head-style head-text] head [head-style head-text] head
new-acc new-acc
(cond (cond
(:children node) (:children node)
(reduce #(rec-style-text-map %1 %2 node-style) acc (:children node)) (reduce #(rec-style-text-map %1 %2 node-style) acc (:children node))
(not= head-style node-style) (not= head-style node-style)
(cons [node-style (:text node "")] acc) (cons [node-style (:text node "")] acc)
:else :else
(cons [node-style (dm/str head-text "" (:text node))] (rest acc))) (cons [node-style (dm/str head-text "" (:text node))] (rest acc)))
;; We add an end-of-line when finish a paragraph ;; We add an end-of-line when finish a paragraph
new-acc new-acc
(if (= (:type node) "paragraph") (if (= (:type node) "paragraph")
(let [[hs ht] (first new-acc)] (let [[hs ht] (first new-acc)]
(cons [hs (dm/str ht "\n")] (rest new-acc))) (cons [hs (dm/str ht "\n")] (rest new-acc)))
new-acc)] new-acc)]
new-acc))] new-acc))]
(-> (rec-style-text-map [] node {}) (-> (rec-style-text-map [] node {})
reverse))) reverse)))

View file

@ -6,14 +6,14 @@
(ns app.common.transit (ns app.common.transit
(:require (:require
#?(:clj [datoteka.fs :as fs])
#?(:cljs ["luxon" :as lxn])
[app.common.data :as d] [app.common.data :as d]
[app.common.uri :as uri] [app.common.uri :as uri]
[cognitect.transit :as t] [cognitect.transit :as t]
[lambdaisland.uri :as luri] [lambdaisland.uri :as luri]
[linked.core :as lk] [linked.core :as lk]
[linked.set :as lks] [linked.set :as lks])
#?(:clj [datoteka.fs :as fs])
#?(:cljs ["luxon" :as lxn]))
#?(:clj #?(:clj
(:import (:import
java.io.ByteArrayInputStream java.io.ByteArrayInputStream

View file

@ -6,14 +6,14 @@
(ns app.common.types.color (ns app.common.types.color
(:require (:require
[app.common.data :as d] [app.common.data :as d]
[app.common.schema :as sm] [app.common.schema :as sm]
[app.common.schema.openapi :as-alias oapi] [app.common.schema.openapi :as-alias oapi]
[app.common.text :as txt] [app.common.text :as txt]
[app.common.types.color.generic :as-alias color-generic] [app.common.types.color.generic :as-alias color-generic]
[app.common.types.color.gradient :as-alias color-gradient] [app.common.types.color.gradient :as-alias color-gradient]
[app.common.types.color.gradient.stop :as-alias color-gradient-stop] [app.common.types.color.gradient.stop :as-alias color-gradient-stop]
[clojure.test.check.generators :as tgen])) [clojure.test.check.generators :as tgen]))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; SCHEMAS ;; SCHEMAS

View file

@ -87,10 +87,10 @@
(get-component file-data component-id false)) (get-component file-data component-id false))
([file-data component-id include-deleted?] ([file-data component-id include-deleted?]
(let [component (get-in file-data [:components component-id])] (let [component (get-in file-data [:components component-id])]
(when (or include-deleted? (when (or include-deleted?
(not (:deleted component))) (not (:deleted component)))
component)))) component))))
(defn get-deleted-component (defn get-deleted-component
[file-data component-id] [file-data component-id]

View file

@ -270,7 +270,7 @@
(ctkl/update-component component-id #(dissoc % :objects)) (ctkl/update-component component-id #(dissoc % :objects))
(ctkl/mark-component-undeleted component-id) (ctkl/mark-component-undeleted component-id)
(cond-> update-page? (cond-> update-page?
(ctkl/update-component component-id #(assoc % :main-instance-page page-id)))))) (ctkl/update-component component-id #(assoc % :main-instance-page page-id))))))
(defn purge-component (defn purge-component
"Remove permanently a component." "Remove permanently a component."

View file

@ -42,27 +42,27 @@
;; * change-properties ;; * change-properties
(defrecord Modifiers (defrecord Modifiers
[last-order ;; Last `order` attribute in the geometry list [last-order ;; Last `order` attribute in the geometry list
geometry-parent geometry-parent
geometry-child geometry-child
structure-parent structure-parent
structure-child]) structure-child])
(defrecord GeometricOperation (defrecord GeometricOperation
[order ;; Need the order to keep consistent between geometry-parent and geometry-child [order ;; Need the order to keep consistent between geometry-parent and geometry-child
type type
vector vector
origin origin
transform transform
transform-inverse transform-inverse
rotation rotation
center]) center])
(defrecord StructureOperation (defrecord StructureOperation
[type [type
property property
value value
index]) index])
;; Record constructors ;; Record constructors
@ -599,8 +599,8 @@
"Transforms a matrix by the translation modifier" "Transforms a matrix by the translation modifier"
[matrix modifier] [matrix modifier]
(-> (dm/get-prop modifier :vector) (-> (dm/get-prop modifier :vector)
(gmt/translate-matrix) (gmt/translate-matrix)
(gmt/multiply! matrix))) (gmt/multiply! matrix)))
(defn transform-resize! (defn transform-resize!
@ -656,8 +656,7 @@
[modifiers] [modifiers]
(let [modifiers (concat (dm/get-prop modifiers :geometry-parent) (let [modifiers (concat (dm/get-prop modifiers :geometry-parent)
(dm/get-prop modifiers :geometry-child)) (dm/get-prop modifiers :geometry-child))
modifiers (sort-by #(dm/get-prop % :order) modifiers) modifiers (sort-by #(dm/get-prop % :order) modifiers)]
]
(modifiers->transform1 modifiers))) (modifiers->transform1 modifiers)))
(defn modifiers->transform-old (defn modifiers->transform-old

View file

@ -194,8 +194,7 @@
[:vector {:gen/max 1} ::ctss/shadow]] [:vector {:gen/max 1} ::ctss/shadow]]
[:blur {:optional true} ::ctsb/blur] [:blur {:optional true} ::ctsb/blur]
[:grow-type {:optional true} [:grow-type {:optional true}
[::sm/one-of #{:auto-width :auto-height :fixed}]] [::sm/one-of #{:auto-width :auto-height :fixed}]]])
])
(sm/define! ::group-attrs (sm/define! ::group-attrs
[:map {:title "GroupAttrs"} [:map {:title "GroupAttrs"}
@ -351,8 +350,8 @@
(defn has-images? (defn has-images?
[{:keys [fills strokes]}] [{:keys [fills strokes]}]
(or (or
(some :fill-image fills) (some :fill-image fills)
(some :stroke-image strokes))) (some :stroke-image strokes)))
;; --- Initialization ;; --- Initialization

View file

@ -270,7 +270,7 @@
(defn has-destination (defn has-destination
[interaction] [interaction]
(#{:navigate :open-overlay :toggle-overlay :close-overlay} (#{:navigate :open-overlay :toggle-overlay :close-overlay}
(:action-type interaction))) (:action-type interaction)))
(defn destination? (defn destination?
[interaction] [interaction]

View file

@ -1054,7 +1054,7 @@
(->> (cells-seq parent :sort? true) (->> (cells-seq parent :sort? true)
(reduce (reduce
(fn [[parent auto?] cell] (fn [[parent auto?] cell]
(let [[cell auto?] (let [[cell auto?]
(cond (cond
(and (empty? (:shapes cell)) (and (empty? (:shapes cell))
@ -1067,7 +1067,7 @@
(not= (:column-span cell) 1)) (not= (:column-span cell) 1))
(= :auto (:position cell))) (= :auto (:position cell)))
[(assoc cell :position :manual) false] [(assoc cell :position :manual) false]
(empty? (:shapes cell)) (empty? (:shapes cell))
[cell false] [cell false]
@ -1129,9 +1129,7 @@
(defn assign-cells (defn assign-cells
[parent objects] [parent objects]
(prn ">assign-cells") (prn ">assign-cells")
(let [ (let [parent (assign-cell-positions parent objects)
parent (assign-cell-positions parent objects)
shape-has-cell? shape-has-cell?
(into #{} (mapcat (comp :shapes second)) (:layout-grid-cells parent)) (into #{} (mapcat (comp :shapes second)) (:layout-grid-cells parent))

View file

@ -6,8 +6,8 @@
(ns app.common.types.typography (ns app.common.types.typography
(:require (:require
[app.common.schema :as sm] [app.common.schema :as sm]
[app.common.text :as txt])) [app.common.text :as txt]))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; SCHEMA ;; SCHEMA
@ -44,8 +44,8 @@
:content :content
;; Check if any node in the content has a reference for the library ;; Check if any node in the content has a reference for the library
(txt/node-seq (txt/node-seq
#(and (some? (:typography-ref-id %)) #(and (some? (:typography-ref-id %))
(= (:typography-ref-file %) library-id)))))) (= (:typography-ref-file %) library-id))))))
(defn uses-library-typography? (defn uses-library-typography?
"Check if the shape uses the given library typography." "Check if the shape uses the given library typography."
@ -55,8 +55,8 @@
:content :content
;; Check if any node in the content has a reference for the library ;; Check if any node in the content has a reference for the library
(txt/node-seq (txt/node-seq
#(and (= (:typography-ref-id %) typography-id) #(and (= (:typography-ref-id %) typography-id)
(= (:typography-ref-file %) library-id)))))) (= (:typography-ref-file %) library-id))))))
(defn remap-typographies (defn remap-typographies
"Change the shape so that any use of the given typography now points to "Change the shape so that any use of the given typography now points to

View file

@ -8,10 +8,10 @@
(ns app.common.uuid (ns app.common.uuid
(:refer-clojure :exclude [next uuid zero? short]) (:refer-clojure :exclude [next uuid zero? short])
(:require (:require
[app.common.data.macros :as dm]
#?(:clj [clojure.core :as c]) #?(:clj [clojure.core :as c])
#?(:cljs [app.common.uuid-impl :as impl]) #?(:cljs [app.common.uuid-impl :as impl])
#?(:cljs [cljs.core :as c])) #?(:cljs [cljs.core :as c])
[app.common.data.macros :as dm])
#?(:clj (:import #?(:clj (:import
app.common.UUIDv8 app.common.UUIDv8
java.util.UUID java.util.UUID

View file

@ -6,10 +6,10 @@
(ns common-tests.colors-test (ns common-tests.colors-test
(:require (:require
[app.common.data :as d] #?(:cljs [goog.color :as gcolors])
[app.common.colors :as colors] [app.common.colors :as colors]
[clojure.test :as t] [app.common.data :as d]
#?(:cljs [goog.color :as gcolors]))) [clojure.test :as t]))
(t/deftest valid-hex-color (t/deftest valid-hex-color
(t/is (false? (colors/valid-hex-color? nil))) (t/is (false? (colors/valid-hex-color? nil)))
@ -18,16 +18,14 @@
(t/is (false? (colors/valid-hex-color? "#qqqqqq"))) (t/is (false? (colors/valid-hex-color? "#qqqqqq")))
(t/is (true? (colors/valid-hex-color? "#aaa"))) (t/is (true? (colors/valid-hex-color? "#aaa")))
(t/is (false? (colors/valid-hex-color? "#aaaa"))) (t/is (false? (colors/valid-hex-color? "#aaaa")))
(t/is (true? (colors/valid-hex-color? "#fabada"))) (t/is (true? (colors/valid-hex-color? "#fabada"))))
)
(t/deftest valid-rgb-color (t/deftest valid-rgb-color
(t/is (false? (colors/valid-rgb-color? nil))) (t/is (false? (colors/valid-rgb-color? nil)))
(t/is (false? (colors/valid-rgb-color? ""))) (t/is (false? (colors/valid-rgb-color? "")))
(t/is (false? (colors/valid-rgb-color? "()"))) (t/is (false? (colors/valid-rgb-color? "()")))
(t/is (true? (colors/valid-rgb-color? "(255, 30, 30)"))) (t/is (true? (colors/valid-rgb-color? "(255, 30, 30)")))
(t/is (true? (colors/valid-rgb-color? "rgb(255, 30, 30)"))) (t/is (true? (colors/valid-rgb-color? "rgb(255, 30, 30)"))))
)
(t/deftest rgb-to-str (t/deftest rgb-to-str
(t/is (= "rgb(1,2,3)" (colors/rgb->str [1 2 3]))) (t/is (= "rgb(1,2,3)" (colors/rgb->str [1 2 3])))
@ -37,16 +35,14 @@
;; (prn (colors/rgb->hsv [1 2 3])) ;; (prn (colors/rgb->hsv [1 2 3]))
;; (prn (gcolors/rgbToHsv 1 2 3)) ;; (prn (gcolors/rgbToHsv 1 2 3))
(t/is (= [210.0 0.6666666666666666 3.0] (colors/rgb->hsv [1.0 2.0 3.0]))) (t/is (= [210.0 0.6666666666666666 3.0] (colors/rgb->hsv [1.0 2.0 3.0])))
#?(:cljs (t/is (= (colors/rgb->hsv [1 2 3]) (vec (gcolors/rgbToHsv 1 2 3))))) #?(:cljs (t/is (= (colors/rgb->hsv [1 2 3]) (vec (gcolors/rgbToHsv 1 2 3))))))
)
(t/deftest hsv-to-rgb (t/deftest hsv-to-rgb
(t/is (= [1 2 3] (t/is (= [1 2 3]
(colors/hsv->rgb [210 0.6666666666666666 3]))) (colors/hsv->rgb [210 0.6666666666666666 3])))
#?(:cljs #?(:cljs
(t/is (= (colors/hsv->rgb [210 0.6666666666666666 3]) (t/is (= (colors/hsv->rgb [210 0.6666666666666666 3])
(vec (gcolors/hsvToRgb 210 0.6666666666666666 3))))) (vec (gcolors/hsvToRgb 210 0.6666666666666666 3))))))
)
(t/deftest rgb-to-hex (t/deftest rgb-to-hex
(t/is (= "#010203" (colors/rgb->hex [1 2 3])))) (t/is (= "#010203" (colors/rgb->hex [1 2 3]))))
@ -68,9 +64,7 @@
(t/is (= [1 2 3] (colors/hsl->rgb [210.0 0.5 0.00784313725490196]))) (t/is (= [1 2 3] (colors/hsl->rgb [210.0 0.5 0.00784313725490196])))
(t/is (= [210.0 0.5 0.00784313725490196] (colors/rgb->hsl [1 2 3]))) (t/is (= [210.0 0.5 0.00784313725490196] (colors/rgb->hsl [1 2 3])))
#?(:cljs (t/is (= (colors/hsl->rgb [210 0.5 0.00784313725490196]) #?(:cljs (t/is (= (colors/hsl->rgb [210 0.5 0.00784313725490196])
(vec (gcolors/hslToRgb 210 0.5 0.00784313725490196))))) (vec (gcolors/hslToRgb 210 0.5 0.00784313725490196))))))
)
(t/deftest expand-hex (t/deftest expand-hex
(t/is (= "aaaaaa" (colors/expand-hex "a"))) (t/is (= "aaaaaa" (colors/expand-hex "a")))
@ -93,8 +87,5 @@
(t/is (true? (colors/color-string? "magenta"))) (t/is (true? (colors/color-string? "magenta")))
(t/is (false? (colors/color-string? nil))) (t/is (false? (colors/color-string? nil)))
(t/is (false? (colors/color-string? ""))) (t/is (false? (colors/color-string? "")))
(t/is (false? (colors/color-string? "kkkkkk"))) (t/is (false? (colors/color-string? "kkkkkk"))))
)

View file

@ -30,8 +30,7 @@
(d/remove-at-index [5 1 2 3 4] 0))) (d/remove-at-index [5 1 2 3 4] 0)))
(t/is (= [1 2 3 4] (t/is (= [1 2 3 4]
(d/remove-at-index [1 5 2 3 4] 1))) (d/remove-at-index [1 5 2 3 4] 1))))
)
(t/deftest with-next (t/deftest with-next
(t/is (= [[0 1] [1 2] [2 3] [3 4] [4 nil]] (t/is (= [[0 1] [1 2] [2 3] [3 4] [4 nil]]

View file

@ -71,14 +71,14 @@
:version 7} :version 7}
expect (-> data expect (-> data
(update-in [:pages-index page-id :objects] dissoc (update-in [:pages-index page-id :objects] dissoc
(uuid/custom 1 2) (uuid/custom 1 2)
(uuid/custom 1 3) (uuid/custom 1 3)
(uuid/custom 1 4)) (uuid/custom 1 4))
(update-in [:pages-index page-id :objects (uuid/custom 1 1) :shapes] (update-in [:pages-index page-id :objects (uuid/custom 1 1) :shapes]
(fn [shapes] (fn [shapes]
(let [id (uuid/custom 1 2)] (let [id (uuid/custom 1 2)]
(into [] (remove #(= id %)) shapes))))) (into [] (remove #(= id %)) shapes)))))
res (cpm/migrate-data data 8)] res (cpm/migrate-data data 8)]
@ -86,5 +86,4 @@
;; (pprint expect) ;; (pprint expect)
(t/is (= (dissoc expect :version) (t/is (= (dissoc expect :version)
(dissoc res :version))) (dissoc res :version)))))
))

View file

@ -6,8 +6,8 @@
(ns common-tests.geom-point-test (ns common-tests.geom-point-test
(:require (:require
[app.common.math :as mth]
[app.common.geom.point :as gpt] [app.common.geom.point :as gpt]
[app.common.math :as mth]
[clojure.test :as t])) [clojure.test :as t]))
(t/deftest add-points (t/deftest add-points
@ -62,8 +62,7 @@
(t/is (gpt/close? rs p1))) (t/is (gpt/close? rs p1)))
(let [rs (gpt/min p2 p1)] (let [rs (gpt/min p2 p1)]
(t/is (gpt/close? rs p1))) (t/is (gpt/close? rs p1)))))
))
(t/deftest max-point (t/deftest max-point
(let [p1 (gpt/point 1 2) (let [p1 (gpt/point 1 2)
@ -85,8 +84,7 @@
(t/is (gpt/close? rs p2))) (t/is (gpt/close? rs p2)))
(let [rs (gpt/max p2 p1)] (let [rs (gpt/max p2 p1)]
(t/is (gpt/close? rs p2))) (t/is (gpt/close? rs p2)))))
))
(t/deftest inverse-point (t/deftest inverse-point
(let [p1 (gpt/point 1 2) (let [p1 (gpt/point 1 2)
@ -154,8 +152,7 @@
p2 (gpt/point 1 5) p2 (gpt/point 1 5)
rs (gpt/angle-sign p1 p2)] rs (gpt/angle-sign p1 p2)]
(t/is (number? rs)) (t/is (number? rs))
(t/is (mth/close? -1 rs))) (t/is (mth/close? -1 rs))))
)
(t/deftest update-angle (t/deftest update-angle
(let [p1 (gpt/point 1 3) (let [p1 (gpt/point 1 3)
@ -184,8 +181,7 @@
(let [p1 (gpt/point -1 -3) (let [p1 (gpt/point -1 -3)
rs (gpt/quadrant p1)] rs (gpt/quadrant p1)]
(t/is (number? rs)) (t/is (number? rs))
(t/is (mth/close? 3 rs))) (t/is (mth/close? 3 rs))))
)
(t/deftest round-point (t/deftest round-point
(let [p1 (gpt/point 1.34567 3.34567) (let [p1 (gpt/point 1.34567 3.34567)
@ -198,8 +194,7 @@
rs (gpt/round p1 2)] rs (gpt/round p1 2)]
(t/is (gpt/point? rs)) (t/is (gpt/point? rs))
(t/is (mth/close? 1.35 (:x rs))) (t/is (mth/close? 1.35 (:x rs)))
(t/is (mth/close? 3.35 (:y rs)))) (t/is (mth/close? 3.35 (:y rs)))))
)
(t/deftest halft-round-point (t/deftest halft-round-point
(let [p1 (gpt/point 1.34567 3.34567) (let [p1 (gpt/point 1.34567 3.34567)

View file

@ -41,9 +41,9 @@
(t/deftest transform-shapes (t/deftest transform-shapes
(t/testing "Shape without modifiers should stay the same" (t/testing "Shape without modifiers should stay the same"
(t/are [type] (t/are [type]
(let [shape-before (create-test-shape type) (let [shape-before (create-test-shape type)
shape-after (gsh/transform-shape shape-before)] shape-after (gsh/transform-shape shape-before)]
(= shape-before shape-after)) (= shape-before shape-after))
:rect :path)) :rect :path))
@ -65,49 +65,48 @@
(get-in shape-after [:selrect :width]))) (get-in shape-after [:selrect :width])))
(t/is (close? (get-in shape-before [:selrect :height]) (t/is (close? (get-in shape-before [:selrect :height])
(get-in shape-after [:selrect :height]))) (get-in shape-after [:selrect :height]))))))
)))
(t/testing "Transform with empty translation" (t/testing "Transform with empty translation"
(t/are [type] (t/are [type]
(let [modifiers {:displacement (gmt/matrix)} (let [modifiers {:displacement (gmt/matrix)}
shape-before (create-test-shape type {:modifiers modifiers}) shape-before (create-test-shape type {:modifiers modifiers})
shape-after (gsh/transform-shape shape-before)] shape-after (gsh/transform-shape shape-before)]
(t/are [prop] (t/are [prop]
(t/is (close? (get-in shape-before [:selrect prop]) (t/is (close? (get-in shape-before [:selrect prop])
(get-in shape-after [:selrect prop]))) (get-in shape-after [:selrect prop])))
:x :y :width :height :x1 :y1 :x2 :y2)) :x :y :width :height :x1 :y1 :x2 :y2))
:rect :path)) :rect :path))
(t/testing "Transform shape with resize modifiers" (t/testing "Transform shape with resize modifiers"
(t/are [type] (t/are [type]
(let [modifiers (ctm/resize-modifiers (gpt/point 2 2) (gpt/point 0 0)) (let [modifiers (ctm/resize-modifiers (gpt/point 2 2) (gpt/point 0 0))
shape-before (create-test-shape type {:modifiers modifiers}) shape-before (create-test-shape type {:modifiers modifiers})
shape-after (gsh/transform-shape shape-before)] shape-after (gsh/transform-shape shape-before)]
(t/is (not= shape-before shape-after)) (t/is (not= shape-before shape-after))
(t/is (close? (get-in shape-before [:selrect :x]) (t/is (close? (get-in shape-before [:selrect :x])
(get-in shape-after [:selrect :x]))) (get-in shape-after [:selrect :x])))
(t/is (close? (get-in shape-before [:selrect :y]) (t/is (close? (get-in shape-before [:selrect :y])
(get-in shape-after [:selrect :y]))) (get-in shape-after [:selrect :y])))
(t/is (close? (* 2 (get-in shape-before [:selrect :width])) (t/is (close? (* 2 (get-in shape-before [:selrect :width]))
(get-in shape-after [:selrect :width]))) (get-in shape-after [:selrect :width])))
(t/is (close? (* 2 (get-in shape-before [:selrect :height])) (t/is (close? (* 2 (get-in shape-before [:selrect :height]))
(get-in shape-after [:selrect :height])))) (get-in shape-after [:selrect :height]))))
:rect :path)) :rect :path))
(t/testing "Transform with empty resize" (t/testing "Transform with empty resize"
(t/are [type] (t/are [type]
(let [modifiers (ctm/resize-modifiers (gpt/point 1 1) (gpt/point 0 0)) (let [modifiers (ctm/resize-modifiers (gpt/point 1 1) (gpt/point 0 0))
shape-before (create-test-shape type {:modifiers modifiers}) shape-before (create-test-shape type {:modifiers modifiers})
shape-after (gsh/transform-shape shape-before)] shape-after (gsh/transform-shape shape-before)]
(t/are [prop] (t/are [prop]
(t/is (close? (get-in shape-before [:selrect prop]) (t/is (close? (get-in shape-before [:selrect prop])
(get-in shape-after [:selrect prop]))) (get-in shape-after [:selrect prop])))
:x :y :width :height :x1 :y1 :x2 :y2)) :x :y :width :height :x1 :y1 :x2 :y2))
:rect :path)) :rect :path))
(t/testing "Transform with resize=0" (t/testing "Transform with resize=0"
@ -118,54 +117,52 @@
(t/is (close? (get-in shape-before [:selrect :width]) (t/is (close? (get-in shape-before [:selrect :width])
(get-in shape-after [:selrect :width]))) (get-in shape-after [:selrect :width])))
(t/is (close? (get-in shape-before [:selrect :height]) (t/is (close? (get-in shape-before [:selrect :height])
(get-in shape-after [:selrect :height]))))) (get-in shape-after [:selrect :height])))))
(t/testing "Transform shape with rotation modifiers" (t/testing "Transform shape with rotation modifiers"
(t/are [type] (t/are [type]
(let [shape-before (create-test-shape type) (let [shape-before (create-test-shape type)
modifiers (ctm/rotation-modifiers shape-before (gsh/shape->center shape-before) 30) modifiers (ctm/rotation-modifiers shape-before (gsh/shape->center shape-before) 30)
shape-before (assoc shape-before :modifiers modifiers) shape-before (assoc shape-before :modifiers modifiers)
shape-after (gsh/transform-shape shape-before)] shape-after (gsh/transform-shape shape-before)]
(t/is (close? (get-in shape-before [:selrect :x]) (t/is (close? (get-in shape-before [:selrect :x])
(get-in shape-after [:selrect :x]))) (get-in shape-after [:selrect :x])))
(t/is (close? (get-in shape-before [:selrect :y]) (t/is (close? (get-in shape-before [:selrect :y])
(get-in shape-after [:selrect :y]))) (get-in shape-after [:selrect :y])))
(t/is (= (count (:points shape-before)) (count (:points shape-after)))) (t/is (= (count (:points shape-before)) (count (:points shape-after))))
(for [idx (range 0 (count (:point shape-before)))] (for [idx (range 0 (count (:point shape-before)))]
(do (t/is (not (close? (get-in shape-before [:points idx :x]) (do (t/is (not (close? (get-in shape-before [:points idx :x])
(get-in shape-after [:points idx :x])))) (get-in shape-after [:points idx :x]))))
(t/is (not (close? (get-in shape-before [:points idx :y]) (t/is (not (close? (get-in shape-before [:points idx :y])
(get-in shape-after [:points idx :y]))))))) (get-in shape-after [:points idx :y])))))))
:rect :path)) :rect :path))
(t/testing "Transform shape with rotation = 0 should leave equal selrect" (t/testing "Transform shape with rotation = 0 should leave equal selrect"
(t/are [type] (t/are [type]
(let [shape-before (create-test-shape type) (let [shape-before (create-test-shape type)
modifiers (ctm/rotation-modifiers shape-before (gsh/shape->center shape-before) 0) modifiers (ctm/rotation-modifiers shape-before (gsh/shape->center shape-before) 0)
shape-after (gsh/transform-shape (assoc shape-before :modifiers modifiers))] shape-after (gsh/transform-shape (assoc shape-before :modifiers modifiers))]
(t/are [prop] (t/are [prop]
(t/is (close? (get-in shape-before [:selrect prop]) (t/is (close? (get-in shape-before [:selrect prop])
(get-in shape-after [:selrect prop]))) (get-in shape-after [:selrect prop])))
:x :y :width :height :x1 :y1 :x2 :y2)) :x :y :width :height :x1 :y1 :x2 :y2))
:rect :path)) :rect :path))
(t/testing "Transform shape with invalid selrect fails gracefully" (t/testing "Transform shape with invalid selrect fails gracefully"
(t/are [type selrect] (t/are [type selrect]
(let [modifiers (ctm/move-modifiers 0 0) (let [modifiers (ctm/move-modifiers 0 0)
shape-before (create-test-shape type {:selrect selrect}) shape-before (create-test-shape type {:selrect selrect})
shape-after (gsh/transform-shape shape-before modifiers)] shape-after (gsh/transform-shape shape-before modifiers)]
(t/is (grc/close-rect? (:selrect shape-before) (t/is (grc/close-rect? (:selrect shape-before)
(:selrect shape-after)))) (:selrect shape-after))))
:rect (grc/make-rect 0 0 ##Inf ##Inf) :rect (grc/make-rect 0 0 ##Inf ##Inf)
:path (grc/make-rect 0 0 ##Inf ##Inf) :path (grc/make-rect 0 0 ##Inf ##Inf))))
))
)
(t/deftest points-to-selrect (t/deftest points-to-selrect
(let [points [(gpt/point 0.5 0.5) (let [points [(gpt/point 0.5 0.5)
@ -185,8 +182,8 @@
(t/deftest points-transform-matrix (t/deftest points-transform-matrix
(t/testing "Transform matrix" (t/testing "Transform matrix"
(t/are [selrect points expected] (t/are [selrect points expected]
(let [result (gsht/transform-points-matrix selrect points)] (let [result (gsht/transform-points-matrix selrect points)]
(t/is (gmt/close? expected result))) (t/is (gmt/close? expected result)))
;; No transformation ;; No transformation
(grc/make-rect 0 0 10 10) (grc/make-rect 0 0 10 10)
@ -197,7 +194,7 @@
;; Displacement ;; Displacement
(grc/make-rect 0 0 10 10) (grc/make-rect 0 0 10 10)
(-> (grc/make-rect 20 20 10 10) (-> (grc/make-rect 20 20 10 10)
(grc/rect->points )) (grc/rect->points))
(gmt/matrix 1 0 0 1 20 20) (gmt/matrix 1 0 0 1 20 20)
;; Resize ;; Resize
@ -234,5 +231,4 @@
(t/is (true? (gsin/fast-has-point? shape point1))) (t/is (true? (gsin/fast-has-point? shape point1)))
(t/is (true? (gsin/slow-has-point? shape point1))) (t/is (true? (gsin/slow-has-point? shape point1)))
(t/is (false? (gsin/fast-has-point? shape point2))) (t/is (false? (gsin/fast-has-point? shape point2)))
(t/is (false? (gsin/fast-has-point? shape point2))) (t/is (false? (gsin/fast-has-point? shape point2)))))
))

View file

@ -6,10 +6,10 @@
(ns common-tests.geom-test (ns common-tests.geom-test
(:require (:require
[clojure.test :as t] [app.common.geom.matrix :as gmt]
[app.common.math :as mth]
[app.common.geom.point :as gpt] [app.common.geom.point :as gpt]
[app.common.geom.matrix :as gmt])) [app.common.math :as mth]
[clojure.test :as t]))
(t/deftest point-constructors-test (t/deftest point-constructors-test
(t/testing "Create point with both coordinates" (t/testing "Create point with both coordinates"

View file

@ -6,11 +6,11 @@
(ns common-tests.helpers.components (ns common-tests.helpers.components
(:require (:require
[clojure.test :as t]
[app.common.files.helpers :as cfh] [app.common.files.helpers :as cfh]
[app.common.types.component :as ctk] [app.common.types.component :as ctk]
[app.common.types.container :as ctn] [app.common.types.container :as ctn]
[app.common.types.file :as ctf])) [app.common.types.file :as ctf]
[clojure.test :as t]))
;; ---- Helpers to manage libraries and synchronization ;; ---- Helpers to manage libraries and synchronization
@ -99,7 +99,7 @@
main-shape main-shape
(ctn/get-shape component (:shape-ref shape))] (ctn/get-shape component (:shape-ref shape))]
(t/is (some? main-shape))))] (t/is (some? main-shape))))]
;; Validate that the instance tree is well constructed ;; Validate that the instance tree is well constructed
(check-instance-root (first shapes-inst)) (check-instance-root (first shapes-inst))
@ -135,7 +135,7 @@
main-shape main-shape
(ctn/get-shape component (:shape-ref shape))] (ctn/get-shape component (:shape-ref shape))]
(t/is (some? main-shape))))] (t/is (some? main-shape))))]
;; Validate that the instance tree is well constructed ;; Validate that the instance tree is well constructed
(check-instance-root (first shapes-inst)) (check-instance-root (first shapes-inst))

View file

@ -45,111 +45,111 @@
(defn sample-shape (defn sample-shape
[file label type page-id props] [file label type page-id props]
(ctf/update-file-data (ctf/update-file-data
file file
(fn [file-data] (fn [file-data]
(let [frame-id (get props :frame-id uuid/zero) (let [frame-id (get props :frame-id uuid/zero)
parent-id (get props :parent-id uuid/zero) parent-id (get props :parent-id uuid/zero)
shape (cts/setup-shape shape (cts/setup-shape
(-> {:type type (-> {:type type
:width 1 :width 1
:height 1} :height 1}
(merge props)))] (merge props)))]
(swap! idmap assoc label (:id shape)) (swap! idmap assoc label (:id shape))
(ctpl/update-page file-data (ctpl/update-page file-data
page-id page-id
#(ctst/add-shape (:id shape) #(ctst/add-shape (:id shape)
shape shape
% %
frame-id frame-id
parent-id parent-id
0 0
true)))))) true))))))
(defn sample-component (defn sample-component
[file label page-id shape-id] [file label page-id shape-id]
(ctf/update-file-data (ctf/update-file-data
file file
(fn [file-data] (fn [file-data]
(let [page (ctpl/get-page file-data page-id) (let [page (ctpl/get-page file-data page-id)
[component-shape component-shapes updated-shapes] [component-shape component-shapes updated-shapes]
(ctn/make-component-shape (ctn/get-shape page shape-id) (ctn/make-component-shape (ctn/get-shape page shape-id)
(:objects page) (:objects page)
(:id file) (:id file)
true)] true)]
(swap! idmap assoc label (:id component-shape)) (swap! idmap assoc label (:id component-shape))
(-> file-data (-> file-data
(ctpl/update-page page-id (ctpl/update-page page-id
#(reduce (fn [page shape] (ctst/set-shape page shape)) #(reduce (fn [page shape] (ctst/set-shape page shape))
% %
updated-shapes)) updated-shapes))
(ctkl/add-component {:id (:id component-shape) (ctkl/add-component {:id (:id component-shape)
:name (:name component-shape) :name (:name component-shape)
:path "" :path ""
:main-instance-id shape-id :main-instance-id shape-id
:main-instance-page page-id :main-instance-page page-id
:shapes component-shapes})))))) :shapes component-shapes}))))))
(defn sample-instance (defn sample-instance
[file label page-id library component-id] [file label page-id library component-id]
(ctf/update-file-data (ctf/update-file-data
file file
(fn [file-data] (fn [file-data]
(let [[instance-shape instance-shapes] (let [[instance-shape instance-shapes]
(ctn/make-component-instance (ctpl/get-page file-data page-id) (ctn/make-component-instance (ctpl/get-page file-data page-id)
(ctkl/get-component (:data library) component-id) (ctkl/get-component (:data library) component-id)
(:data library) (:data library)
(gpt/point 0 0) (gpt/point 0 0)
true)] true)]
(swap! idmap assoc label (:id instance-shape)) (swap! idmap assoc label (:id instance-shape))
(-> file-data (-> file-data
(ctpl/update-page page-id (ctpl/update-page page-id
#(reduce (fn [page shape] #(reduce (fn [page shape]
(ctst/add-shape (:id shape) (ctst/add-shape (:id shape)
shape shape
page page
uuid/zero uuid/zero
(:parent-id shape) (:parent-id shape)
0 0
true)) true))
% %
instance-shapes))))))) instance-shapes)))))))
(defn sample-color (defn sample-color
[file label props] [file label props]
(ctf/update-file-data (ctf/update-file-data
file file
(fn [file-data] (fn [file-data]
(let [id (uuid/next) (let [id (uuid/next)
props (merge {:id id props (merge {:id id
:name "Color 1" :name "Color 1"
:color "#000000" :color "#000000"
:opacity 1} :opacity 1}
props)] props)]
(swap! idmap assoc label id) (swap! idmap assoc label id)
(ctcl/add-color file-data props))))) (ctcl/add-color file-data props)))))
(defn sample-typography (defn sample-typography
[file label props] [file label props]
(ctf/update-file-data (ctf/update-file-data
file file
(fn [file-data] (fn [file-data]
(let [id (uuid/next) (let [id (uuid/next)
props (merge {:id id props (merge {:id id
:name "Typography 1" :name "Typography 1"
:font-id "sourcesanspro" :font-id "sourcesanspro"
:font-family "sourcesanspro" :font-family "sourcesanspro"
:font-size "14" :font-size "14"
:font-style "normal" :font-style "normal"
:font-variant-id "regular" :font-variant-id "regular"
:font-weight "400" :font-weight "400"
:line-height "1.2" :line-height "1.2"
:letter-spacing "0" :letter-spacing "0"
:text-transform "none"} :text-transform "none"}
props)] props)]
(swap! idmap assoc label id) (swap! idmap assoc label id)
(ctyl/add-typography file-data props))))) (ctyl/add-typography file-data props)))))

View file

@ -6,9 +6,9 @@
(ns common-tests.pages-helpers-test (ns common-tests.pages-helpers-test
(:require (:require
[clojure.test :as t] [app.common.files.helpers :as cfh]
[clojure.pprint :refer [pprint]] [clojure.pprint :refer [pprint]]
[app.common.files.helpers :as cfh])) [clojure.test :as t]))
(t/deftest parse-path-name (t/deftest parse-path-name
(t/is (= ["foo" "bar"] (cfh/parse-path-name "foo/bar"))) (t/is (= ["foo" "bar"] (cfh/parse-path-name "foo/bar")))

View file

@ -82,8 +82,7 @@
:option [:values :test2] :option [:values :test2]
:value nil}] :value nil}]
res (ch/process-changes data chgs)] res (ch/process-changes data chgs)]
(t/is (= [:test1] (keys (get-in res [:pages-index page-id :options :values])))))) (t/is (= [:test1] (keys (get-in res [:pages-index page-id :options :values]))))))))
))
(t/deftest process-change-add-obj (t/deftest process-change-add-obj
(let [file-id (uuid/custom 2 2) (let [file-id (uuid/custom 2 2)
@ -137,8 +136,7 @@
(t/is (not (nil? (get objects id-a)))) (t/is (not (nil? (get objects id-a))))
(t/is (not (nil? (get objects id-b)))) (t/is (not (nil? (get objects id-b))))
(t/is (not (nil? (get objects id-c)))) (t/is (not (nil? (get objects id-c))))
(t/is (= [id-b id-c id-a] (get-in objects [uuid/zero :shapes])))))) (t/is (= [id-b id-c id-a] (get-in objects [uuid/zero :shapes]))))))))
))
(t/deftest process-change-mod-obj (t/deftest process-change-mod-obj
(let [file-id (uuid/custom 2 2) (let [file-id (uuid/custom 2 2)
@ -164,9 +162,7 @@
:attr :name :attr :name
:val "foobar"}]} :val "foobar"}]}
res (ch/process-changes data [chg])] res (ch/process-changes data [chg])]
(t/is (= res data)))) (t/is (= res data))))))
))
;; (t/deftest process-change-del-obj ;; (t/deftest process-change-del-obj

View file

@ -50,6 +50,5 @@
(t/is (= 10 (dm/get-prop u :a))) (t/is (= 10 (dm/get-prop u :a)))
(t/is (= 20 (dm/get-prop u :b))) (t/is (= 20 (dm/get-prop u :b)))
(t/is (= 124 (:c u))) (t/is (= 124 (:c u)))
(t/is (not= u o))))) (t/is (not= u o)))))))
))

View file

@ -6,13 +6,13 @@
(ns common-tests.svg-path-test (ns common-tests.svg-path-test
(:require (:require
#?(:cljs [app.common.svg.path.legacy-parser2 :as svg.path.legacy1])
[app.common.data :as d] [app.common.data :as d]
[app.common.pprint :as pp]
[app.common.math :as mth] [app.common.math :as mth]
[app.common.pprint :as pp]
[app.common.svg.path :as svg.path] [app.common.svg.path :as svg.path]
[app.common.svg.path.legacy-parser2 :as svg.path.legacy2] [app.common.svg.path.legacy-parser2 :as svg.path.legacy2]
[clojure.test :as t] [clojure.test :as t]))
#?(:cljs [app.common.svg.path.legacy-parser2 :as svg.path.legacy1])))
(t/deftest parse-test-1 (t/deftest parse-test-1
(let [data (str "m -994.563 4564.1423 149.3086 -52.8821 30.1828 " (let [data (str "m -994.563 4564.1423 149.3086 -52.8821 30.1828 "
@ -25,7 +25,7 @@
(update entry :params #(into (sorted-map) %))))) (update entry :params #(into (sorted-map) %)))))
result2 (->> (svg.path.legacy2/parse data) result2 (->> (svg.path.legacy2/parse data)
(mapv (fn [entry] (mapv (fn [entry]
(update entry :params #(into (sorted-map) %))))) (update entry :params #(into (sorted-map) %)))))
result3 #?(:cljs (->> (svg.path.legacy1/parse data) result3 #?(:cljs (->> (svg.path.legacy1/parse data)
(mapv (fn [entry] (mapv (fn [entry]
@ -113,7 +113,7 @@
(update entry :params #(into (sorted-map) %))))) (update entry :params #(into (sorted-map) %)))))
result2 (->> (svg.path.legacy2/parse data) result2 (->> (svg.path.legacy2/parse data)
(mapv (fn [entry] (mapv (fn [entry]
(update entry :params #(into (sorted-map) %)))))] (update entry :params #(into (sorted-map) %)))))]
(t/is (= 165 (t/is (= 165
(count result1) (count result1)
@ -144,7 +144,7 @@
(update entry :params #(into (sorted-map) %))))) (update entry :params #(into (sorted-map) %)))))
result2 (->> (svg.path.legacy2/parse data) result2 (->> (svg.path.legacy2/parse data)
(mapv (fn [entry] (mapv (fn [entry]
(update entry :params #(into (sorted-map) %)))))] (update entry :params #(into (sorted-map) %)))))]
(t/is (= 6 (t/is (= 6
(count result1) (count result1)
@ -223,7 +223,7 @@
(update entry :params #(into (sorted-map) %))))) (update entry :params #(into (sorted-map) %)))))
result2 (->> (svg.path.legacy2/parse data) result2 (->> (svg.path.legacy2/parse data)
(mapv (fn [entry] (mapv (fn [entry]
(update entry :params #(into (sorted-map) %)))))] (update entry :params #(into (sorted-map) %)))))]
(t/is (= 41 (t/is (= 41
(count result1) (count result1)
@ -242,8 +242,7 @@
(doseq [[k v] (:params item1)] (doseq [[k v] (:params item1)]
(t/is (mth/close? v (get-in item2 [:params k]) 0.000000001)) (t/is (mth/close? v (get-in item2 [:params k]) 0.000000001))
(t/is (mth/close? v (get-in item3 [:params k]) 0.000000001)) (t/is (mth/close? v (get-in item3 [:params k]) 0.000000001)))))))
)))))
(t/deftest parse-test-5 (t/deftest parse-test-5
(let [data (str "M363 826" (let [data (str "M363 826"
@ -268,15 +267,14 @@
"8.5 8.676 8.5 21.5 0 12.825-8.675 21.325-8.676 8.5-21.5 8.5Zm120 0Q747 886 " "8.5 8.676 8.5 21.5 0 12.825-8.675 21.325-8.676 8.5-21.5 8.5Zm120 0Q747 886 "
"738.5 877.325q-8.5-8.676-8.5-21.5 0-12.825 8.675-21.325 8.676-8.5 21.5-8.5 " "738.5 877.325q-8.5-8.676-8.5-21.5 0-12.825 8.675-21.325 8.676-8.5 21.5-8.5 "
"12.825 0 21.325 8.675 8.5 8.676 8.5 21.5 0 12.825-8.675 21.325-8.676 8.5-21.5 " "12.825 0 21.325 8.675 8.5 8.676 8.5 21.5 0 12.825-8.675 21.325-8.676 8.5-21.5 "
"8.5Z" "8.5Z")
)
result1 (->> (svg.path/parse data) result1 (->> (svg.path/parse data)
(mapv (fn [entry] (mapv (fn [entry]
(update entry :params #(into (sorted-map) %))))) (update entry :params #(into (sorted-map) %)))))
result2 (->> (svg.path.legacy2/parse data) result2 (->> (svg.path.legacy2/parse data)
(mapv (fn [entry] (mapv (fn [entry]
(update entry :params #(into (sorted-map) %)))))] (update entry :params #(into (sorted-map) %)))))]
(t/is (= 76 (t/is (= 76
(count result1) (count result1)
@ -287,15 +285,13 @@
(dotimes [i (count result1)] (dotimes [i (count result1)]
(let [item1 (nth result1 i) (let [item1 (nth result1 i)
item2 (nth result2 i) item2 (nth result2 i)]
]
(t/is (= (:command item1) (t/is (= (:command item1)
(:command item2))) (:command item2)))
(doseq [[k v] (:params item1)] (doseq [[k v] (:params item1)]
(t/is (mth/close? v (get-in item2 [:params k]) 0.000000001)) (t/is (mth/close? v (get-in item2 [:params k]) 0.000000001)))))))
)))))
(t/deftest parse-test-6 (t/deftest parse-test-6
(let [data (str "M3.078 3.548v16.9a.5.5 0 0 0 1 0v-16.9a.5.5 0 0 0-1 0ZM18.422 11.5" (let [data (str "M3.078 3.548v16.9a.5.5 0 0 0 1 0v-16.9a.5.5 0 0 0-1 0ZM18.422 11.5"
@ -314,7 +310,7 @@
(update entry :params #(into (sorted-map) %))))) (update entry :params #(into (sorted-map) %)))))
result2 (->> (svg.path.legacy2/parse data) result2 (->> (svg.path.legacy2/parse data)
(mapv (fn [entry] (mapv (fn [entry]
(update entry :params #(into (sorted-map) %)))))] (update entry :params #(into (sorted-map) %)))))]
(t/is (= 47 (t/is (= 47
(count result1) (count result1)
@ -325,15 +321,13 @@
(dotimes [i (count result1)] (dotimes [i (count result1)]
(let [item1 (nth result1 i) (let [item1 (nth result1 i)
item2 (nth result2 i) item2 (nth result2 i)]
]
(t/is (= (:command item1) (t/is (= (:command item1)
(:command item2))) (:command item2)))
(doseq [[k v] (:params item1)] (doseq [[k v] (:params item1)]
(t/is (mth/close? v (get-in item2 [:params k]) 0.000000001)) (t/is (mth/close? v (get-in item2 [:params k]) 0.000000001)))))
)))
#?(:cljs #?(:cljs
(let [result3 (svg.path.legacy1/parse data)] (let [result3 (svg.path.legacy1/parse data)]
@ -346,7 +340,7 @@
item3 (nth result2 i)] item3 (nth result2 i)]
(t/is (= (:command item1) (t/is (= (:command item1)
(:command item3))) (:command item3)))
(t/is (= (:params item1) (t/is (= (:params item1)
(:params item3))))))))) (:params item3)))))))))
@ -414,9 +408,7 @@
(dotimes [i (count result2)] (dotimes [i (count result2)]
(t/is (mth/close? (nth result2 i) (t/is (mth/close? (nth result2 i)
(nth expected2 i) (nth expected2 i)
0.000000000001))))) 0.000000000001)))))))
))
(t/deftest arc-to-bezier-2 (t/deftest arc-to-bezier-2
(let [expected1 [3.0779999999999994, (let [expected1 [3.0779999999999994,
@ -486,9 +478,7 @@
(dotimes [i (count result2)] (dotimes [i (count result2)]
(t/is (mth/close? (nth result2 i) (t/is (mth/close? (nth result2 i)
(nth expected2 i) (nth expected2 i)
0.000000000001))))) 0.000000000001)))))))
))
@ -553,8 +543,7 @@
(t/is (= (nth result 2) (t/is (= (nth result 2)
(nth expected 2))) (nth expected 2)))
(t/is (= (nth result 3) (t/is (= (nth result 3)
(nth expected 3))) (nth expected 3)))))
))
;; FOR POSSIBLE FUTURE TEST CASES ;; FOR POSSIBLE FUTURE TEST CASES
;; (str "M259.958 89.134c-6.88-.354-10.484-1.241-12.44-3.064-1.871-1.743-6.937-3.098-15.793-4.226-7.171-.913-17.179-2.279-22.24-3.034-5.06-.755-15.252-2.016-22.648-2.8-18.685-1.985-35.63-4.223-38.572-5.096-3.655-1.084-3.016-3.548.708-2.726 1.751.387 13.376 1.701 25.833 2.922 12.456 1.22 29.018 3.114 36.803 4.208 29.94 4.206 29.433 4.204 34.267.136 3.787-3.186 5.669-3.669 14.303-3.669 14.338 0 17.18 1.681 12.182 7.205-2.053 2.268-1.994 2.719.707 5.42 3.828 3.827 3.74 5.846-.238 5.5-1.752-.153-7.544-.502-12.872-.776zm7.563-3.194c0-.778-1.751-1.352-3.892-1.274l-3.893.141 3.539 1.133c1.946.624 3.698 1.197 3.893 1.275.194.077.354-.496.354-1.275zm-15.899-8.493c1.43-2.29 1.414-2.83-.084-2.83-2.05 0-5.25 2.76-5.25 4.529 0 2.226 3.599 1.08 5.334-1.699zm8.114 0c2.486-2.746 2.473-2.83-.438-2.83-1.65 0-3.683 1.273-4.516 2.83-1.175 2.196-1.077 2.831.438 2.831 1.075 0 3.107-1.274 4.516-2.83zm7.814.674c2.858-3.444.476-4.085-3.033-.816-2.451 2.284-2.677 2.973-.975 2.973 1.22 0 3.023-.97 4.008-2.157zm-49.571-4.509c-1.168-.43-3.294-1.802-4.725-3.051-2.112-1.843-9.304-2.595-38.219-3.994-46.474-2.25-63-4.077-60.27-6.665.324-.308 9.507.261 20.406 1.264 10.9 1.003 31.16 2.258 45.024 2.789l25.207.964 4.625-3.527c4.313-3.29 5.41-3.474 16.24-2.732 6.389.438 11.981 1.388 12.428 2.111.447.723-.517 2.73-2.141 4.46l-2.954 3.144c1.607 1.697 3.308 3.289 5.049 4.845 3.248 2.189-5.438 1.289-8.678 1.284-5.428-.061-10.825-.463-11.992-.892zm12.74-3.242c-1.123-.694-2.36-.943-2.75-.554-.389.39.21 1.275 1.334 1.97 1.122.693 2.36.942 2.749.553.389-.39-.21-1.275-1.334-1.97zm-5.663 0a1.42 1.42 0 00-1.415-1.416 1.42 1.42 0 00-1.416 1.416 1.42 1.42 0 001.416 1.415 1.42 1.42 0 001.415-1.415zm-8.464-6.404c.984-1.187 1.35-2.598.813-3.135-1.181-1.18-5.408 1.297-6.184 3.624-.806 2.42 3.265 2.048 5.37-.49zm6.863.258c.867-1.045 1.163-2.313.658-2.819-1.063-1.062-4.719 1.631-4.719 3.476 0 1.864 2.274 1.496 4.061-.657zm8.792-.36c1.637-1.972 1.448-2.197-1.486-1.77-1.848.27-3.622 1.287-3.943 2.26-.838 2.547 3.212 2.181 5.429-.49zm32.443-4.11c-6.156-2.228-67.1-6.138-119.124-7.642-39.208-1.134-72.072-.928-94.618.593-6.617.446-19.681 1.16-29.03 1.587-15.798.72-17.183.573-19.588-2.085-4.498-4.97-2.544-7.857 6.39-9.44 4.394-.778 9.164-2.436 10.6-3.685 5.44-4.729 20.332-14.06 31.14-19.509C65.717 11.88 78.955 7.79 103.837 3.08 121.686-.3 125.552-.642 129.318.82c2.44.948 12.4 1.948 22.132 2.221 15.37.432 20.004 1.18 35.294 5.698 22.36 6.606 39.732 15.1 56.55 27.653 7.307 5.452 14.086 9.913 15.066 9.913.98 0 2.148.956 2.596 2.124.55 1.432 2.798 2.123 6.914 2.123 6.213 0 12.4 3.046 12.38 6.096-.012 1.75-6.502 5.353-9.118 5.063-.818-.09-3.717-.972-6.442-1.958zm-16.986-7.436c0-1.575-33.326-18.118-43.173-21.43-23.008-7.739-54.084-12.922-77.136-12.866-16.863.041-37.877 3.628-52.465 8.956-18.062 6.596-26.563 10.384-29.181 13.002-1.205 1.205-5.306 3.769-9.112 5.698-7.754 3.929-8.841 5.482-3.029 4.325 13.494-2.685 66.794-3.773 110.913-2.264 38.005 1.3 96.812 4.435 102.122 5.443.584.111 1.061-.277 1.061-.864zm-236.39-3.18c0-.78-1.592-1.416-3.539-1.416-1.946 0-3.538.637-3.538 1.415 0 .779 1.592 1.416 3.538 1.416 1.947 0 3.54-.637 3.54-1.416zm7.078-1.416c0-.779-.956-1.416-2.124-1.416-1.167 0-2.123.637-2.123 1.416 0 .778.956 1.415 2.123 1.415 1.168 0 2.124-.637 2.124-1.415zm11.734-4.437c3.278-1.661 6.278-3.483 6.667-4.048 1.366-1.98 20.645-11.231 32.557-15.622 11.862-4.372 36.546-9.865 44.327-9.865 3.485 0 3.867-.404 3.012-3.185-.538-1.752-1.177-3.41-1.42-3.685-.907-1.026-36.72 7.16-45.065 10.302-17.226 6.484-47.566 24.27-47.566 27.886 0 1.786.845 1.585 7.488-1.783zm206.254-5.577c-12.298-10.518-53.842-27.166-70.896-28.41-5.526-.404-6.3-.097-6.695 2.655-.33 2.307.402 3.275 2.831 3.742 32.436 6.237 52.205 12.315 66.975 20.594 11.904 6.673 14.477 7.141 7.785 1.419zM150.1 11.04c-1.949-3.64-7.568-4.078-6.886-.538.256 1.329 2.054 2.817 3.997 3.309 4.498 1.137 4.816.832 2.888-2.771zm6.756.94c-.248-1.752-1.026-3.185-1.727-3.185-.7 0-1.493 1.433-1.76 3.185-.328 2.152.232 3.185 1.727 3.185 1.485 0 2.064-1.047 1.76-3.185zm-30.178-2.458c0-2.303-.908-3.694-2.627-4.025-3.6-.694-5.23 1.301-4.22 5.166 1.216 4.647 6.847 3.709 6.847-1.14zm12.544 2.104c-.448-1.168-1.224-2.132-1.725-2.142-.5-.013-2.343-.404-4.095-.873-2.569-.689-3.185-.274-3.185 2.142 0 2.476.854 2.996 4.91 2.996 3.783 0 4.723-.487 4.095-2.123z") ;; (str "M259.958 89.134c-6.88-.354-10.484-1.241-12.44-3.064-1.871-1.743-6.937-3.098-15.793-4.226-7.171-.913-17.179-2.279-22.24-3.034-5.06-.755-15.252-2.016-22.648-2.8-18.685-1.985-35.63-4.223-38.572-5.096-3.655-1.084-3.016-3.548.708-2.726 1.751.387 13.376 1.701 25.833 2.922 12.456 1.22 29.018 3.114 36.803 4.208 29.94 4.206 29.433 4.204 34.267.136 3.787-3.186 5.669-3.669 14.303-3.669 14.338 0 17.18 1.681 12.182 7.205-2.053 2.268-1.994 2.719.707 5.42 3.828 3.827 3.74 5.846-.238 5.5-1.752-.153-7.544-.502-12.872-.776zm7.563-3.194c0-.778-1.751-1.352-3.892-1.274l-3.893.141 3.539 1.133c1.946.624 3.698 1.197 3.893 1.275.194.077.354-.496.354-1.275zm-15.899-8.493c1.43-2.29 1.414-2.83-.084-2.83-2.05 0-5.25 2.76-5.25 4.529 0 2.226 3.599 1.08 5.334-1.699zm8.114 0c2.486-2.746 2.473-2.83-.438-2.83-1.65 0-3.683 1.273-4.516 2.83-1.175 2.196-1.077 2.831.438 2.831 1.075 0 3.107-1.274 4.516-2.83zm7.814.674c2.858-3.444.476-4.085-3.033-.816-2.451 2.284-2.677 2.973-.975 2.973 1.22 0 3.023-.97 4.008-2.157zm-49.571-4.509c-1.168-.43-3.294-1.802-4.725-3.051-2.112-1.843-9.304-2.595-38.219-3.994-46.474-2.25-63-4.077-60.27-6.665.324-.308 9.507.261 20.406 1.264 10.9 1.003 31.16 2.258 45.024 2.789l25.207.964 4.625-3.527c4.313-3.29 5.41-3.474 16.24-2.732 6.389.438 11.981 1.388 12.428 2.111.447.723-.517 2.73-2.141 4.46l-2.954 3.144c1.607 1.697 3.308 3.289 5.049 4.845 3.248 2.189-5.438 1.289-8.678 1.284-5.428-.061-10.825-.463-11.992-.892zm12.74-3.242c-1.123-.694-2.36-.943-2.75-.554-.389.39.21 1.275 1.334 1.97 1.122.693 2.36.942 2.749.553.389-.39-.21-1.275-1.334-1.97zm-5.663 0a1.42 1.42 0 00-1.415-1.416 1.42 1.42 0 00-1.416 1.416 1.42 1.42 0 001.416 1.415 1.42 1.42 0 001.415-1.415zm-8.464-6.404c.984-1.187 1.35-2.598.813-3.135-1.181-1.18-5.408 1.297-6.184 3.624-.806 2.42 3.265 2.048 5.37-.49zm6.863.258c.867-1.045 1.163-2.313.658-2.819-1.063-1.062-4.719 1.631-4.719 3.476 0 1.864 2.274 1.496 4.061-.657zm8.792-.36c1.637-1.972 1.448-2.197-1.486-1.77-1.848.27-3.622 1.287-3.943 2.26-.838 2.547 3.212 2.181 5.429-.49zm32.443-4.11c-6.156-2.228-67.1-6.138-119.124-7.642-39.208-1.134-72.072-.928-94.618.593-6.617.446-19.681 1.16-29.03 1.587-15.798.72-17.183.573-19.588-2.085-4.498-4.97-2.544-7.857 6.39-9.44 4.394-.778 9.164-2.436 10.6-3.685 5.44-4.729 20.332-14.06 31.14-19.509C65.717 11.88 78.955 7.79 103.837 3.08 121.686-.3 125.552-.642 129.318.82c2.44.948 12.4 1.948 22.132 2.221 15.37.432 20.004 1.18 35.294 5.698 22.36 6.606 39.732 15.1 56.55 27.653 7.307 5.452 14.086 9.913 15.066 9.913.98 0 2.148.956 2.596 2.124.55 1.432 2.798 2.123 6.914 2.123 6.213 0 12.4 3.046 12.38 6.096-.012 1.75-6.502 5.353-9.118 5.063-.818-.09-3.717-.972-6.442-1.958zm-16.986-7.436c0-1.575-33.326-18.118-43.173-21.43-23.008-7.739-54.084-12.922-77.136-12.866-16.863.041-37.877 3.628-52.465 8.956-18.062 6.596-26.563 10.384-29.181 13.002-1.205 1.205-5.306 3.769-9.112 5.698-7.754 3.929-8.841 5.482-3.029 4.325 13.494-2.685 66.794-3.773 110.913-2.264 38.005 1.3 96.812 4.435 102.122 5.443.584.111 1.061-.277 1.061-.864zm-236.39-3.18c0-.78-1.592-1.416-3.539-1.416-1.946 0-3.538.637-3.538 1.415 0 .779 1.592 1.416 3.538 1.416 1.947 0 3.54-.637 3.54-1.416zm7.078-1.416c0-.779-.956-1.416-2.124-1.416-1.167 0-2.123.637-2.123 1.416 0 .778.956 1.415 2.123 1.415 1.168 0 2.124-.637 2.124-1.415zm11.734-4.437c3.278-1.661 6.278-3.483 6.667-4.048 1.366-1.98 20.645-11.231 32.557-15.622 11.862-4.372 36.546-9.865 44.327-9.865 3.485 0 3.867-.404 3.012-3.185-.538-1.752-1.177-3.41-1.42-3.685-.907-1.026-36.72 7.16-45.065 10.302-17.226 6.484-47.566 24.27-47.566 27.886 0 1.786.845 1.585 7.488-1.783zm206.254-5.577c-12.298-10.518-53.842-27.166-70.896-28.41-5.526-.404-6.3-.097-6.695 2.655-.33 2.307.402 3.275 2.831 3.742 32.436 6.237 52.205 12.315 66.975 20.594 11.904 6.673 14.477 7.141 7.785 1.419zM150.1 11.04c-1.949-3.64-7.568-4.078-6.886-.538.256 1.329 2.054 2.817 3.997 3.309 4.498 1.137 4.816.832 2.888-2.771zm6.756.94c-.248-1.752-1.026-3.185-1.727-3.185-.7 0-1.493 1.433-1.76 3.185-.328 2.152.232 3.185 1.727 3.185 1.485 0 2.064-1.047 1.76-3.185zm-30.178-2.458c0-2.303-.908-3.694-2.627-4.025-3.6-.694-5.23 1.301-4.22 5.166 1.216 4.647 6.847 3.709 6.847-1.14zm12.544 2.104c-.448-1.168-1.224-2.132-1.725-2.142-.5-.013-2.343-.404-4.095-.873-2.569-.689-3.185-.274-3.185 2.142 0 2.476.854 2.996 4.91 2.996 3.783 0 4.723-.487 4.095-2.123z")

View file

@ -8,8 +8,8 @@
(:require (:require
[app.common.data :as d] [app.common.data :as d]
[app.common.text :as txt] [app.common.text :as txt]
[clojure.test :as t :include-macros true] [clojure.pprint :refer [pprint]]
[clojure.pprint :refer [pprint]])) [clojure.test :as t :include-macros true]))
(t/deftest test-basic-conversion-roundtrip (t/deftest test-basic-conversion-roundtrip
(let [text "qwqw 🠒" (let [text "qwqw 🠒"

View file

@ -28,51 +28,51 @@
(t/use-fixtures :each thf/reset-idmap!) (t/use-fixtures :each thf/reset-idmap!)
#_(t/deftest test-absorb-components #_(t/deftest test-absorb-components
(let [library-id (uuid/custom 1 1) (let [library-id (uuid/custom 1 1)
library-page-id (uuid/custom 2 2) library-page-id (uuid/custom 2 2)
file-id (uuid/custom 3 3) file-id (uuid/custom 3 3)
file-page-id (uuid/custom 4 4) file-page-id (uuid/custom 4 4)
library (-> (thf/sample-file library-id library-page-id {:is-shared true}) library (-> (thf/sample-file library-id library-page-id {:is-shared true})
(thf/sample-shape :group1 (thf/sample-shape :group1
:group :group
library-page-id library-page-id
{:name "Group1"}) {:name "Group1"})
(thf/sample-shape :shape1 (thf/sample-shape :shape1
:rect :rect
library-page-id library-page-id
{:name "Rect1" {:name "Rect1"
:parent-id (thf/id :group1)}) :parent-id (thf/id :group1)})
(thf/sample-component :component1 (thf/sample-component :component1
library-page-id library-page-id
(thf/id :group1))) (thf/id :group1)))
file (-> (thf/sample-file file-id file-page-id) file (-> (thf/sample-file file-id file-page-id)
(thf/sample-instance :instance1 (thf/sample-instance :instance1
file-page-id file-page-id
library library
(thf/id :component1))) (thf/id :component1)))
absorbed-file (ctf/update-file-data absorbed-file (ctf/update-file-data
file file
#(ctf/absorb-assets % (:data library))) #(ctf/absorb-assets % (:data library)))
pages (ctpl/pages-seq (ctf/file-data absorbed-file)) pages (ctpl/pages-seq (ctf/file-data absorbed-file))
components (ctkl/components-seq (ctf/file-data absorbed-file)) components (ctkl/components-seq (ctf/file-data absorbed-file))
shapes-1 (ctn/shapes-seq (first pages)) shapes-1 (ctn/shapes-seq (first pages))
shapes-2 (ctn/shapes-seq (second pages)) shapes-2 (ctn/shapes-seq (second pages))
[[p-group p-shape] [c-group1 c-shape1] component1] [[p-group p-shape] [c-group1 c-shape1] component1]
(thk/resolve-instance-and-main (thk/resolve-instance-and-main
(first pages) (first pages)
(:id (second shapes-1)) (:id (second shapes-1))
{file-id absorbed-file}) {file-id absorbed-file})
[[lp-group lp-shape] [c-group2 c-shape2] component2] [[lp-group lp-shape] [c-group2 c-shape2] component2]
(thk/resolve-instance-and-main (thk/resolve-instance-and-main
(second pages) (second pages)
(:id (second shapes-2)) (:id (second shapes-2))
{file-id absorbed-file})] {file-id absorbed-file})]
;; Uncomment to debug ;; Uncomment to debug
@ -100,20 +100,20 @@
;; {file-id absorbed-file} ;; {file-id absorbed-file}
;; false) ;; false)
(t/is (= (count pages) 2)) (t/is (= (count pages) 2))
(t/is (= (:name (first pages)) "Page 1")) (t/is (= (:name (first pages)) "Page 1"))
(t/is (= (:name (second pages)) "Library backup")) (t/is (= (:name (second pages)) "Library backup"))
(t/is (= (count components) 1)) (t/is (= (count components) 1))
(t/is (= (:name p-group) "Group1")) (t/is (= (:name p-group) "Group1"))
(t/is (ctk/instance-of? p-group file-id (:id component1))) (t/is (ctk/instance-of? p-group file-id (:id component1)))
(t/is (not (:main-instance? p-group))) (t/is (not (:main-instance? p-group)))
(t/is (not (ctk/main-instance-of? (:id p-group) file-page-id component1))) (t/is (not (ctk/main-instance-of? (:id p-group) file-page-id component1)))
(t/is (ctk/is-main-of? c-group1 p-group)) (t/is (ctk/is-main-of? c-group1 p-group))
(t/is (= (:name p-shape) "Rect1")) (t/is (= (:name p-shape) "Rect1"))
(t/is (ctk/is-main-of? c-shape1 p-shape)))) (t/is (ctk/is-main-of? c-shape1 p-shape))))
(t/deftest test-absorb-colors (t/deftest test-absorb-colors
@ -137,8 +137,8 @@
:fill-color-ref-file library-id}]})) :fill-color-ref-file library-id}]}))
absorbed-file (ctf/update-file-data absorbed-file (ctf/update-file-data
file file
#(ctf/absorb-assets % (:data library))) #(ctf/absorb-assets % (:data library)))
colors (ctcl/colors-seq (ctf/file-data absorbed-file)) colors (ctcl/colors-seq (ctf/file-data absorbed-file))
page (ctpl/get-page (ctf/file-data absorbed-file) file-page-id) page (ctpl/get-page (ctf/file-data absorbed-file) file-page-id)
@ -187,11 +187,10 @@
:text-decoration "none" :text-decoration "none"
:letter-spacing "0" :letter-spacing "0"
:fills [{:fill-color "#000000" :fills [{:fill-color "#000000"
:fill-opacity 1}]}] :fill-opacity 1}]}]}]}]}}))
}]}]}}))
absorbed-file (ctf/update-file-data absorbed-file (ctf/update-file-data
file file
#(ctf/absorb-assets % (:data library))) #(ctf/absorb-assets % (:data library)))
typographies (ctyl/typographies-seq (ctf/file-data absorbed-file)) typographies (ctyl/typographies-seq (ctf/file-data absorbed-file))
page (ctpl/get-page (ctf/file-data absorbed-file) file-page-id) page (ctpl/get-page (ctf/file-data absorbed-file) file-page-id)

View file

@ -6,10 +6,10 @@
(ns common-tests.types-modifiers-test (ns common-tests.types-modifiers-test
(:require (:require
[clojure.test :as t]
[app.common.geom.matrix :as gmt] [app.common.geom.matrix :as gmt]
[app.common.geom.point :as gpt] [app.common.geom.point :as gpt]
[app.common.types.modifiers :as ctm])) [app.common.types.modifiers :as ctm]
[clojure.test :as t]))
(t/deftest test-modifiers->transform (t/deftest test-modifiers->transform
(let [modifiers (let [modifiers

View file

@ -6,11 +6,11 @@
(ns common-tests.types-shape-interactions-test (ns common-tests.types-shape-interactions-test
(:require (:require
[app.common.math :as mth]
[app.common.exceptions :as ex] [app.common.exceptions :as ex]
[app.common.geom.point :as gpt] [app.common.geom.point :as gpt]
[app.common.geom.rect :as grc] [app.common.geom.rect :as grc]
[app.common.geom.shapes :as gsh] [app.common.geom.shapes :as gsh]
[app.common.math :as mth]
[app.common.types.shape :as cts] [app.common.types.shape :as cts]
[app.common.types.shape.interactions :as ctsi] [app.common.types.shape.interactions :as ctsi]
[app.common.uuid :as uuid] [app.common.uuid :as uuid]
@ -48,8 +48,7 @@
new-interaction new-interaction
(ctsi/set-event-type interaction :after-delay frame)] (ctsi/set-event-type interaction :after-delay frame)]
(t/is (= :after-delay (:event-type new-interaction))) (t/is (= :after-delay (:event-type new-interaction)))
(t/is (= 300 (:delay new-interaction))))) (t/is (= 300 (:delay new-interaction)))))))
))
(t/deftest set-action-type (t/deftest set-action-type

View file

@ -6,13 +6,13 @@
(ns common-tests.types-test (ns common-tests.types-test
(:require (:require
[clojure.test :as t]
[app.common.schema :as sm] [app.common.schema :as sm]
[app.common.schema.generators :as sg] [app.common.schema.generators :as sg]
[app.common.transit :as transit] [app.common.transit :as transit]
[app.common.types.shape :as cts] [app.common.types.file :as ctf]
[app.common.types.page :as ctp] [app.common.types.page :as ctp]
[app.common.types.file :as ctf])) [app.common.types.shape :as cts]
[clojure.test :as t]))
(t/deftest transit-encode-decode-with-shape (t/deftest transit-encode-decode-with-shape
(sg/check! (sg/check!