mirror of
https://github.com/penpot/penpot.git
synced 2026-08-28 23:59:00 +00:00
Merge pull request #7665 from penpot/superalex-fix-texts-migrations
🐛 Fix texts migrations
This commit is contained in:
commit
b867f276f2
@ -1413,17 +1413,27 @@
|
|||||||
(defmethod migrate-data "0006-fix-old-texts-fills"
|
(defmethod migrate-data "0006-fix-old-texts-fills"
|
||||||
[data _]
|
[data _]
|
||||||
(letfn [(fix-fills [node]
|
(letfn [(fix-fills [node]
|
||||||
(let [fills (if (and (not (seq (:fills node)))
|
(let [;; In the old format refs were strings
|
||||||
(or (some? (:fill-color node))
|
sanitize-uuid
|
||||||
(some? (:fill-opacity node))
|
(fn [o]
|
||||||
(some? (:fill-color-gradient node))))
|
(if (uuid? o)
|
||||||
[(d/without-nils (select-keys node [:fill-color :fill-opacity :fill-color-gradient
|
o
|
||||||
:fill-color-ref-id :fill-color-ref-file]))]
|
(uuid/parse* o)))
|
||||||
(:fills node))]
|
|
||||||
(-> node
|
fills
|
||||||
(assoc :fills fills)
|
(if (and (not (seq (:fills node)))
|
||||||
(dissoc :fill-color :fill-opacity :fill-color-gradient
|
(or (some? (:fill-color node))
|
||||||
:fill-color-ref-id :fill-color-ref-file))))
|
(some? (:fill-opacity node))
|
||||||
|
(some? (:fill-color-gradient node))))
|
||||||
|
[(-> (select-keys node types.fills/fill-attrs)
|
||||||
|
(update :fill-color-ref-file sanitize-uuid)
|
||||||
|
(update :fill-color-ref-id sanitize-uuid)
|
||||||
|
(d/without-nils))]
|
||||||
|
(:fills node))]
|
||||||
|
|
||||||
|
(reduce dissoc
|
||||||
|
(assoc node :fills fills)
|
||||||
|
types.fills/fill-attrs)))
|
||||||
|
|
||||||
(update-object [object]
|
(update-object [object]
|
||||||
(if (cfh/text-shape? object)
|
(if (cfh/text-shape? object)
|
||||||
@ -1687,6 +1697,68 @@
|
|||||||
(update :pages-index d/update-vals update-container)
|
(update :pages-index d/update-vals update-container)
|
||||||
(d/update-when :components d/update-vals update-container))))
|
(d/update-when :components d/update-vals update-container))))
|
||||||
|
|
||||||
|
;; Copy fills from position-data to text nodes when all text nodes lack fills,
|
||||||
|
;; all position-data have fills, and the counts match
|
||||||
|
(defmethod migrate-data "0016-copy-fills-from-position-data-to-text-node"
|
||||||
|
[data _]
|
||||||
|
(letfn [(get-text-nodes [content]
|
||||||
|
;; Get all leaf text nodes from the content tree
|
||||||
|
(when content
|
||||||
|
(->> (types.text/node-seq types.text/is-text-node? content)
|
||||||
|
(seq))))
|
||||||
|
|
||||||
|
(update-content [content fills-map]
|
||||||
|
;; Transform the content tree to update text nodes with their corresponding fills
|
||||||
|
;; fills-map is a map from text node to its fills
|
||||||
|
(types.text/transform-nodes
|
||||||
|
types.text/is-text-node?
|
||||||
|
(fn [text-node]
|
||||||
|
(if-let [fills (get fills-map text-node)]
|
||||||
|
(assoc text-node :fills fills)
|
||||||
|
text-node))
|
||||||
|
content))
|
||||||
|
|
||||||
|
(update-object [object]
|
||||||
|
(if (cfh/text-shape? object)
|
||||||
|
(let [content (:content object)
|
||||||
|
position-data (:position-data object)
|
||||||
|
text-nodes (get-text-nodes content)]
|
||||||
|
|
||||||
|
;; Check if conditions are met:
|
||||||
|
;; 1. Has at least one text node
|
||||||
|
;; 2. All text nodes have no fills or empty fills
|
||||||
|
;; 3. Has at least one position-data entry
|
||||||
|
;; 4. All position-data have fills
|
||||||
|
;; 5. The number of text nodes matches the number of position-data
|
||||||
|
(if (and (seq text-nodes)
|
||||||
|
(seq position-data)
|
||||||
|
(= (count text-nodes) (count position-data))
|
||||||
|
(every? (fn [text-node]
|
||||||
|
(let [fills (:fills text-node)]
|
||||||
|
(or (nil? fills) (empty? fills))))
|
||||||
|
text-nodes)
|
||||||
|
(every? (fn [pd]
|
||||||
|
(let [fills (:fills pd)]
|
||||||
|
(and (some? fills) (seq fills))))
|
||||||
|
position-data))
|
||||||
|
|
||||||
|
;; Apply the migration: create a map from each text node to its corresponding fills
|
||||||
|
(let [fills-map (zipmap text-nodes (map :fills position-data))]
|
||||||
|
(update object :content #(update-content % fills-map)))
|
||||||
|
|
||||||
|
;; Don't modify if conditions aren't met
|
||||||
|
object))
|
||||||
|
|
||||||
|
;; Not a text shape, return as-is
|
||||||
|
object))
|
||||||
|
|
||||||
|
(update-container [container]
|
||||||
|
(d/update-when container :objects d/update-vals update-object))]
|
||||||
|
|
||||||
|
(-> data
|
||||||
|
(update :pages-index d/update-vals update-container)
|
||||||
|
(d/update-when :components d/update-vals update-container))))
|
||||||
|
|
||||||
(def available-migrations
|
(def available-migrations
|
||||||
(into (d/ordered-set)
|
(into (d/ordered-set)
|
||||||
["legacy-2"
|
["legacy-2"
|
||||||
@ -1759,4 +1831,5 @@
|
|||||||
"0013-clear-invalid-strokes-and-fills"
|
"0013-clear-invalid-strokes-and-fills"
|
||||||
"0014-fix-tokens-lib-duplicate-ids"
|
"0014-fix-tokens-lib-duplicate-ids"
|
||||||
"0014-clear-components-nil-objects"
|
"0014-clear-components-nil-objects"
|
||||||
"0015-fix-text-attrs-blank-strings"]))
|
"0015-fix-text-attrs-blank-strings"
|
||||||
|
"0016-copy-fills-from-position-data-to-text-node"]))
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user