From 0756de25f821354b2392dfd4097cc3455f6311e9 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Wed, 24 Mar 2021 17:28:57 +0100 Subject: [PATCH 1/5] :sparkles: Paths improvements --- .../app/main/ui/workspace/shapes/outline.cljs | 8 +- frontend/src/app/util/geom/path.cljs | 133 +++++++++++------- 2 files changed, 88 insertions(+), 53 deletions(-) diff --git a/frontend/src/app/main/ui/workspace/shapes/outline.cljs b/frontend/src/app/main/ui/workspace/shapes/outline.cljs index 102d761cf..13ad2d5a6 100644 --- a/frontend/src/app/main/ui/workspace/shapes/outline.cljs +++ b/frontend/src/app/main/ui/workspace/shapes/outline.cljs @@ -24,6 +24,12 @@ shape (unchecked-get props "shape") color (unchecked-get props "color") transform (gsh/transform-matrix shape) + path? (= :path (:type shape)) + path-data + (mf/use-memo + (mf/deps shape) + #(when path? (ugp/content->path (:content shape)))) + {:keys [id x y width height]} shape outline-type (case (:type shape) @@ -45,7 +51,7 @@ :ry (/ height 2)} :path - {:d (ugp/content->path (:content shape)) + {:d path-data :transform nil} {:x x diff --git a/frontend/src/app/util/geom/path.cljs b/frontend/src/app/util/geom/path.cljs index 0cfcfad82..206fc5b6c 100644 --- a/frontend/src/app/util/geom/path.cljs +++ b/frontend/src/app/util/geom/path.cljs @@ -22,9 +22,8 @@ (let [handler-vector (gpt/to-vec point handler)] (gpt/add point (gpt/negate handler-vector)))) -;;; - (defn simplify + "Simplifies a drawing done with the pen tool" ([points] (simplify points 0.1)) ([points tolerance] @@ -68,26 +67,41 @@ (cond-> result (not (empty? current)) (conj current)))))) -(defn command->param-list [{:keys [command params]}] - (case command - (:move-to :line-to :smooth-quadratic-bezier-curve-to) - (let [{:keys [x y]} params] [x y]) +(defn command->param-list [command] + (let [params (:params command)] + (case (:command command) + (:move-to :line-to :smooth-quadratic-bezier-curve-to) + (str (:x params) "," + (:y params)) - :close-path - [] + :close-path + "" - (:line-to-horizontal :line-to-vertical) - (let [{:keys [value]} params] [value]) + (:line-to-horizontal :line-to-vertical) + (str (:value params)) - :curve-to - (let [{:keys [c1x c1y c2x c2y x y]} params] [c1x c1y c2x c2y x y]) + :curve-to + (str (:c1x params) "," + (:c1y params) "," + (:c2x params) "," + (:c2y params) "," + (:x params) "," + (:y params)) - (:smooth-curve-to :quadratic-bezier-curve-to) - (let [{:keys [cx cy x y]} params] [cx cy x y]) + (:smooth-curve-to :quadratic-bezier-curve-to) + (str (:cx params) "," + (:cy params) "," + (:x params) "," + (:y params)) - :elliptical-arc - (let [{:keys [rx ry x-axis-rotation large-arc-flag sweep-flag x y]} params] - [rx ry x-axis-rotation large-arc-flag sweep-flag x y]))) + :elliptical-arc + (str (:rx params) "," + (:ry params) "," + (:x-axis-rotation params) "," + (:large-arc-flag params) "," + (:sweep-flag params) "," + (:x params) "," + (:y params))))) ;; Path specification ;; https://www.w3.org/TR/SVG11/paths.html @@ -97,10 +111,15 @@ (let [relative (str/starts-with? cmd "m") param-list (extract-params cmd [[:x :number] [:y :number]])] - (for [params param-list] - {:command :move-to - :relative relative - :params params}))) + + (d/concat [{:command :move-to + :relative relative + :params (first param-list)}] + + (for [params (rest param-list)] + {:command :line-to + :relative relative + :params params})))) (defmethod parse-command "Z" [cmd] [{:command :close-path}]) @@ -156,7 +175,7 @@ :params params}))) (defmethod parse-command "Q" [cmd] - (let [relative (str/starts-with? cmd "s") + (let [relative (str/starts-with? cmd "q") param-list (extract-params cmd [[:cx :number] [:cy :number] [:x :number] @@ -203,7 +222,7 @@ :elliptical-arc "A") command-str (if relative (str/lower command-str) command-str) param-list (command->param-list entry)] - (str/fmt "%s%s" command-str (str/join " " param-list)))) + (str command-str param-list))) (defn cmd-pos [prev-pos {:keys [relative params]}] (let [{:keys [x y] :or {x (:x prev-pos) y (:y prev-pos)}} params] @@ -253,31 +272,35 @@ "Removes some commands and convert relative to absolute coordinates" [commands] (let [simplify-command - ;; prev-cc : previous command control point for cubic beziers - ;; prev-qc : previous command control point for quadratic curves - (fn [[pos result prev-cc prev-qc] [command prev]] - (let [command + ;; prev-pos : previous position for the current path. Necesary for relative commands + ;; prev-start : previous move-to necesary for Z commands + ;; prev-cc : previous command control point for cubic beziers + ;; prev-qc : previous command control point for quadratic curves + (fn [[result prev-pos prev-start prev-cc prev-qc] [command prev]] + (let [command (assoc command :prev-pos prev-pos) + + command (cond-> command (:relative command) (-> (assoc :relative false) - (d/update-in-when [:params :c1x] + (:x pos)) - (d/update-in-when [:params :c1y] + (:y pos)) + (d/update-in-when [:params :c1x] + (:x prev-pos)) + (d/update-in-when [:params :c1y] + (:y prev-pos)) - (d/update-in-when [:params :c2x] + (:x pos)) - (d/update-in-when [:params :c2y] + (:y pos)) + (d/update-in-when [:params :c2x] + (:x prev-pos)) + (d/update-in-when [:params :c2y] + (:y prev-pos)) - (d/update-in-when [:params :cx] + (:x pos)) - (d/update-in-when [:params :cy] + (:y pos)) + (d/update-in-when [:params :cx] + (:x prev-pos)) + (d/update-in-when [:params :cy] + (:y prev-pos)) - (d/update-in-when [:params :x] + (:x pos)) - (d/update-in-when [:params :y] + (:y pos)) + (d/update-in-when [:params :x] + (:x prev-pos)) + (d/update-in-when [:params :y] + (:y prev-pos)) (cond-> (= :line-to-horizontal (:command command)) - (d/update-in-when [:params :value] + (:x pos)) + (d/update-in-when [:params :value] + (:x prev-pos)) (= :line-to-vertical (:command command)) - (d/update-in-when [:params :value] + (:y pos))))) + (d/update-in-when [:params :value] + (:y prev-pos))))) params (:params command) orig-command command @@ -288,33 +311,33 @@ (-> (assoc :command :line-to) (update :params dissoc :value) (assoc-in [:params :x] (:value params)) - (assoc-in [:params :y] (:y pos))) + (assoc-in [:params :y] (:y prev-pos))) (= :line-to-vertical (:command command)) (-> (assoc :command :line-to) (update :params dissoc :value) (assoc-in [:params :y] (:value params)) - (assoc-in [:params :x] (:x pos))) + (assoc-in [:params :x] (:x prev-pos))) (= :smooth-curve-to (:command command)) (-> (assoc :command :curve-to) (update :params dissoc :cx :cy) - (update :params merge (smooth->curve command pos prev-cc))) + (update :params merge (smooth->curve command prev-pos prev-cc))) (= :quadratic-bezier-curve-to (:command command)) (-> (assoc :command :curve-to) (update :params dissoc :cx :cy) - (update :params merge (quadratic->curve pos (gpt/point params) (gpt/point (:cx params) (:cy params))))) + (update :params merge (quadratic->curve prev-pos (gpt/point params) (gpt/point (:cx params) (:cy params))))) (= :smooth-quadratic-bezier-curve-to (:command command)) (-> (assoc :command :curve-to) - (update :params merge (quadratic->curve pos (gpt/point params) (calculate-opposite-handler pos prev-qc))))) + (update :params merge (quadratic->curve prev-pos (gpt/point params) (calculate-opposite-handler prev-pos prev-qc))))) result (if (= :elliptical-arc (:command command)) - (d/concat result (arc->beziers pos command)) + (d/concat result (arc->beziers prev-pos command)) (conj result command)) - prev-cc (case (:command orig-command) + next-cc (case (:command orig-command) :smooth-curve-to (gpt/point (get-in orig-command [:params :cx]) (get-in orig-command [:params :cy])) @@ -326,23 +349,29 @@ (gpt/point (get-in orig-command [:params :x]) (get-in orig-command [:params :y]))) - prev-qc (case (:command orig-command) + next-qc (case (:command orig-command) :quadratic-bezier-curve-to (gpt/point (get-in orig-command [:params :cx]) (get-in orig-command [:params :cy])) :smooth-quadratic-bezier-curve-to - (calculate-opposite-handler pos prev-qc) + (calculate-opposite-handler prev-pos prev-qc) - (gpt/point (get-in orig-command [:params :x]) (get-in orig-command [:params :y])))] - [(cmd-pos pos command) result prev-cc prev-qc])) + (gpt/point (get-in orig-command [:params :x]) (get-in orig-command [:params :y]))) + + next-pos (if (= :close-path (:command command)) + prev-start + (cmd-pos prev-pos command)) + + next-start (if (= :move-to (:command command)) next-pos prev-start)] + + [result next-pos next-start next-cc next-qc])) start (first commands) start-pos (gpt/point (:params start))] - (->> (map vector (rest commands) commands) - (reduce simplify-command [start-pos [start] start-pos start-pos]) - (second)))) + (reduce simplify-command [[start] start-pos start-pos start-pos start-pos]) + (first)))) (defn path->content [string] (let [clean-string (-> string @@ -357,7 +386,7 @@ (defn content->path [content] (->> content - (map command->string) + (mapv command->string) (str/join ""))) (defn make-curve-params From 92e07c3b543dac9861ff6590be320e3b2fbb3782 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Wed, 24 Mar 2021 17:29:36 +0100 Subject: [PATCH 2/5] :bug: Fix problem when upload image after zoom --- frontend/src/app/main/ui/workspace/viewport/actions.cljs | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/app/main/ui/workspace/viewport/actions.cljs b/frontend/src/app/main/ui/workspace/viewport/actions.cljs index b8ca894f1..2c4c29a39 100644 --- a/frontend/src/app/main/ui/workspace/viewport/actions.cljs +++ b/frontend/src/app/main/ui/workspace/viewport/actions.cljs @@ -385,6 +385,7 @@ (defn on-drop [file viewport-ref zoom] (let [on-image-uploaded (on-image-uploaded)] (mf/use-callback + (mf/deps zoom) (fn [event] (dom/prevent-default event) (let [point (gpt/point (.-clientX event) (.-clientY event)) From c3804005780ee6112ab6d3ed357532f1917b0fc5 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Wed, 24 Mar 2021 17:31:16 +0100 Subject: [PATCH 3/5] :sparkles: SVG import enhancements --- .../app/main/data/workspace/svg_upload.cljs | 87 +-- frontend/src/app/main/ui/shapes/group.cljs | 28 +- frontend/src/app/main/ui/shapes/svg_defs.cljs | 12 +- frontend/src/app/util/svg.cljs | 638 ++++++++++++++---- 4 files changed, 584 insertions(+), 181 deletions(-) diff --git a/frontend/src/app/main/data/workspace/svg_upload.cljs b/frontend/src/app/main/data/workspace/svg_upload.cljs index cb4c95563..0a2ad2205 100644 --- a/frontend/src/app/main/data/workspace/svg_upload.cljs +++ b/frontend/src/app/main/data/workspace/svg_upload.cljs @@ -164,27 +164,28 @@ (gsh/setup-selrect)))) (defn create-path-shape [name frame-id svg-data {:keys [attrs] :as data}] - (let [svg-transform (usvg/parse-transform (:transform attrs)) - path-content (ugp/path->content (:d attrs)) - content (cond-> path-content - svg-transform - (gsh/transform-content svg-transform)) + (when (and (contains? attrs :d) (not (empty? (:d attrs)) )) + (let [svg-transform (usvg/parse-transform (:transform attrs)) + path-content (ugp/path->content (:d attrs)) + content (cond-> path-content + svg-transform + (gsh/transform-content svg-transform)) - selrect (gsh/content->selrect content) - points (gsh/rect->points selrect) + selrect (gsh/content->selrect content) + points (gsh/rect->points selrect) - origin (gpt/negate (gpt/point svg-data))] - (-> {:id (uuid/next) - :type :path - :name name - :frame-id frame-id - :content content - :selrect selrect - :points points} - (assoc :svg-viewbox (select-keys selrect [:x :y :width :height])) - (assoc :svg-attrs (dissoc attrs :d :transform)) - (assoc :svg-transform svg-transform) - (gsh/translate-to-frame origin)))) + origin (gpt/negate (gpt/point svg-data))] + (-> {:id (uuid/next) + :type :path + :name name + :frame-id frame-id + :content content + :selrect selrect + :points points} + (assoc :svg-viewbox (select-keys selrect [:x :y :width :height])) + (assoc :svg-attrs (dissoc attrs :d :transform)) + (assoc :svg-transform svg-transform) + (gsh/translate-to-frame origin))))) (defn calculate-rect-metadata [rect-data transform] (let [points (-> (gsh/rect->points rect-data) @@ -333,7 +334,7 @@ ;; SVG graphic elements ;; :circle :ellipse :image :line :path :polygon :polyline :rect :text :use (let [shape (-> (case tag - (:g :a) (create-group name frame-id svg-data element-data) + (:g :a :svg) (create-group name frame-id svg-data element-data) :rect (create-rect-shape name frame-id svg-data element-data) (:circle :ellipse) (create-circle-shape name frame-id svg-data element-data) @@ -344,34 +345,42 @@ :image (create-image-shape name frame-id svg-data element-data) #_other (create-raw-svg name frame-id svg-data element-data)) - (assoc :svg-defs (select-keys (:defs svg-data) references)) - (setup-fill) - (setup-stroke)) + ) + shape (when (some? shape) + (-> shape + (assoc :svg-defs (select-keys (:defs svg-data) references)) + (setup-fill) + (setup-stroke))) + children (cond->> (:content element-data) (= tag :g) (mapv #(usvg/inherit-attributes attrs %)))] [shape children])))) (defn add-svg-child-changes [page-id objects selected frame-id parent-id svg-data [unames [rchs uchs]] [index data]] - (let [[shape children] (parse-svg-element frame-id svg-data data unames) - shape-id (:id shape) + (let [[shape children] (parse-svg-element frame-id svg-data data unames)] + (if (some? shape) + (let [shape-id (:id shape) - [rch1 uch1] (dwc/add-shape-changes page-id objects selected shape false) + [rch1 uch1] (dwc/add-shape-changes page-id objects selected shape false) - ;; Mov-objects won't have undo because we "delete" the object in the undo of the - ;; previous operation - rch2 [{:type :mov-objects - :parent-id parent-id - :frame-id frame-id - :page-id page-id - :index index - :shapes [shape-id]}] + ;; Mov-objects won't have undo because we "delete" the object in the undo of the + ;; previous operation + rch2 [{:type :mov-objects + :parent-id parent-id + :frame-id frame-id + :page-id page-id + :index index + :shapes [shape-id]}] - ;; Careful! the undo changes are concatenated reversed (we undo in reverse order - changes [(d/concat rchs rch1 rch2) (d/concat uch1 uchs)] - unames (conj unames (:name shape)) - reducer-fn (partial add-svg-child-changes page-id objects selected frame-id shape-id svg-data)] - (reduce reducer-fn [unames changes] (d/enumerate children)))) + ;; Careful! the undo changes are concatenated reversed (we undo in reverse order + changes [(d/concat rchs rch1 rch2) (d/concat uch1 uchs)] + unames (conj unames (:name shape)) + reducer-fn (partial add-svg-child-changes page-id objects selected frame-id shape-id svg-data)] + (reduce reducer-fn [unames changes] (d/enumerate children))) + + ;; Cannot create the data from curren tags + [unames [rchs uchs]]))) (declare create-svg-shapes) diff --git a/frontend/src/app/main/ui/shapes/group.cljs b/frontend/src/app/main/ui/shapes/group.cljs index c355b30d5..22a877b31 100644 --- a/frontend/src/app/main/ui/shapes/group.cljs +++ b/frontend/src/app/main/ui/shapes/group.cljs @@ -32,20 +32,24 @@ mask (when show-mask? (first childs)) childs (if show-mask? (rest childs) childs) - props (-> (attrs/extract-style-attrs shape) - (obj/merge! - #js {:pointerEvents pointer-events - :clipPath (when (and mask (not expand-mask)) (clip-str mask)) - :mask (when (and mask (not expand-mask)) (mask-str mask))}))] + mask-props (when (and mask (not expand-mask)) + #js {:clipPath (clip-str mask) + :mask (mask-str mask)}) + mask-wrapper (if (and mask (not expand-mask)) + "g" + mf/Fragment) - [:> :g props - (when mask - [:> render-mask #js {:frame frame :mask mask}]) + props (-> (attrs/extract-style-attrs shape))] - (for [item childs] - [:& shape-wrapper {:frame frame - :shape item - :key (:id item)}])])))) + [:> mask-wrapper mask-props + [:> :g (attrs/extract-style-attrs shape) + (when mask + [:> render-mask #js {:frame frame :mask mask}]) + + (for [item childs] + [:& shape-wrapper {:frame frame + :shape item + :key (:id item)}])]])))) diff --git a/frontend/src/app/main/ui/shapes/svg_defs.cljs b/frontend/src/app/main/ui/shapes/svg_defs.cljs index 846ec4321..ee5857551 100644 --- a/frontend/src/app/main/ui/shapes/svg_defs.cljs +++ b/frontend/src/app/main/ui/shapes/svg_defs.cljs @@ -60,15 +60,19 @@ transform-filter? (and (contains? usvg/filter-tags tag) (= "userSpaceOnUse" (get attrs :filterUnits "objectBoundingBox"))) + transform-mask? (and (= :mask tag) + (= "userSpaceOnUse" (get attrs :maskUnits "objectBoundingBox"))) + attrs (-> attrs (usvg/update-attr-ids prefix-id) (usvg/clean-attrs) (cond-> - transform-gradient? (add-matrix :gradientTransform transform) - transform-pattern? (add-matrix :patternTransform transform) - transform-clippath? (add-matrix :transform transform) - transform-filter? (transform-region transform))) + transform-gradient? (add-matrix :gradientTransform transform) + transform-pattern? (add-matrix :patternTransform transform) + transform-clippath? (add-matrix :transform transform) + (or transform-filter? + transform-mask?) (transform-region transform))) [wrapper wrapper-props] (if (= tag :mask) ["g" #js {:transform (str transform)}] diff --git a/frontend/src/app/util/svg.cljs b/frontend/src/app/util/svg.cljs index bc3979a8c..4547b3091 100644 --- a/frontend/src/app/util/svg.cljs +++ b/frontend/src/app/util/svg.cljs @@ -24,6 +24,472 @@ (defonce matrices-regex #"(matrix|translate|scale|rotate|skewX|skewY)\(([^\)]*)\)") (defonce number-regex #"[+-]?\d*(\.\d+)?(e[+-]?\d+)?") +(defonce tags-to-remove #{:defs :linearGradient :radialGradient :metadata :mask :clipPath :filter :title}) + +;; https://www.w3.org/TR/SVG11/eltindex.html +(defonce svg-tags-list + #{:a + :altGlyph + :altGlyphDef + :altGlyphItem + :animate + :animateColor + :animateMotion + :animateTransform + :circle + :clipPath + :color-profile + :cursor + :defs + :desc + :ellipse + :feBlend + :feColorMatrix + :feComponentTransfer + :feComposite + :feConvolveMatrix + :feDiffuseLighting + :feDisplacementMap + :feDistantLight + :feFlood + :feFuncA + :feFuncB + :feFuncG + :feFuncR + :feGaussianBlur + :feImage + :feMerge + :feMergeNode + :feMorphology + :feOffset + :fePointLight + :feSpecularLighting + :feSpotLight + :feTile + :feTurbulence + :filter + :font + :font-face + :font-face-format + :font-face-name + :font-face-src + :font-face-uri + :foreignObject + :g + :glyph + :glyphRef + :hkern + :image + :line + :linearGradient + :marker + :mask + :metadata + :missing-glyph + :mpath + :path + :pattern + :polygon + :polyline + :radialGradient + :rect + :script + :set + :stop + :style + :svg + :switch + :symbol + :text + :textPath + :title + :tref + :tspan + :use + :view + :vkern + }) + +;; https://www.w3.org/TR/SVG11/attindex.html +(defonce svg-attr-list + #{:accent-height + :accumulate + :additive + :alphabetic + :amplitude + :arabic-form + :ascent + :attributeName + :attributeType + :azimuth + :baseFrequency + :baseProfile + :bbox + :begin + :bias + :by + :calcMode + :cap-height + :class + :clipPathUnits + :contentScriptType + :contentStyleType + :cx + :cy + :d + :descent + :diffuseConstant + :divisor + :dur + :dx + :dy + :edgeMode + :elevation + :end + :exponent + :externalResourcesRequired + :fill + :filterRes + :filterUnits + :font-family + :font-size + :font-stretch + :font-style + :font-variant + :font-weight + :format + :from + :fx + :fy + :g1 + :g2 + :glyph-name + :glyphRef + :gradientTransform + :gradientUnits + :hanging + :height + :horiz-adv-x + :horiz-origin-x + :horiz-origin-y + :id + :ideographic + :in + :in2 + :intercept + :k + :k1 + :k2 + :k3 + :k4 + :kernelMatrix + :kernelUnitLength + :keyPoints + :keySplines + :keyTimes + :lang + :lengthAdjust + :limitingConeAngle + :local + :markerHeight + :markerUnits + :markerWidth + :maskContentUnits + :maskUnits + :mathematical + :max + :media + :method + :min + :mode + :name + :numOctaves + :offset + ;; We don't support events + ;;:onabort + ;;:onactivate + ;;:onbegin + ;;:onclick + ;;:onend + ;;:onerror + ;;:onfocusin + ;;:onfocusout + ;;:onload + ;;:onmousedown + ;;:onmousemove + ;;:onmouseout + ;;:onmouseover + ;;:onmouseup + ;;:onrepeat + ;;:onresize + ;;:onscroll + ;;:onunload + ;;:onzoom + :operator + :order + :orient + :orientation + :origin + :overline-position + :overline-thickness + :panose-1 + :path + :pathLength + :patternContentUnits + :patternTransform + :patternUnits + :points + :pointsAtX + :pointsAtY + :pointsAtZ + :preserveAlpha + :preserveAspectRatio + :primitiveUnits + :r + :radius + :refX + :refY + :rendering-intent + :repeatCount + :repeatDur + :requiredExtensions + :requiredFeatures + :restart + :result + :rotate + :rx + :ry + :scale + :seed + :slope + :spacing + :specularConstant + :specularExponent + :spreadMethod + :startOffset + :stdDeviation + :stemh + :stemv + :stitchTiles + :strikethrough-position + :strikethrough-thickness + :string + :style + :surfaceScale + :systemLanguage + :tableValues + :target + :targetX + :targetY + :textLength + :title + :to + :transform + :type + :u1 + :u2 + :underline-position + :underline-thickness + :unicode + :unicode-range + :units-per-em + :v-alphabetic + :v-hanging + :v-ideographic + :v-mathematical + :values + :version + :vert-adv-y + :vert-origin-x + :vert-origin-y + :viewBox + :viewTarget + :width + :widths + :x + :x-height + :x1 + :x2 + :xChannelSelector + :xmlns:xlink + :xlink:actuate + :xlink:arcrole + :xlink:href + :xlink:role + :xlink:show + :xlink:title + :xlink:type + :xml:base + :xml:lang + :xml:space + :y + :y1 + :y2 + :yChannelSelector + :z + :zoomAndPan}) + +(defonce svg-present-list + #{:alignment-baseline + :baseline-shift + :clip-path + :clip-rule + :clip + :color-interpolation-filters + :color-interpolation + :color-profile + :color-rendering + :color + :cursor + :direction + :display + :dominant-baseline + :enable-background + :fill-opacity + :fill-rule + :fill + :filter + :flood-color + :flood-opacity + :font-family + :font-size-adjust + :font-size + :font-stretch + :font-style + :font-variant + :font-weight + :glyph-orientation-horizontal + :glyph-orientation-vertical + :image-rendering + :kerning + :letter-spacing + :lighting-color + :marker-end + :marker-mid + :marker-start + :mask + :opacity + :overflow + :pointer-events + :shape-rendering + :stop-color + :stop-opacity + :stroke-dasharray + :stroke-dashoffset + :stroke-linecap + :stroke-linejoin + :stroke-miterlimit + :stroke-opacity + :stroke-width + :stroke + :text-anchor + :text-decoration + :text-rendering + :unicode-bidi + :visibility + :word-spacing + :writing-mode + :mask-type}) + +(defonce inheritable-props + [:clip-rule + :color + :color-interpolation + :color-interpolation-filters + :color-profile + :color-rendering + :cursor + :direction + :dominant-baseline + :fill + :fill-opacity + :fill-rule + :font + :font-family + :font-size + :font-size-adjust + :font-stretch + :font-style + :font-variant + :font-weight + :glyph-orientation-horizontal + :glyph-orientation-vertical + :image-rendering + :letter-spacing + :marker + :marker-end + :marker-mid + :marker-start + :paint-order + :pointer-events + :shape-rendering + :stroke + :stroke-dasharray + :stroke-dashoffset + :stroke-linecap + :stroke-linejoin + :stroke-miterlimit + :stroke-opacity + :stroke-width + :text-anchor + :text-rendering + :transform + :visibility + :word-spacing + :writing-mode]) + +(defonce gradient-tags + #{:linearGradient + :radialGradient}) + +(defonce filter-tags + #{:filter + :feBlend + :feColorMatrix + :feComponentTransfer + :feComposite + :feConvolveMatrix + :feDiffuseLighting + :feDisplacementMap + :feFlood + :feGaussianBlur + :feImage + :feMerge + :feMorphology + :feOffset + :feSpecularLighting + :feTile + :feTurbulence}) + +;; Props not supported by react we need to keep them lowercase +(defonce non-react-props + #{:mask-type}) + +;; Defaults for some tags per spec https://www.w3.org/TR/SVG11/single-page.html +;; they are basicaly the defaults that can be percents and we need to replace because +;; otherwise won't work as expected in the workspace +(defonce svg-tag-defaults + (let [filter-default {:units :filterUnits + :default "objectBoundingBox" + "objectBoundingBox" {} + "userSpaceOnUse" {:x "-10%" :y "-10%" :width "120%" :height "120%"}} + filter-values (->> filter-tags + (reduce #(merge %1 (hash-map %2 filter-default)) {}))] + + (merge {:linearGradient {:units :gradientUnits + :default "objectBoundingBox" + "objectBoundingBox" {} + "userSpaceOnUse" {:x1 "0%" :y1 "0%" :x2 "100%" :y2 "0%"}} + :radialGradient {:units :gradientUnits + :default "objectBoundingBox" + "objectBoundingBox" {} + "userSpaceOnUse" {:cx "50%" :cy "50%" :r "50%"}} + :mask {:units :maskUnits + :default "userSpaceOnUse" + "objectBoundingBox" {} + "userSpaceOnUse" {:x "-10%" :y "-10%" :width "120%" :height "120%"}}} + filter-values))) + (defn extract-ids [val] (->> (re-seq xml-id-regex val) (mapv second))) @@ -61,35 +527,52 @@ (defn clean-attrs "Transforms attributes to their react equivalent" - [attrs] - (letfn [(transform-key [key] - (-> (d/name key) - (str/replace ":" "-") - (str/camel) - (keyword))) + ([attrs] (clean-attrs attrs true)) + ([attrs whitelist?] + (letfn [(known-property? [[key _]] + (or (not whitelist?) + (contains? svg-attr-list key ) + (contains? svg-present-list key ))) - (format-styles [style-str] - (->> (str/split style-str ";") - (map str/trim) - (map #(str/split % ":")) - (group-by first) - (map (fn [[key val]] - (vector - (transform-key key) - (second (first val))))) - (into {}))) + (transform-key [key] + (if (contains? non-react-props key) + key + (-> (d/name key) + (str/replace ":" "-") + (str/camel) + (keyword)))) - (map-fn [[key val]] - (let [key (keyword key)] - (cond - (= key :class) [:className val] - (and (= key :style) (string? val)) [key (format-styles val)] - (and (= key :style) (map? val)) [key (clean-attrs val)] - :else (vector (transform-key key) val))))] + (lowercase-key [key] + (-> (d/name key) + (str/lower) + (keyword))) - (->> attrs - (map map-fn) - (into {})))) + (format-styles [style-str] + (->> (str/split style-str ";") + (map str/trim) + (map #(str/split % ":")) + (group-by first) + (map (fn [[key val]] + (vector + (transform-key key) + (second (first val))))) + (into {}))) + + (map-fn [[key val]] + (let [key (keyword key)] + (cond + (= key :class) [:className val] + (and (= key :style) (string? val)) [key (format-styles val)] + (and (= key :style) (map? val)) [key (clean-attrs val false)] + :else (vector (transform-key key) val)))) + + ] + + (let [filtered-props (->> attrs (remove known-property?) (map first))] + (when (seq filtered-props) + (.warn js/console "Unknown properties: " (str/join ", " filtered-props )))) + + (into {} (comp (filter known-property?) (map map-fn)) attrs)))) (defn update-attr-ids "Replaces the ids inside a property" @@ -126,18 +609,16 @@ (reduce visit-node result (:content node))))] (visit-node {} content))) -(def remove-tags #{:defs :linearGradient}) - (defn extract-defs [{:keys [tag attrs content] :as node}] (if-not (map? node) [{} node] - (let [remove-node? (fn [{:keys [tag]}] (contains? remove-tags tag)) - + (let [remove-node? (fn [{:keys [tag]}] (and (some? tag) + (or (contains? tags-to-remove tag) + (not (contains? svg-tags-list tag))))) rec-result (->> (:content node) (map extract-defs)) node (assoc node :content (->> rec-result (map second) (filterv (comp not remove-node?)))) - current-node-defs (if (contains? attrs :id) (hash-map (:id attrs) node) (hash-map)) @@ -319,76 +800,6 @@ transform (update :transform append-transform)))) -(defonce inheritable-props - [:clip-rule - :color - :color-interpolation - :color-interpolation-filters - :color-profile - :color-rendering - :cursor - :direction - :dominant-baseline - :fill - :fill-opacity - :fill-rule - :font - :font-family - :font-size - :font-size-adjust - :font-stretch - :font-style - :font-variant - :font-weight - :glyph-orientation-horizontal - :glyph-orientation-vertical - :image-rendering - :letter-spacing - :marker - :marker-end - :marker-mid - :marker-start - :paint-order - :pointer-events - :shape-rendering - :stroke - :stroke-dasharray - :stroke-dashoffset - :stroke-linecap - :stroke-linejoin - :stroke-miterlimit - :stroke-opacity - :stroke-width - :text-anchor - :text-rendering - :transform - :visibility - :word-spacing - :writing-mode]) - -(defonce gradient-tags - #{:linearGradient - :radialGradient}) - -(defonce filter-tags - #{:filter - :feBlend - :feColorMatrix - :feComponentTransfer - :feComposite - :feConvolveMatrix - :feDiffuseLighting - :feDisplacementMap - :feFlood - :feGaussianBlur - :feImage - :feMerge - :feMorphology - :feOffset - :feSpecularLighting - :feTile - :feTurbulence}) - (defn inherit-attributes [group-attrs {:keys [attrs] :as node}] (if (map? node) (let [attrs (-> (format-styles attrs) @@ -425,31 +836,6 @@ (reduce-content (:content node))) value))) -;; Defaults for some tags per spec https://www.w3.org/TR/SVG11/single-page.html -;; they are basicaly the defaults that can be percents and we need to replace because -;; otherwise won't work as expected in the workspace -(defonce svg-tag-defaults - (let [filter-default {:units :filterUnits - :default "objectBoundingBox" - "objectBoundingBox" {} - "userSpaceOnUse" {:x "-10%" :y "-10%" :width "120%" :height "120%"}} - filter-values (->> filter-tags - (reduce #(merge %1 (hash-map %2 filter-default)) {}))] - - (merge {:linearGradient {:units :gradientUnits - :default "objectBoundingBox" - "objectBoundingBox" {} - "userSpaceOnUse" {:x1 "0%" :y1 "0%" :x2 "100%" :y2 "0%"}} - :radialGradient {:units :gradientUnits - :default "objectBoundingBox" - "objectBoundingBox" {} - "userSpaceOnUse" {:cx "50%" :cy "50%" :r "50%"}} - :mask {:units :maskUnits - :default "userSpaceOnUse" - "objectBoundingBox" {} - "userSpaceOnUse" {:x "-10%" :y "-10%" :width "120%" :height "120%"}}} - filter-values))) - (defn fix-default-values "Gives values to some SVG elements which defaults won't work when imported into the platform" [svg-data] From ecff4c5dce6dd460fc2e006dccd1dc7483c0bd77 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Wed, 24 Mar 2021 18:04:34 +0100 Subject: [PATCH 4/5] :sparkles: Removed svgcleaner --- backend/resources/svgclean.js | 94 - backend/scripts/build.sh | 1 - backend/src/app/main.clj | 9 +- backend/src/app/rpc/mutations/media.clj | 4 +- backend/src/app/svgparse.clj | 79 +- backend/tests/app/tests/test_svgc.clj | 24 - exporter/src/app/http/export_svg.cljs | 6 - exporter/src/app/http/svgclean.js | 94 - vendor/svgclean/.gitignore | 11 - vendor/svgclean/LICENSE | 25 - vendor/svgclean/examples/test.js | 101 - vendor/svgclean/examples/test.svg | 3 - vendor/svgclean/main.js | 45 - vendor/svgclean/package-lock.json | 3976 ----------------- vendor/svgclean/package.json | 40 - vendor/svgclean/src/svgclean.js | 59 - vendor/svgclean/src/svgclean/config.js | 288 -- .../svgclean/src/svgclean/css-class-list.js | 138 - .../src/svgclean/css-select-adapter.js | 53 - .../src/svgclean/css-style-declaration.js | 285 -- vendor/svgclean/src/svgclean/css-tools.js | 222 - vendor/svgclean/src/svgclean/js2svg.js | 346 -- vendor/svgclean/src/svgclean/jsAPI.js | 372 -- .../src/svgclean/plugins/_collections.js | 2558 ----------- vendor/svgclean/src/svgclean/plugins/_path.js | 988 ---- .../src/svgclean/plugins/_transforms.js | 310 -- .../plugins/addAttributesToSVGElement.js | 82 - .../plugins/addClassesToSVGElement.js | 50 - .../src/svgclean/plugins/cleanupAttrs.js | 56 - .../plugins/cleanupEnableBackground.js | 84 - .../src/svgclean/plugins/cleanupIDs.js | 212 - .../svgclean/plugins/cleanupListOfValues.js | 139 - .../svgclean/plugins/cleanupNumericValues.js | 85 - .../src/svgclean/plugins/collapseGroups.js | 87 - .../src/svgclean/plugins/convertColors.js | 130 - .../plugins/convertEllipseToCircle.js | 39 - .../src/svgclean/plugins/convertPathData.js | 971 ---- .../svgclean/plugins/convertShapeToPath.js | 149 - .../svgclean/plugins/convertStyleToAttrs.js | 125 - .../src/svgclean/plugins/convertTransform.js | 363 -- .../src/svgclean/plugins/inlineStyles.js | 245 - .../src/svgclean/plugins/mergePaths.js | 73 - .../src/svgclean/plugins/minifyStyles.js | 160 - .../svgclean/plugins/moveElemsAttrsToGroup.js | 126 - .../svgclean/plugins/moveGroupAttrsToElems.js | 64 - .../src/svgclean/plugins/prefixIds.js | 274 -- .../plugins/removeAttributesBySelector.js | 70 - .../src/svgclean/plugins/removeAttrs.js | 150 - .../src/svgclean/plugins/removeComments.js | 27 - .../src/svgclean/plugins/removeDesc.js | 32 - .../src/svgclean/plugins/removeDimensions.js | 49 - .../src/svgclean/plugins/removeDoctype.js | 40 - .../svgclean/plugins/removeEditorsNSData.js | 65 - .../svgclean/plugins/removeElementsByAttr.js | 80 - .../src/svgclean/plugins/removeEmptyAttrs.js | 29 - .../svgclean/plugins/removeEmptyContainers.js | 32 - .../src/svgclean/plugins/removeEmptyText.js | 59 - .../src/svgclean/plugins/removeHiddenElems.js | 225 - .../src/svgclean/plugins/removeMetadata.js | 23 - .../plugins/removeNonInheritableGroupAttrs.js | 37 - .../svgclean/plugins/removeOffCanvasPaths.js | 134 - .../svgclean/plugins/removeRasterImages.js | 28 - .../svgclean/plugins/removeScriptElement.js | 23 - .../svgclean/plugins/removeStyleElement.js | 23 - .../src/svgclean/plugins/removeTitle.js | 23 - .../plugins/removeUnknownsAndDefaults.js | 150 - .../src/svgclean/plugins/removeUnusedNS.js | 109 - .../src/svgclean/plugins/removeUselessDefs.js | 53 - .../plugins/removeUselessStrokeAndFill.js | 100 - .../src/svgclean/plugins/removeViewBox.js | 48 - .../src/svgclean/plugins/removeXMLNS.js | 28 - .../src/svgclean/plugins/removeXMLProcInst.js | 24 - .../src/svgclean/plugins/reusePaths.js | 169 - .../src/svgclean/plugins/sortAttrs.js | 84 - .../src/svgclean/plugins/sortDefsChildren.js | 47 - vendor/svgclean/src/svgclean/svg2js.js | 190 - vendor/svgclean/src/svgclean/tools.js | 152 - vendor/svgclean/test.js | 10 - vendor/svgclean/test.svg | 3 - 79 files changed, 8 insertions(+), 15953 deletions(-) delete mode 100644 backend/resources/svgclean.js delete mode 100644 backend/tests/app/tests/test_svgc.clj delete mode 100644 exporter/src/app/http/svgclean.js delete mode 100644 vendor/svgclean/.gitignore delete mode 100644 vendor/svgclean/LICENSE delete mode 100644 vendor/svgclean/examples/test.js delete mode 100644 vendor/svgclean/examples/test.svg delete mode 100644 vendor/svgclean/main.js delete mode 100644 vendor/svgclean/package-lock.json delete mode 100644 vendor/svgclean/package.json delete mode 100755 vendor/svgclean/src/svgclean.js delete mode 100644 vendor/svgclean/src/svgclean/config.js delete mode 100644 vendor/svgclean/src/svgclean/css-class-list.js delete mode 100644 vendor/svgclean/src/svgclean/css-select-adapter.js delete mode 100644 vendor/svgclean/src/svgclean/css-style-declaration.js delete mode 100644 vendor/svgclean/src/svgclean/css-tools.js delete mode 100644 vendor/svgclean/src/svgclean/js2svg.js delete mode 100644 vendor/svgclean/src/svgclean/jsAPI.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/_collections.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/_path.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/_transforms.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/addAttributesToSVGElement.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/addClassesToSVGElement.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/cleanupAttrs.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/cleanupEnableBackground.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/cleanupIDs.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/cleanupListOfValues.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/cleanupNumericValues.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/collapseGroups.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/convertColors.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/convertEllipseToCircle.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/convertPathData.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/convertShapeToPath.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/convertStyleToAttrs.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/convertTransform.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/inlineStyles.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/mergePaths.js delete mode 100755 vendor/svgclean/src/svgclean/plugins/minifyStyles.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/moveElemsAttrsToGroup.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/moveGroupAttrsToElems.js delete mode 100755 vendor/svgclean/src/svgclean/plugins/prefixIds.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/removeAttributesBySelector.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/removeAttrs.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/removeComments.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/removeDesc.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/removeDimensions.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/removeDoctype.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/removeEditorsNSData.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/removeElementsByAttr.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/removeEmptyAttrs.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/removeEmptyContainers.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/removeEmptyText.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/removeHiddenElems.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/removeMetadata.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/removeNonInheritableGroupAttrs.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/removeOffCanvasPaths.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/removeRasterImages.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/removeScriptElement.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/removeStyleElement.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/removeTitle.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/removeUnknownsAndDefaults.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/removeUnusedNS.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/removeUselessDefs.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/removeUselessStrokeAndFill.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/removeViewBox.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/removeXMLNS.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/removeXMLProcInst.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/reusePaths.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/sortAttrs.js delete mode 100644 vendor/svgclean/src/svgclean/plugins/sortDefsChildren.js delete mode 100644 vendor/svgclean/src/svgclean/svg2js.js delete mode 100644 vendor/svgclean/src/svgclean/tools.js delete mode 100644 vendor/svgclean/test.js delete mode 100644 vendor/svgclean/test.svg diff --git a/backend/resources/svgclean.js b/backend/resources/svgclean.js deleted file mode 100644 index adb6912b1..000000000 --- a/backend/resources/svgclean.js +++ /dev/null @@ -1,94 +0,0 @@ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).svgc=e()}}((function(){return function e(t,r,n){function i(o,s){if(!r[o]){if(!t[o]){var l="function"==typeof require&&require;if(!s&&l)return l(o,!0);if(a)return a(o,!0);var c=new Error("Cannot find module '"+o+"'");throw c.code="MODULE_NOT_FOUND",c}var u=r[o]={exports:{}};t[o][0].call(u.exports,(function(e){return i(t[o][1][e]||e)}),u,u.exports,e,t,r,n)}return r[o].exports}for(var a="function"==typeof require&&require,o=0;oe.data))}},{"./src/svgclean.js":253}],2:[function(e,t,r){"use strict";r.byteLength=function(e){var t=c(e),r=t[0],n=t[1];return 3*(r+n)/4-n},r.toByteArray=function(e){var t,r,n=c(e),o=n[0],s=n[1],l=new a(function(e,t,r){return 3*(t+r)/4-r}(0,o,s)),u=0,d=s>0?o-4:o;for(r=0;r>16&255,l[u++]=t>>8&255,l[u++]=255&t;2===s&&(t=i[e.charCodeAt(r)]<<2|i[e.charCodeAt(r+1)]>>4,l[u++]=255&t);1===s&&(t=i[e.charCodeAt(r)]<<10|i[e.charCodeAt(r+1)]<<4|i[e.charCodeAt(r+2)]>>2,l[u++]=t>>8&255,l[u++]=255&t);return l},r.fromByteArray=function(e){for(var t,r=e.length,i=r%3,a=[],o=16383,s=0,l=r-i;sl?l:s+o));1===i?(t=e[r-1],a.push(n[t>>2]+n[t<<4&63]+"==")):2===i&&(t=(e[r-2]<<8)+e[r-1],a.push(n[t>>10]+n[t>>4&63]+n[t<<2&63]+"="));return a.join("")};for(var n=[],i=[],a="undefined"!=typeof Uint8Array?Uint8Array:Array,o="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",s=0,l=o.length;s0)throw new Error("Invalid string. Length must be a multiple of 4");var r=e.indexOf("=");return-1===r&&(r=t),[r,r===t?0:4-r%4]}function u(e,t,r){for(var i,a,o=[],s=t;s>18&63]+n[a>>12&63]+n[a>>6&63]+n[63&a]);return o.join("")}i["-".charCodeAt(0)]=62,i["_".charCodeAt(0)]=63},{}],3:[function(e,t,r){t.exports={trueFunc:function(){return!0},falseFunc:function(){return!1}}},{}],4:[function(e,t,r){},{}],5:[function(e,t,r){"use strict";var n=e("safe-buffer").Buffer,i=n.isEncoding||function(e){switch((e=""+e)&&e.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}};function a(e){var t;switch(this.encoding=function(e){var t=function(e){if(!e)return"utf8";for(var t;;)switch(e){case"utf8":case"utf-8":return"utf8";case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return"utf16le";case"latin1":case"binary":return"latin1";case"base64":case"ascii":case"hex":return e;default:if(t)return;e=(""+e).toLowerCase(),t=!0}}(e);if("string"!=typeof t&&(n.isEncoding===i||!i(e)))throw new Error("Unknown encoding: "+e);return t||e}(e),this.encoding){case"utf16le":this.text=l,this.end=c,t=4;break;case"utf8":this.fillLast=s,t=4;break;case"base64":this.text=u,this.end=d,t=3;break;default:return this.write=p,void(this.end=m)}this.lastNeed=0,this.lastTotal=0,this.lastChar=n.allocUnsafe(t)}function o(e){return e<=127?0:e>>5==6?2:e>>4==14?3:e>>3==30?4:e>>6==2?-1:-2}function s(e){var t=this.lastTotal-this.lastNeed,r=function(e,t,r){if(128!=(192&t[0]))return e.lastNeed=0,"�";if(e.lastNeed>1&&t.length>1){if(128!=(192&t[1]))return e.lastNeed=1,"�";if(e.lastNeed>2&&t.length>2&&128!=(192&t[2]))return e.lastNeed=2,"�"}}(this,e);return void 0!==r?r:this.lastNeed<=e.length?(e.copy(this.lastChar,t,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal)):(e.copy(this.lastChar,t,0,e.length),void(this.lastNeed-=e.length))}function l(e,t){if((e.length-t)%2==0){var r=e.toString("utf16le",t);if(r){var n=r.charCodeAt(r.length-1);if(n>=55296&&n<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=e[e.length-2],this.lastChar[1]=e[e.length-1],r.slice(0,-1)}return r}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=e[e.length-1],e.toString("utf16le",t,e.length-1)}function c(e){var t=e&&e.length?this.write(e):"";if(this.lastNeed){var r=this.lastTotal-this.lastNeed;return t+this.lastChar.toString("utf16le",0,r)}return t}function u(e,t){var r=(e.length-t)%3;return 0===r?e.toString("base64",t):(this.lastNeed=3-r,this.lastTotal=3,1===r?this.lastChar[0]=e[e.length-1]:(this.lastChar[0]=e[e.length-2],this.lastChar[1]=e[e.length-1]),e.toString("base64",t,e.length-r))}function d(e){var t=e&&e.length?this.write(e):"";return this.lastNeed?t+this.lastChar.toString("base64",0,3-this.lastNeed):t}function p(e){return e.toString(this.encoding)}function m(e){return e&&e.length?this.write(e):""}r.StringDecoder=a,a.prototype.write=function(e){if(0===e.length)return"";var t,r;if(this.lastNeed){if(void 0===(t=this.fillLast(e)))return"";r=this.lastNeed,this.lastNeed=0}else r=0;return r=0)return i>0&&(e.lastNeed=i-1),i;if(--n=0)return i>0&&(e.lastNeed=i-2),i;if(--n=0)return i>0&&(2===i?i=0:e.lastNeed=i-3),i;return 0}(this,e,t);if(!this.lastNeed)return e.toString("utf8",t);this.lastTotal=r;var n=e.length-(r-this.lastNeed);return e.copy(this.lastChar,0,n),e.toString("utf8",t,n)},a.prototype.fillLast=function(e){if(this.lastNeed<=e.length)return e.copy(this.lastChar,this.lastTotal-this.lastNeed,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);e.copy(this.lastChar,this.lastTotal-this.lastNeed,0,e.length),this.lastNeed-=e.length}},{"safe-buffer":6}],6:[function(e,t,r){ -/*! safe-buffer. MIT License. Feross Aboukhadijeh */ -var n=e("buffer"),i=n.Buffer;function a(e,t){for(var r in e)t[r]=e[r]}function o(e,t,r){return i(e,t,r)}i.from&&i.alloc&&i.allocUnsafe&&i.allocUnsafeSlow?t.exports=n:(a(n,r),r.Buffer=o),o.prototype=Object.create(i.prototype),a(i,o),o.from=function(e,t,r){if("number"==typeof e)throw new TypeError("Argument must not be a number");return i(e,t,r)},o.alloc=function(e,t,r){if("number"!=typeof e)throw new TypeError("Argument must be a number");var n=i(e);return void 0!==t?"string"==typeof r?n.fill(t,r):n.fill(t):n.fill(0),n},o.allocUnsafe=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return i(e)},o.allocUnsafeSlow=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return n.SlowBuffer(e)}},{buffer:7}],7:[function(e,t,r){(function(t){(function(){ -/*! - * The buffer module from node.js, for the browser. - * - * @author Feross Aboukhadijeh - * @license MIT - */ -"use strict";var t=e("base64-js"),n=e("ieee754");r.Buffer=o,r.SlowBuffer=function(e){+e!=e&&(e=0);return o.alloc(+e)},r.INSPECT_MAX_BYTES=50;var i=2147483647;function a(e){if(e>i)throw new RangeError('The value "'+e+'" is invalid for option "size"');var t=new Uint8Array(e);return t.__proto__=o.prototype,t}function o(e,t,r){if("number"==typeof e){if("string"==typeof t)throw new TypeError('The "string" argument must be of type string. Received type number');return c(e)}return s(e,t,r)}function s(e,t,r){if("string"==typeof e)return function(e,t){"string"==typeof t&&""!==t||(t="utf8");if(!o.isEncoding(t))throw new TypeError("Unknown encoding: "+t);var r=0|p(e,t),n=a(r),i=n.write(e,t);i!==r&&(n=n.slice(0,i));return n}(e,t);if(ArrayBuffer.isView(e))return u(e);if(null==e)throw TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof e);if(N(e,ArrayBuffer)||e&&N(e.buffer,ArrayBuffer))return function(e,t,r){if(t<0||e.byteLength=i)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+i.toString(16)+" bytes");return 0|e}function p(e,t){if(o.isBuffer(e))return e.length;if(ArrayBuffer.isView(e)||N(e,ArrayBuffer))return e.byteLength;if("string"!=typeof e)throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof e);var r=e.length,n=arguments.length>2&&!0===arguments[2];if(!n&&0===r)return 0;for(var i=!1;;)switch(t){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":return I(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return W(e).length;default:if(i)return n?-1:I(e).length;t=(""+t).toLowerCase(),i=!0}}function m(e,t,r){var n=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return"";if((r>>>=0)<=(t>>>=0))return"";for(e||(e="utf8");;)switch(e){case"hex":return O(this,t,r);case"utf8":case"utf-8":return C(this,t,r);case"ascii":return A(this,t,r);case"latin1":case"binary":return E(this,t,r);case"base64":return w(this,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return _(this,t,r);default:if(n)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),n=!0}}function h(e,t,r){var n=e[t];e[t]=e[r],e[r]=n}function f(e,t,r,n,i){if(0===e.length)return-1;if("string"==typeof r?(n=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),j(r=+r)&&(r=i?0:e.length-1),r<0&&(r=e.length+r),r>=e.length){if(i)return-1;r=e.length-1}else if(r<0){if(!i)return-1;r=0}if("string"==typeof t&&(t=o.from(t,n)),o.isBuffer(t))return 0===t.length?-1:g(e,t,r,n,i);if("number"==typeof t)return t&=255,"function"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(e,t,r):Uint8Array.prototype.lastIndexOf.call(e,t,r):g(e,[t],r,n,i);throw new TypeError("val must be string, number or Buffer")}function g(e,t,r,n,i){var a,o=1,s=e.length,l=t.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(e.length<2||t.length<2)return-1;o=2,s/=2,l/=2,r/=2}function c(e,t){return 1===o?e[t]:e.readUInt16BE(t*o)}if(i){var u=-1;for(a=r;as&&(r=s-l),a=r;a>=0;a--){for(var d=!0,p=0;pi&&(n=i):n=i;var a=t.length;n>a/2&&(n=a/2);for(var o=0;o>8,i=r%256,a.push(i),a.push(n);return a}(t,e.length-r),e,r,n)}function w(e,r,n){return 0===r&&n===e.length?t.fromByteArray(e):t.fromByteArray(e.slice(r,n))}function C(e,t,r){r=Math.min(e.length,r);for(var n=[],i=t;i239?4:c>223?3:c>191?2:1;if(i+d<=r)switch(d){case 1:c<128&&(u=c);break;case 2:128==(192&(a=e[i+1]))&&(l=(31&c)<<6|63&a)>127&&(u=l);break;case 3:a=e[i+1],o=e[i+2],128==(192&a)&&128==(192&o)&&(l=(15&c)<<12|(63&a)<<6|63&o)>2047&&(l<55296||l>57343)&&(u=l);break;case 4:a=e[i+1],o=e[i+2],s=e[i+3],128==(192&a)&&128==(192&o)&&128==(192&s)&&(l=(15&c)<<18|(63&a)<<12|(63&o)<<6|63&s)>65535&&l<1114112&&(u=l)}null===u?(u=65533,d=1):u>65535&&(u-=65536,n.push(u>>>10&1023|55296),u=56320|1023&u),n.push(u),i+=d}return function(e){var t=e.length;if(t<=T)return String.fromCharCode.apply(String,e);var r="",n=0;for(;nt&&(e+=" ... "),""},o.prototype.compare=function(e,t,r,n,i){if(N(e,Uint8Array)&&(e=o.from(e,e.offset,e.byteLength)),!o.isBuffer(e))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof e);if(void 0===t&&(t=0),void 0===r&&(r=e?e.length:0),void 0===n&&(n=0),void 0===i&&(i=this.length),t<0||r>e.length||n<0||i>this.length)throw new RangeError("out of range index");if(n>=i&&t>=r)return 0;if(n>=i)return-1;if(t>=r)return 1;if(this===e)return 0;for(var a=(i>>>=0)-(n>>>=0),s=(r>>>=0)-(t>>>=0),l=Math.min(a,s),c=this.slice(n,i),u=e.slice(t,r),d=0;d>>=0,isFinite(r)?(r>>>=0,void 0===n&&(n="utf8")):(n=r,r=void 0)}var i=this.length-t;if((void 0===r||r>i)&&(r=i),e.length>0&&(r<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");for(var a=!1;;)switch(n){case"hex":return y(this,e,t,r);case"utf8":case"utf-8":return b(this,e,t,r);case"ascii":return v(this,e,t,r);case"latin1":case"binary":return S(this,e,t,r);case"base64":return x(this,e,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return k(this,e,t,r);default:if(a)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),a=!0}},o.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var T=4096;function A(e,t,r){var n="";r=Math.min(e.length,r);for(var i=t;in)&&(r=n);for(var i="",a=t;ar)throw new RangeError("Trying to access beyond buffer length")}function P(e,t,r,n,i,a){if(!o.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>i||te.length)throw new RangeError("Index out of range")}function L(e,t,r,n,i,a){if(r+n>e.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function R(e,t,r,i,a){return t=+t,r>>>=0,a||L(e,0,r,4),n.write(e,t,r,i,23,4),r+4}function B(e,t,r,i,a){return t=+t,r>>>=0,a||L(e,0,r,8),n.write(e,t,r,i,52,8),r+8}o.prototype.slice=function(e,t){var r=this.length;(e=~~e)<0?(e+=r)<0&&(e=0):e>r&&(e=r),(t=void 0===t?r:~~t)<0?(t+=r)<0&&(t=0):t>r&&(t=r),t>>=0,t>>>=0,r||z(e,t,this.length);for(var n=this[e],i=1,a=0;++a>>=0,t>>>=0,r||z(e,t,this.length);for(var n=this[e+--t],i=1;t>0&&(i*=256);)n+=this[e+--t]*i;return n},o.prototype.readUInt8=function(e,t){return e>>>=0,t||z(e,1,this.length),this[e]},o.prototype.readUInt16LE=function(e,t){return e>>>=0,t||z(e,2,this.length),this[e]|this[e+1]<<8},o.prototype.readUInt16BE=function(e,t){return e>>>=0,t||z(e,2,this.length),this[e]<<8|this[e+1]},o.prototype.readUInt32LE=function(e,t){return e>>>=0,t||z(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},o.prototype.readUInt32BE=function(e,t){return e>>>=0,t||z(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},o.prototype.readIntLE=function(e,t,r){e>>>=0,t>>>=0,r||z(e,t,this.length);for(var n=this[e],i=1,a=0;++a=(i*=128)&&(n-=Math.pow(2,8*t)),n},o.prototype.readIntBE=function(e,t,r){e>>>=0,t>>>=0,r||z(e,t,this.length);for(var n=t,i=1,a=this[e+--n];n>0&&(i*=256);)a+=this[e+--n]*i;return a>=(i*=128)&&(a-=Math.pow(2,8*t)),a},o.prototype.readInt8=function(e,t){return e>>>=0,t||z(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},o.prototype.readInt16LE=function(e,t){e>>>=0,t||z(e,2,this.length);var r=this[e]|this[e+1]<<8;return 32768&r?4294901760|r:r},o.prototype.readInt16BE=function(e,t){e>>>=0,t||z(e,2,this.length);var r=this[e+1]|this[e]<<8;return 32768&r?4294901760|r:r},o.prototype.readInt32LE=function(e,t){return e>>>=0,t||z(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},o.prototype.readInt32BE=function(e,t){return e>>>=0,t||z(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},o.prototype.readFloatLE=function(e,t){return e>>>=0,t||z(e,4,this.length),n.read(this,e,!0,23,4)},o.prototype.readFloatBE=function(e,t){return e>>>=0,t||z(e,4,this.length),n.read(this,e,!1,23,4)},o.prototype.readDoubleLE=function(e,t){return e>>>=0,t||z(e,8,this.length),n.read(this,e,!0,52,8)},o.prototype.readDoubleBE=function(e,t){return e>>>=0,t||z(e,8,this.length),n.read(this,e,!1,52,8)},o.prototype.writeUIntLE=function(e,t,r,n){(e=+e,t>>>=0,r>>>=0,n)||P(this,e,t,r,Math.pow(2,8*r)-1,0);var i=1,a=0;for(this[t]=255&e;++a>>=0,r>>>=0,n)||P(this,e,t,r,Math.pow(2,8*r)-1,0);var i=r-1,a=1;for(this[t+i]=255&e;--i>=0&&(a*=256);)this[t+i]=e/a&255;return t+r},o.prototype.writeUInt8=function(e,t,r){return e=+e,t>>>=0,r||P(this,e,t,1,255,0),this[t]=255&e,t+1},o.prototype.writeUInt16LE=function(e,t,r){return e=+e,t>>>=0,r||P(this,e,t,2,65535,0),this[t]=255&e,this[t+1]=e>>>8,t+2},o.prototype.writeUInt16BE=function(e,t,r){return e=+e,t>>>=0,r||P(this,e,t,2,65535,0),this[t]=e>>>8,this[t+1]=255&e,t+2},o.prototype.writeUInt32LE=function(e,t,r){return e=+e,t>>>=0,r||P(this,e,t,4,4294967295,0),this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e,t+4},o.prototype.writeUInt32BE=function(e,t,r){return e=+e,t>>>=0,r||P(this,e,t,4,4294967295,0),this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e,t+4},o.prototype.writeIntLE=function(e,t,r,n){if(e=+e,t>>>=0,!n){var i=Math.pow(2,8*r-1);P(this,e,t,r,i-1,-i)}var a=0,o=1,s=0;for(this[t]=255&e;++a>0)-s&255;return t+r},o.prototype.writeIntBE=function(e,t,r,n){if(e=+e,t>>>=0,!n){var i=Math.pow(2,8*r-1);P(this,e,t,r,i-1,-i)}var a=r-1,o=1,s=0;for(this[t+a]=255&e;--a>=0&&(o*=256);)e<0&&0===s&&0!==this[t+a+1]&&(s=1),this[t+a]=(e/o>>0)-s&255;return t+r},o.prototype.writeInt8=function(e,t,r){return e=+e,t>>>=0,r||P(this,e,t,1,127,-128),e<0&&(e=255+e+1),this[t]=255&e,t+1},o.prototype.writeInt16LE=function(e,t,r){return e=+e,t>>>=0,r||P(this,e,t,2,32767,-32768),this[t]=255&e,this[t+1]=e>>>8,t+2},o.prototype.writeInt16BE=function(e,t,r){return e=+e,t>>>=0,r||P(this,e,t,2,32767,-32768),this[t]=e>>>8,this[t+1]=255&e,t+2},o.prototype.writeInt32LE=function(e,t,r){return e=+e,t>>>=0,r||P(this,e,t,4,2147483647,-2147483648),this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24,t+4},o.prototype.writeInt32BE=function(e,t,r){return e=+e,t>>>=0,r||P(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e,t+4},o.prototype.writeFloatLE=function(e,t,r){return R(this,e,t,!0,r)},o.prototype.writeFloatBE=function(e,t,r){return R(this,e,t,!1,r)},o.prototype.writeDoubleLE=function(e,t,r){return B(this,e,t,!0,r)},o.prototype.writeDoubleBE=function(e,t,r){return B(this,e,t,!1,r)},o.prototype.copy=function(e,t,r,n){if(!o.isBuffer(e))throw new TypeError("argument should be a Buffer");if(r||(r=0),n||0===n||(n=this.length),t>=e.length&&(t=e.length),t||(t=0),n>0&&n=this.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),e.length-t=0;--a)e[a+t]=this[a+r];else Uint8Array.prototype.set.call(e,this.subarray(r,n),t);return i},o.prototype.fill=function(e,t,r,n){if("string"==typeof e){if("string"==typeof t?(n=t,t=0,r=this.length):"string"==typeof r&&(n=r,r=this.length),void 0!==n&&"string"!=typeof n)throw new TypeError("encoding must be a string");if("string"==typeof n&&!o.isEncoding(n))throw new TypeError("Unknown encoding: "+n);if(1===e.length){var i=e.charCodeAt(0);("utf8"===n&&i<128||"latin1"===n)&&(e=i)}}else"number"==typeof e&&(e&=255);if(t<0||this.length>>=0,r=void 0===r?this.length:r>>>0,e||(e=0),"number"==typeof e)for(a=t;a55295&&r<57344){if(!i){if(r>56319){(t-=3)>-1&&a.push(239,191,189);continue}if(o+1===n){(t-=3)>-1&&a.push(239,191,189);continue}i=r;continue}if(r<56320){(t-=3)>-1&&a.push(239,191,189),i=r;continue}r=65536+(i-55296<<10|r-56320)}else i&&(t-=3)>-1&&a.push(239,191,189);if(i=null,r<128){if((t-=1)<0)break;a.push(r)}else if(r<2048){if((t-=2)<0)break;a.push(r>>6|192,63&r|128)}else if(r<65536){if((t-=3)<0)break;a.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;a.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return a}function W(e){return t.toByteArray(function(e){if((e=(e=e.split("=")[0]).trim().replace(q,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function D(e,t,r,n){for(var i=0;i=t.length||i>=e.length);++i)t[i+r]=e[i];return i}function N(e,t){return e instanceof t||null!=e&&null!=e.constructor&&null!=e.constructor.name&&e.constructor.name===t.name}function j(e){return e!=e}}).call(this)}).call(this,e("buffer").Buffer)},{"base64-js":2,buffer:7,ieee754:209}],8:[function(e,t,r){"use strict";var n=e("get-intrinsic"),i=e("./"),a=i(n("String.prototype.indexOf"));t.exports=function(e,t){var r=n(e,!!t);return"function"==typeof r&&a(e,".prototype.")>-1?i(r):r}},{"./":9,"get-intrinsic":205}],9:[function(e,t,r){"use strict";var n=e("function-bind"),i=e("get-intrinsic"),a=i("%Function.prototype.apply%"),o=i("%Function.prototype.call%"),s=i("%Reflect.apply%",!0)||n.call(o,a),l=i("%Object.getOwnPropertyDescriptor%",!0),c=i("%Object.defineProperty%",!0),u=i("%Math.max%");if(c)try{c({},"a",{value:1})}catch(e){c=null}t.exports=function(e){var t=s(n,o,arguments);if(l&&c){var r=l(t,"length");r.configurable&&c(t,"length",{value:u(0,e.length-(arguments.length-1))})}return t};var d=function(){return s(n,a,arguments)};c?c(t.exports,"apply",{value:d}):t.exports.apply=d},{"function-bind":204,"get-intrinsic":205}],10:[function(e,t,r){"use strict";t.exports=function(e){!function(e){if(!e)throw new TypeError("Expected implementation");var t=n.filter((function(t){return"function"!=typeof e[t]}));if(t.length){var r="("+t.join(", ")+")";throw new Error("Expected functions "+r+" to be implemented")}}(e);var t={},r={removeSubsets:function(e){return function(e,t){var r,n,i,a=t.length;for(;--a>-1;){for(r=n=t[a],t[a]=null,i=!0;n;){if(t.indexOf(n)>-1){i=!1,t.splice(a,1);break}n=e.getParent(n)}i&&(t[a]=r)}return t}(t,e)},existsOne:function(e,r){return function(e,t,r){return r.some((function(r){return!!e.isTag(r)&&(t(r)||e.existsOne(t,e.getChildren(r)))}))}(t,e,r)},getSiblings:function(e){return function(e,t){var r=e.getParent(t);return r&&e.getChildren(r)}(t,e)},hasAttrib:function(e,r){return function(e,t,r){return void 0!==e.getAttributeValue(t,r)}(t,e,r)},findOne:function(e,r){return function(e,t,r){for(var n=null,i=0,a=r.length;i0&&(n=e.findOne(t,o))}return n}(t,e,r)},findAll:function(e,r){return function(e,t,r){for(var n=[],i=0,a=r.length;i0}))).forEach(o.default),r=null!==(n=t.context)&&void 0!==n?n:r;var i=Array.isArray(r),u=r&&(Array.isArray(r)?r:[r]);!function(e,t,r){for(var n=t.adapter,i=!!(null==r?void 0:r.every((function(e){var t=n.getParent(e);return e===c.PLACEHOLDER_ELEMENT||!(!t||!n.isTag(t))}))),a=0,o=e;a0&&s.isTraversal(l[0])&&"descendant"!==l[0].type);else{if(!i||l.some(d))continue;l.unshift(p)}l.unshift(h)}}(e,t,u);var y=!1,b=e.map((function(e){if(e.length>=2){var r=e[0],n=e[1];"pseudo"!==r.type||"scope"!==r.name||(i&&"descendant"===n.type?e[1]=m:"adjacent"!==n.type&&"sibling"!==n.type||(y=!0))}return function(e,t,r){var n;return e.reduce((function(e,n){return e===a.falseFunc?a.falseFunc:l.compileGeneralSelector(e,n,t,r,f)}),null!==(n=t.rootFunc)&&void 0!==n?n:a.trueFunc)}(e,t,u)})).reduce(g,a.falseFunc);return b.shouldTestNextSiblings=y,b}function g(e,t){return t===a.falseFunc||e===a.trueFunc?e:e===a.falseFunc||t===a.trueFunc?t:function(r){return e(r)||t(r)}}r.compileToken=f},{"./general":13,"./procedure":15,"./pseudo-selectors/subselects":19,"./sort":20,boolbase:3,"css-what":135}],13:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.compileGeneralSelector=void 0;var n=e("./attributes"),i=e("./pseudo-selectors");r.compileGeneralSelector=function(e,t,r,a,o){var s=r.adapter,l=r.equals;switch(t.type){case"pseudo-element":throw new Error("Pseudo-elements are not supported by css-select");case"attribute":if(r.strict&&(t.ignoreCase||"not"===t.action))throw new Error("Unsupported attribute selector");return n.attributeRules[t.action](e,t,r);case"pseudo":return i.compilePseudoSelector(e,t,r,a,o);case"tag":return function(r){return s.getName(r)===t.name&&e(r)};case"descendant":if(!1===r.cacheResults||"undefined"==typeof WeakSet)return function(t){for(var r=t;r=s.getParent(r);)if(s.isTag(r)&&e(r))return!0;return!1};var c=new WeakSet;return function(t){for(var r=t;r=s.getParent(r);)if(!c.has(r)){if(s.isTag(r)&&e(r))return!0;c.add(r)}return!1};case"_flexibleDescendant":return function(t){var r=t;do{if(s.isTag(r)&&e(r))return!0}while(r=s.getParent(r));return!1};case"parent":if(r.strict)throw new Error("Parent selector isn't part of CSS3");return function(t){return s.getChildren(t).some((function(t){return s.isTag(t)&&e(t)}))};case"child":return function(t){var r=s.getParent(t);return!!r&&s.isTag(r)&&e(r)};case"sibling":return function(t){for(var r=s.getSiblings(t),n=0;n=0&&!o(t,r[a]);a--)n.isTag(r[a])&&i++;return s(i)&&e(t)}},"nth-of-type":function(e,t,r){var n=r.adapter,o=r.equals,s=i.default(t);return s===a.falseFunc?a.falseFunc:s===a.trueFunc?l(e,n):function(t){for(var r=n.getSiblings(t),i=0,a=0;a=0;a--){var l=r[a];if(o(t,l))break;n.isTag(l)&&n.getName(l)===n.getName(t)&&i++}return s(i)&&e(t)}},root:function(e,t,r){var n=r.adapter;return function(t){var r=n.getParent(t);return(null==r||!n.isTag(r))&&e(t)}},scope:function(e,t,n,i){var a=n.equals;return i&&0!==i.length?1===i.length?function(t){return a(i[0],t)&&e(t)}:function(t){return i.includes(t)&&e(t)}:r.filters.root(e,t,n)},checkbox:s("type","checkbox"),file:s("type","file"),password:s("type","password"),radio:s("type","radio"),reset:s("type","reset"),image:s("type","image"),submit:s("type","submit"),hover:function(e,t,r){var n=r.adapter.isHovered;return"function"!=typeof n?a.falseFunc:function(t){return n(t)&&e(t)}},visited:function(e,t,r){var n=r.adapter.isVisited;return"function"!=typeof n?a.falseFunc:function(t){return n(t)&&e(t)}},active:function(e,t,r){var n=r.adapter.isActive;return"function"!=typeof n?a.falseFunc:function(t){return n(t)&&e(t)}}}},{"../attributes":11,boolbase:3,"nth-check":215}],17:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.compilePseudoSelector=r.pseudos=r.filters=void 0;var n=e("boolbase"),i=e("./filters");Object.defineProperty(r,"filters",{enumerable:!0,get:function(){return i.filters}});var a=e("./pseudos");Object.defineProperty(r,"pseudos",{enumerable:!0,get:function(){return a.pseudos}});var o=e("./subselects"),s=/^(?:(?:nth|last|first|only)-(?:child|of-type)|root|empty|(?:en|dis)abled|checked|not)$/;r.compilePseudoSelector=function(e,t,r,l,c){var u=t.name,d=t.data;if(r.strict&&!s.test(u))throw new Error(":"+u+" isn't part of CSS3");if(Array.isArray(d))return o.subselects[u](e,d,r,l,c);if(u in i.filters)return i.filters[u](e,d,r,l);if(u in a.pseudos){var p=a.pseudos[u];return a.verifyPseudoArgs(p,u,d),p===n.falseFunc?n.falseFunc:e===n.trueFunc?function(e){return p(e,r,d)}:function(t){return p(t,r,d)&&e(t)}}throw new Error("unmatched pseudo-class :"+u)}},{"./filters":16,"./pseudos":18,"./subselects":19,boolbase:3}],18:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.verifyPseudoArgs=r.pseudos=void 0;var n=i(["a","area","link"]);function i(e){if("undefined"!=typeof Set){var t=new Set(e);return function(e,r){var n=r.adapter;return t.has(n.getName(e))}}return function(t,r){var n=r.adapter;return e.includes(n.getName(t))}}r.pseudos={empty:function(e,t){var r=t.adapter;return!r.getChildren(e).some((function(e){return r.isTag(e)||""!==r.getText(e)}))},"first-child":function(e,t){var r=t.adapter,n=t.equals,i=r.getSiblings(e).find((function(e){return r.isTag(e)}));return null!=i&&n(e,i)},"last-child":function(e,t){for(var r=t.adapter,n=t.equals,i=r.getSiblings(e),a=i.length-1;a>=0;a--){if(n(e,i[a]))return!0;if(r.isTag(i[a]))break}return!1},"first-of-type":function(e,t){for(var r=t.adapter,n=t.equals,i=r.getSiblings(e),a=r.getName(e),o=0;o=0;o--){var s=i[o];if(n(e,s))return!0;if(r.isTag(s)&&r.getName(s)===a)break}return!1},"only-of-type":function(e,t){var r=t.adapter,n=t.equals,i=r.getName(e);return r.getSiblings(e).every((function(t){return n(e,t)||!r.isTag(t)||r.getName(t)!==i}))},"only-child":function(e,t){var r=t.adapter,n=t.equals;return r.getSiblings(e).every((function(t){return n(e,t)||!r.isTag(t)}))},"any-link":function(e,t){return n(e,t)&&t.adapter.hasAttrib(e,"href")},link:function(e,t){var n,i;return!0!==(null===(i=(n=t.adapter).isVisited)||void 0===i?void 0:i.call(n,e))&&r.pseudos["any-link"](e,t)},selected:function(e,t){var r=t.adapter,n=t.equals;if(r.hasAttrib(e,"selected"))return!0;if("option"!==r.getName(e))return!1;var i=r.getParent(e);if(!i||!r.isTag(i)||"select"!==r.getName(i)||r.hasAttrib(i,"multiple"))return!1;for(var a=r.getChildren(i),o=!1,s=0;s2&&"scope"!==t)throw new Error("pseudo-selector :"+t+" requires an argument")}else if(2===e.length)throw new Error("pseudo-selector :"+t+" doesn't have any arguments")}},{}],19:[function(e,t,r){"use strict";var n=this&&this.__spreadArrays||function(){for(var e=0,t=0,r=arguments.length;t1||t.some(o)))throw new Error("complex selectors in :not aren't allowed in strict mode");var l=a(t,s,n);return l===i.falseFunc?e:l===i.trueFunc?i.falseFunc:function(t){return!l(t)&&e(t)}},has:function(e,t,a,c,u){var d=a.adapter,p={xmlMode:!!a.xmlMode,strict:!!a.strict,adapter:d,equals:a.equals},m=t.some(o)?[r.PLACEHOLDER_ELEMENT]:void 0,h=u(t,p,m);if(h===i.falseFunc)return i.falseFunc;if(h===i.trueFunc)return function(t){return d.getChildren(t).some(d.isTag)&&e(t)};var f=s(h,d),g=h.shouldTestNextSiblings,y=void 0!==g&&g;return m?function(t){m[0]=t;var r=d.getChildren(t),i=y?n(r,l(t,d)):r;return e(t)&&d.existsOne(f,i)}:function(t){return e(t)&&d.existsOne(f,d.getChildren(t))}}}},{"../procedure":15,boolbase:3}],20:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("./procedure"),i={exists:10,equals:8,not:7,start:6,end:6,any:5,hyphen:4,element:4};function a(e){var t=n.procedure[e.type];if("attribute"===e.type)(t=i[e.action])===i.equals&&"id"===e.name&&(t=9),e.ignoreCase&&(t>>=1);else if("pseudo"===e.type)if(e.data)if("has"===e.name||"contains"===e.name)t=0;else if(Array.isArray(e.data)){t=0;for(var r=0;rt&&(t=o)}e.data.length>1&&t>0&&(t-=1)}else t=1;else t=3;return t}r.default=function(e){for(var t=e.map(a),r=1;r=0&&n"},"font-face":{descriptors:{"unicode-range":{comment:"replaces , an old production name",syntax:"#"}}}},properties:{"-moz-background-clip":{comment:"deprecated syntax in old Firefox, https://developer.mozilla.org/en/docs/Web/CSS/background-clip",syntax:"padding | border"},"-moz-border-radius-bottomleft":{comment:"https://developer.mozilla.org/en-US/docs/Web/CSS/border-bottom-left-radius",syntax:"<'border-bottom-left-radius'>"},"-moz-border-radius-bottomright":{comment:"https://developer.mozilla.org/en-US/docs/Web/CSS/border-bottom-right-radius",syntax:"<'border-bottom-right-radius'>"},"-moz-border-radius-topleft":{comment:"https://developer.mozilla.org/en-US/docs/Web/CSS/border-top-left-radius",syntax:"<'border-top-left-radius'>"},"-moz-border-radius-topright":{comment:"https://developer.mozilla.org/en-US/docs/Web/CSS/border-bottom-right-radius",syntax:"<'border-bottom-right-radius'>"},"-moz-control-character-visibility":{comment:"firefox specific keywords, https://bugzilla.mozilla.org/show_bug.cgi?id=947588",syntax:"visible | hidden"},"-moz-osx-font-smoothing":{comment:"misssed old syntax https://developer.mozilla.org/en-US/docs/Web/CSS/font-smooth",syntax:"auto | grayscale"},"-moz-user-select":{comment:"https://developer.mozilla.org/en-US/docs/Web/CSS/user-select",syntax:"none | text | all | -moz-none"},"-ms-flex-align":{comment:"misssed old syntax implemented in IE, https://www.w3.org/TR/2012/WD-css3-flexbox-20120322/#flex-align",syntax:"start | end | center | baseline | stretch"},"-ms-flex-item-align":{comment:"misssed old syntax implemented in IE, https://www.w3.org/TR/2012/WD-css3-flexbox-20120322/#flex-align",syntax:"auto | start | end | center | baseline | stretch"},"-ms-flex-line-pack":{comment:"misssed old syntax implemented in IE, https://www.w3.org/TR/2012/WD-css3-flexbox-20120322/#flex-line-pack",syntax:"start | end | center | justify | distribute | stretch"},"-ms-flex-negative":{comment:"misssed old syntax implemented in IE; TODO: find references for comfirmation",syntax:"<'flex-shrink'>"},"-ms-flex-pack":{comment:"misssed old syntax implemented in IE, https://www.w3.org/TR/2012/WD-css3-flexbox-20120322/#flex-pack",syntax:"start | end | center | justify | distribute"},"-ms-flex-order":{comment:"misssed old syntax implemented in IE; https://msdn.microsoft.com/en-us/library/jj127303(v=vs.85).aspx",syntax:""},"-ms-flex-positive":{comment:"misssed old syntax implemented in IE; TODO: find references for comfirmation",syntax:"<'flex-grow'>"},"-ms-flex-preferred-size":{comment:"misssed old syntax implemented in IE; TODO: find references for comfirmation",syntax:"<'flex-basis'>"},"-ms-interpolation-mode":{comment:"https://msdn.microsoft.com/en-us/library/ff521095(v=vs.85).aspx",syntax:"nearest-neighbor | bicubic"},"-ms-grid-column-align":{comment:"add this property first since it uses as fallback for flexbox, https://msdn.microsoft.com/en-us/library/windows/apps/hh466338.aspx",syntax:"start | end | center | stretch"},"-ms-grid-row-align":{comment:"add this property first since it uses as fallback for flexbox, https://msdn.microsoft.com/en-us/library/windows/apps/hh466348.aspx",syntax:"start | end | center | stretch"},"-ms-hyphenate-limit-last":{comment:"misssed old syntax implemented in IE; https://www.w3.org/TR/css-text-4/#hyphenate-line-limits",syntax:"none | always | column | page | spread"},"-webkit-appearance":{comment:"webkit specific keywords",references:["http://css-infos.net/property/-webkit-appearance"],syntax:"none | button | button-bevel | caps-lock-indicator | caret | checkbox | default-button | inner-spin-button | listbox | listitem | media-controls-background | media-controls-fullscreen-background | media-current-time-display | media-enter-fullscreen-button | media-exit-fullscreen-button | media-fullscreen-button | media-mute-button | media-overlay-play-button | media-play-button | media-seek-back-button | media-seek-forward-button | media-slider | media-sliderthumb | media-time-remaining-display | media-toggle-closed-captions-button | media-volume-slider | media-volume-slider-container | media-volume-sliderthumb | menulist | menulist-button | menulist-text | menulist-textfield | meter | progress-bar | progress-bar-value | push-button | radio | scrollbarbutton-down | scrollbarbutton-left | scrollbarbutton-right | scrollbarbutton-up | scrollbargripper-horizontal | scrollbargripper-vertical | scrollbarthumb-horizontal | scrollbarthumb-vertical | scrollbartrack-horizontal | scrollbartrack-vertical | searchfield | searchfield-cancel-button | searchfield-decoration | searchfield-results-button | searchfield-results-decoration | slider-horizontal | slider-vertical | sliderthumb-horizontal | sliderthumb-vertical | square-button | textarea | textfield | -apple-pay-button"},"-webkit-background-clip":{comment:"https://developer.mozilla.org/en/docs/Web/CSS/background-clip",syntax:"[ | border | padding | content | text ]#"},"-webkit-column-break-after":{comment:"added, http://help.dottoro.com/lcrthhhv.php",syntax:"always | auto | avoid"},"-webkit-column-break-before":{comment:"added, http://help.dottoro.com/lcxquvkf.php",syntax:"always | auto | avoid"},"-webkit-column-break-inside":{comment:"added, http://help.dottoro.com/lclhnthl.php",syntax:"always | auto | avoid"},"-webkit-font-smoothing":{comment:"https://developer.mozilla.org/en-US/docs/Web/CSS/font-smooth",syntax:"auto | none | antialiased | subpixel-antialiased"},"-webkit-mask-box-image":{comment:"missed; https://developer.mozilla.org/en-US/docs/Web/CSS/-webkit-mask-box-image",syntax:"[ | | none ] [ {4} <-webkit-mask-box-repeat>{2} ]?"},"-webkit-print-color-adjust":{comment:"missed",references:["https://developer.mozilla.org/en/docs/Web/CSS/-webkit-print-color-adjust"],syntax:"economy | exact"},"-webkit-text-security":{comment:"missed; http://help.dottoro.com/lcbkewgt.php",syntax:"none | circle | disc | square"},"-webkit-user-drag":{comment:"missed; http://help.dottoro.com/lcbixvwm.php",syntax:"none | element | auto"},"-webkit-user-select":{comment:"auto is supported by old webkit, https://developer.mozilla.org/en-US/docs/Web/CSS/user-select",syntax:"auto | none | text | all"},"alignment-baseline":{comment:"added SVG property",references:["https://www.w3.org/TR/SVG/text.html#AlignmentBaselineProperty"],syntax:"auto | baseline | before-edge | text-before-edge | middle | central | after-edge | text-after-edge | ideographic | alphabetic | hanging | mathematical"},"baseline-shift":{comment:"added SVG property",references:["https://www.w3.org/TR/SVG/text.html#BaselineShiftProperty"],syntax:"baseline | sub | super | "},behavior:{comment:"added old IE property https://msdn.microsoft.com/en-us/library/ms530723(v=vs.85).aspx",syntax:"+"},"clip-rule":{comment:"added SVG property",references:["https://www.w3.org/TR/SVG/masking.html#ClipRuleProperty"],syntax:"nonzero | evenodd"},cue:{comment:"https://www.w3.org/TR/css3-speech/#property-index",syntax:"<'cue-before'> <'cue-after'>?"},"cue-after":{comment:"https://www.w3.org/TR/css3-speech/#property-index",syntax:" ? | none"},"cue-before":{comment:"https://www.w3.org/TR/css3-speech/#property-index",syntax:" ? | none"},cursor:{comment:"added legacy keywords: hand, -webkit-grab. -webkit-grabbing, -webkit-zoom-in, -webkit-zoom-out, -moz-grab, -moz-grabbing, -moz-zoom-in, -moz-zoom-out",references:["https://www.sitepoint.com/css3-cursor-styles/"],syntax:"[ [ [ ]? , ]* [ auto | default | none | context-menu | help | pointer | progress | wait | cell | crosshair | text | vertical-text | alias | copy | move | no-drop | not-allowed | e-resize | n-resize | ne-resize | nw-resize | s-resize | se-resize | sw-resize | w-resize | ew-resize | ns-resize | nesw-resize | nwse-resize | col-resize | row-resize | all-scroll | zoom-in | zoom-out | grab | grabbing | hand | -webkit-grab | -webkit-grabbing | -webkit-zoom-in | -webkit-zoom-out | -moz-grab | -moz-grabbing | -moz-zoom-in | -moz-zoom-out ] ]"},display:{comment:"extended with -ms-flexbox",syntax:"| <-non-standard-display>"},position:{comment:"extended with -webkit-sticky",syntax:"| -webkit-sticky"},"dominant-baseline":{comment:"added SVG property",references:["https://www.w3.org/TR/SVG/text.html#DominantBaselineProperty"],syntax:"auto | use-script | no-change | reset-size | ideographic | alphabetic | hanging | mathematical | central | middle | text-after-edge | text-before-edge"},"image-rendering":{comment:"extended with <-non-standard-image-rendering>, added SVG keywords optimizeSpeed and optimizeQuality",references:["https://developer.mozilla.org/en/docs/Web/CSS/image-rendering","https://www.w3.org/TR/SVG/painting.html#ImageRenderingProperty"],syntax:"| optimizeSpeed | optimizeQuality | <-non-standard-image-rendering>"},fill:{comment:"added SVG property",references:["https://www.w3.org/TR/SVG/painting.html#FillProperty"],syntax:""},"fill-opacity":{comment:"added SVG property",references:["https://www.w3.org/TR/SVG/painting.html#FillProperty"],syntax:""},"fill-rule":{comment:"added SVG property",references:["https://www.w3.org/TR/SVG/painting.html#FillProperty"],syntax:"nonzero | evenodd"},filter:{comment:"extend with IE legacy syntaxes",syntax:"| <-ms-filter-function-list>"},"glyph-orientation-horizontal":{comment:"added SVG property",references:["https://www.w3.org/TR/SVG/text.html#GlyphOrientationHorizontalProperty"],syntax:""},"glyph-orientation-vertical":{comment:"added SVG property",references:["https://www.w3.org/TR/SVG/text.html#GlyphOrientationVerticalProperty"],syntax:""},kerning:{comment:"added SVG property",references:["https://www.w3.org/TR/SVG/text.html#KerningProperty"],syntax:"auto | "},"letter-spacing":{comment:"fix syntax -> ",references:["https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/letter-spacing"],syntax:"normal | "},marker:{comment:"added SVG property",references:["https://www.w3.org/TR/SVG/painting.html#MarkerProperties"],syntax:"none | "},"marker-end":{comment:"added SVG property",references:["https://www.w3.org/TR/SVG/painting.html#MarkerProperties"],syntax:"none | "},"marker-mid":{comment:"added SVG property",references:["https://www.w3.org/TR/SVG/painting.html#MarkerProperties"],syntax:"none | "},"marker-start":{comment:"added SVG property",references:["https://www.w3.org/TR/SVG/painting.html#MarkerProperties"],syntax:"none | "},"max-width":{comment:"fix auto -> none (https://github.com/mdn/data/pull/431); extend by non-standard width keywords https://developer.mozilla.org/en-US/docs/Web/CSS/max-width",syntax:"none | | min-content | max-content | fit-content() | <-non-standard-width>"},"min-width":{comment:"extend by non-standard width keywords https://developer.mozilla.org/en-US/docs/Web/CSS/width",syntax:"auto | | min-content | max-content | fit-content() | <-non-standard-width>"},overflow:{comment:"extend by vendor keywords https://developer.mozilla.org/en-US/docs/Web/CSS/overflow",syntax:"| <-non-standard-overflow>"},pause:{comment:"https://www.w3.org/TR/css3-speech/#property-index",syntax:"<'pause-before'> <'pause-after'>?"},"pause-after":{comment:"https://www.w3.org/TR/css3-speech/#property-index",syntax:"