mirror of
https://github.com/penpot/penpot.git
synced 2025-02-09 00:28:20 -05:00
🐛 Fix rasterizer not loading embedded styles
This commit is contained in:
parent
79c2a6c5d5
commit
5ad31a878b
2 changed files with 47 additions and 11 deletions
|
@ -96,10 +96,16 @@
|
||||||
:method :get
|
:method :get
|
||||||
:mode :cors
|
:mode :cors
|
||||||
:omit-default-headers true})
|
:omit-default-headers true})
|
||||||
(rx/map :body)
|
(rx/catch (fn [cause]
|
||||||
|
(log/error :hint "fetching data uri"
|
||||||
|
:cause cause)
|
||||||
|
(rx/of nil)))
|
||||||
|
(rx/mapcat (fn [response]
|
||||||
|
(if (nil? response)
|
||||||
|
(rx/of uri)
|
||||||
|
(->> (rx/of (:body response))
|
||||||
(rx/mapcat wapi/read-file-as-data-url)
|
(rx/mapcat wapi/read-file-as-data-url)
|
||||||
(rx/tap (fn [data-uri]
|
(rx/tap (fn [data-uri] (.set data-uri-cache uri (wapi/create-blob data-uri "text/plain")))))))))))
|
||||||
(.set data-uri-cache uri (wapi/create-blob data-uri "text/plain")))))))
|
|
||||||
|
|
||||||
(defn- svg-update-image!
|
(defn- svg-update-image!
|
||||||
"Updates an image in an SVG to a Data URI."
|
"Updates an image in an SVG to a Data URI."
|
||||||
|
@ -128,27 +134,53 @@
|
||||||
(dom/append-child! style (dom/create-text svg styles))
|
(dom/append-child! style (dom/create-text svg styles))
|
||||||
(dom/append-child! doc style)))
|
(dom/append-child! doc style)))
|
||||||
|
|
||||||
(defn- svg-resolve-styles!
|
(defn- svg-resolve-external-resources
|
||||||
"Resolves all fonts in an SVG to Data URIs."
|
"Resolves all external resources in an SVG to Data URIs."
|
||||||
[svg styles]
|
[styles]
|
||||||
(->> (rx/from (re-seq #"url\((https?://[^)]+)\)" styles))
|
(->> (rx/from (re-seq #"url\((https?://[^)]+)\)" styles))
|
||||||
(rx/map second)
|
(rx/map second)
|
||||||
(rx/mapcat (fn [url]
|
(rx/mapcat (fn [url]
|
||||||
(->> (fetch-as-data-uri url)
|
(->> (fetch-as-data-uri url)
|
||||||
(rx/map (fn [uri] [url uri])))))
|
(rx/map (fn [uri] [url uri])))))
|
||||||
|
|
||||||
(rx/reduce (fn [styles [url uri]]
|
(rx/reduce (fn [styles [url uri]]
|
||||||
(str/replace styles url uri))
|
(str/replace styles url uri))
|
||||||
styles)
|
styles)))
|
||||||
|
|
||||||
|
(defn- svg-resolve-styles!
|
||||||
|
"Resolves all fonts in an SVG to Data URIs."
|
||||||
|
[svg styles]
|
||||||
|
(->> (svg-resolve-external-resources styles)
|
||||||
(rx/tap (partial svg-add-style! svg))
|
(rx/tap (partial svg-add-style! svg))
|
||||||
(rx/ignore)))
|
(rx/ignore)))
|
||||||
|
|
||||||
|
(defn- svg-resolve-inline-styles!
|
||||||
|
"Resolves all inline styles in an SVG to Data URIs."
|
||||||
|
[svg]
|
||||||
|
(->> (rx/from (dom/query-all svg "[style]"))
|
||||||
|
(rx/mapcat (fn [node]
|
||||||
|
(let [styles (dom/get-attribute node "style")]
|
||||||
|
(->> (svg-resolve-external-resources styles)
|
||||||
|
(rx/tap (fn [styles] (dom/set-attribute! node "style" styles)))))))
|
||||||
|
(rx/ignore)))
|
||||||
|
|
||||||
|
(defn- svg-resolve-style-elements!
|
||||||
|
"Resolves all style elements in an SVG to Data URIs."
|
||||||
|
[svg]
|
||||||
|
(->> (rx/from (dom/query-all svg "style"))
|
||||||
|
(rx/mapcat (fn [node]
|
||||||
|
(let [styles (dom/get-text node)]
|
||||||
|
(->> (svg-resolve-external-resources styles)
|
||||||
|
(rx/tap (fn [styles] (dom/set-text! node styles)))))))
|
||||||
|
(rx/ignore)))
|
||||||
|
|
||||||
(defn- svg-resolve-all!
|
(defn- svg-resolve-all!
|
||||||
"Resolves all images and fonts in an SVG to Data URIs."
|
"Resolves all images and fonts in an SVG to Data URIs."
|
||||||
[svg styles]
|
[svg styles]
|
||||||
(rx/concat
|
(rx/concat
|
||||||
(svg-resolve-images! svg)
|
(svg-resolve-images! svg)
|
||||||
(svg-resolve-styles! svg styles)
|
(svg-resolve-styles! svg styles)
|
||||||
|
(svg-resolve-inline-styles! svg)
|
||||||
|
(svg-resolve-style-elements! svg)
|
||||||
(rx/of svg)))
|
(rx/of svg)))
|
||||||
|
|
||||||
(defn- svg-parse
|
(defn- svg-parse
|
||||||
|
|
|
@ -504,6 +504,10 @@
|
||||||
(.setAttribute node property value))
|
(.setAttribute node property value))
|
||||||
node)
|
node)
|
||||||
|
|
||||||
|
(defn get-text [^js node]
|
||||||
|
(when (some? node)
|
||||||
|
(.-textContent node)))
|
||||||
|
|
||||||
(defn set-text! [^js node text]
|
(defn set-text! [^js node text]
|
||||||
(when (some? node)
|
(when (some? node)
|
||||||
(set! (.-textContent node) text))
|
(set! (.-textContent node) text))
|
||||||
|
|
Loading…
Add table
Reference in a new issue