fabric 5.3.0 → 6.0.0-beta10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.babelrc +11 -0
- package/.babelrcAlt +19 -0
- package/.browserslistrc +5 -0
- package/.eslintignore +3 -0
- package/.eslintrc.js +51 -0
- package/.eslintrc.json +38 -46
- package/.eslintrc_tests +12 -0
- package/.gitattributes +2 -0
- package/.gitpod.yml +17 -1
- package/.prettierignore +19 -0
- package/.prettierrc +4 -0
- package/CHANGELOG.md +615 -189
- package/CONTRIBUTING.md +233 -59
- package/README.md +200 -235
- package/babel-jest.config.js +6 -0
- package/bower.json +1 -3
- package/dist/fabric.d.ts +54 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +28452 -0
- package/dist/index.js.map +1 -0
- package/dist/index.min.js +1 -0
- package/dist/index.mjs +28385 -0
- package/dist/index.mjs.map +1 -0
- package/dist/index.node.cjs +28538 -0
- package/dist/index.node.cjs.map +1 -0
- package/dist/index.node.d.ts +20 -0
- package/dist/index.node.mjs +28477 -0
- package/dist/index.node.mjs.map +1 -0
- package/dist/src/ClassRegistry.d.ts +13 -0
- package/dist/src/Collection.d.ts +136 -0
- package/dist/src/CommonMethods.d.ts +32 -0
- package/dist/src/EventTypeDefs.d.ts +227 -0
- package/dist/src/Intersection.d.ts +112 -0
- package/dist/src/Observable.d.ts +60 -0
- package/dist/src/Pattern/Pattern.d.ts +99 -0
- package/dist/src/Pattern/index.d.ts +3 -0
- package/dist/src/Pattern/types.d.ts +9 -0
- package/dist/src/Point.d.ts +232 -0
- package/dist/src/Shadow.d.ts +96 -0
- package/dist/src/brushes/BaseBrush.d.ts +101 -0
- package/dist/src/brushes/CircleBrush.d.ts +44 -0
- package/dist/src/brushes/CircleBrush.test.d.ts +2 -0
- package/dist/src/brushes/PatternBrush.d.ts +23 -0
- package/dist/src/brushes/PencilBrush.d.ts +92 -0
- package/dist/src/brushes/SprayBrush.d.ts +74 -0
- package/dist/src/brushes/typedefs.d.ts +18 -0
- package/dist/src/cache.d.ts +47 -0
- package/dist/src/canvas/Canvas.d.ts +364 -0
- package/dist/src/canvas/DOMManagers/CanvasDOMManager.d.ts +29 -0
- package/dist/src/canvas/DOMManagers/StaticCanvasDOMManager.d.ts +29 -0
- package/dist/src/canvas/DOMManagers/util.d.ts +24 -0
- package/dist/src/canvas/DOMManagers/util.spec.d.ts +2 -0
- package/dist/src/canvas/SelectableCanvas.d.ts +723 -0
- package/dist/src/canvas/StaticCanvas.d.ts +747 -0
- package/dist/src/canvas/TextEditingManager.d.ts +21 -0
- package/dist/src/canvas/canvas_gestures.mixin.d.ts +2 -0
- package/dist/src/color/Color.d.ts +152 -0
- package/dist/src/color/color_map.d.ts +155 -0
- package/dist/src/color/constants.d.ts +104 -0
- package/dist/src/color/typedefs.d.ts +16 -0
- package/dist/src/color/util.d.ts +27 -0
- package/dist/src/config.d.ts +115 -0
- package/dist/src/constants.d.ts +21 -0
- package/dist/src/controls/Control.d.ts +229 -0
- package/dist/src/controls/changeWidth.d.ts +13 -0
- package/dist/src/controls/commonControls.d.ts +28 -0
- package/dist/src/controls/controlRendering.d.ts +29 -0
- package/dist/src/controls/drag.d.ts +12 -0
- package/dist/src/controls/fireEvent.d.ts +3 -0
- package/dist/src/controls/index.d.ts +13 -0
- package/dist/src/controls/polyControl.d.ts +5 -0
- package/dist/src/controls/rotate.d.ts +12 -0
- package/dist/src/controls/scale.d.ts +47 -0
- package/dist/src/controls/scaleSkew.d.ts +39 -0
- package/dist/src/controls/skew.d.ts +33 -0
- package/dist/src/controls/util.d.ts +41 -0
- package/dist/src/controls/wrapWithFireEvent.d.ts +8 -0
- package/dist/src/controls/wrapWithFixedAnchor.d.ts +9 -0
- package/dist/src/env/browser.d.ts +3 -0
- package/dist/src/env/index.d.ts +28 -0
- package/dist/src/env/node.d.ts +6 -0
- package/dist/src/env/types.d.ts +15 -0
- package/dist/src/filters/BaseFilter.d.ts +160 -0
- package/dist/src/filters/BlendColor.d.ts +81 -0
- package/dist/src/filters/BlendImage.d.ts +93 -0
- package/dist/src/filters/Blur.d.ts +52 -0
- package/dist/src/filters/Boilerplate.d.ts +48 -0
- package/dist/src/filters/Brightness.d.ts +48 -0
- package/dist/src/filters/Canvas2dFilterBackend.d.ts +27 -0
- package/dist/src/filters/ColorMatrix.d.ts +64 -0
- package/dist/src/filters/ColorMatrixFilters.d.ts +537 -0
- package/dist/src/filters/Composed.d.ts +46 -0
- package/dist/src/filters/Contrast.d.ts +46 -0
- package/dist/src/filters/Convolute.d.ts +83 -0
- package/dist/src/filters/FilterBackend.d.ts +15 -0
- package/dist/src/filters/GLProbes/GLProbe.d.ts +7 -0
- package/dist/src/filters/GLProbes/NodeGLProbe.d.ts +11 -0
- package/dist/src/filters/GLProbes/WebGLProbe.d.ts +20 -0
- package/dist/src/filters/Gamma.d.ts +55 -0
- package/dist/src/filters/Grayscale.d.ts +47 -0
- package/dist/src/filters/HueRotation.d.ts +25 -0
- package/dist/src/filters/Invert.d.ts +56 -0
- package/dist/src/filters/Noise.d.ts +55 -0
- package/dist/src/filters/Pixelate.d.ts +45 -0
- package/dist/src/filters/RemoveColor.d.ts +64 -0
- package/dist/src/filters/Resize.d.ts +137 -0
- package/dist/src/filters/Saturation.d.ts +49 -0
- package/dist/src/filters/Vibrance.d.ts +49 -0
- package/dist/src/filters/WebGLFilterBackend.d.ts +128 -0
- package/dist/src/filters/filters.d.ts +21 -0
- package/dist/src/filters/index.d.ts +7 -0
- package/dist/src/filters/shaders/baseFilter.d.ts +4 -0
- package/dist/src/filters/shaders/blendColor.d.ts +13 -0
- package/dist/src/filters/shaders/blendImage.d.ts +3 -0
- package/dist/src/filters/shaders/blur.d.ts +2 -0
- package/dist/src/filters/shaders/brightness.d.ts +2 -0
- package/dist/src/filters/shaders/colorMatrix.d.ts +2 -0
- package/dist/src/filters/shaders/constrast.d.ts +2 -0
- package/dist/src/filters/shaders/convolute.d.ts +11 -0
- package/dist/src/filters/shaders/gamma.d.ts +2 -0
- package/dist/src/filters/shaders/grayscale.d.ts +3 -0
- package/dist/src/filters/shaders/invert.d.ts +2 -0
- package/dist/src/filters/shaders/noise.d.ts +2 -0
- package/dist/src/filters/shaders/pixelate.d.ts +2 -0
- package/dist/src/filters/shaders/removeColor.d.ts +2 -0
- package/dist/src/filters/shaders/saturation.d.ts +2 -0
- package/dist/src/filters/shaders/vibrance.d.ts +2 -0
- package/dist/src/filters/typedefs.d.ts +48 -0
- package/dist/src/filters/utils.d.ts +3 -0
- package/dist/src/gradient/Gradient.d.ts +150 -0
- package/dist/src/gradient/constants.d.ts +15 -0
- package/dist/src/gradient/index.d.ts +3 -0
- package/dist/src/gradient/parser/index.d.ts +4 -0
- package/dist/src/gradient/parser/misc.d.ts +4 -0
- package/dist/src/gradient/parser/parseColorStops.d.ts +3 -0
- package/dist/src/gradient/parser/parseCoords.d.ts +17 -0
- package/dist/src/gradient/typedefs.d.ts +93 -0
- package/dist/src/mixins/eraser_brush.mixin.d.ts +2 -0
- package/dist/src/parkinglot/canvas_animation.mixin.d.ts +2 -0
- package/dist/src/parkinglot/straighten.d.ts +2 -0
- package/dist/src/parser/applyViewboxTransform.d.ts +5 -0
- package/dist/src/parser/attributes.d.ts +6 -0
- package/dist/src/parser/constants.d.ts +53 -0
- package/dist/src/parser/doesSomeParentMatch.d.ts +2 -0
- package/dist/src/parser/elementById.d.ts +6 -0
- package/dist/src/parser/elementMatchesRule.d.ts +5 -0
- package/dist/src/parser/elements_parser.d.ts +3 -0
- package/dist/src/parser/getCSSRules.d.ts +7 -0
- package/dist/src/parser/getGlobalStylesForElement.d.ts +5 -0
- package/dist/src/parser/getGradientDefs.d.ts +7 -0
- package/dist/src/parser/getMultipleNodes.d.ts +2 -0
- package/dist/src/parser/getSvgRegex.d.ts +2 -0
- package/dist/src/parser/hasAncestorWithNodeName.d.ts +2 -0
- package/dist/src/parser/index.d.ts +9 -0
- package/dist/src/parser/loadSVGFromString.d.ts +18 -0
- package/dist/src/parser/loadSVGFromURL.d.ts +19 -0
- package/dist/src/parser/normalizeAttr.d.ts +2 -0
- package/dist/src/parser/normalizeValue.d.ts +2 -0
- package/dist/src/parser/parseAttributes.d.ts +9 -0
- package/dist/src/parser/parseFontDeclaration.d.ts +10 -0
- package/dist/src/parser/parsePointsAttribute.d.ts +12 -0
- package/dist/src/parser/parseSVGDocument.d.ts +23 -0
- package/dist/src/parser/parseStyleAttribute.d.ts +9 -0
- package/dist/src/parser/parseStyleObject.d.ts +2 -0
- package/dist/src/parser/parseStyleString.d.ts +2 -0
- package/dist/src/parser/parseTransformAttribute.d.ts +11 -0
- package/dist/src/parser/parseUseDirectives.d.ts +2 -0
- package/dist/src/parser/percent.d.ts +9 -0
- package/dist/src/parser/recursivelyParseGradientsXlink.d.ts +2 -0
- package/dist/src/parser/selectorMatches.d.ts +2 -0
- package/dist/src/parser/setStrokeFillOpacity.d.ts +6 -0
- package/dist/src/parser/typedefs.d.ts +9 -0
- package/dist/src/shapes/ActiveSelection.d.ts +83 -0
- package/dist/src/shapes/Circle.d.ts +99 -0
- package/dist/src/shapes/Ellipse.d.ts +84 -0
- package/dist/src/shapes/Group.d.ts +407 -0
- package/dist/src/shapes/IText/DraggableTextDelegate.d.ts +78 -0
- package/dist/src/shapes/IText/IText.d.ts +336 -0
- package/dist/src/shapes/IText/ITextBehavior.d.ts +287 -0
- package/dist/src/shapes/IText/ITextClickBehavior.d.ts +73 -0
- package/dist/src/shapes/IText/ITextKeyBehavior.d.ts +195 -0
- package/dist/src/shapes/IText/constants.d.ts +13 -0
- package/dist/src/shapes/Image.d.ts +309 -0
- package/dist/src/shapes/Line.d.ts +121 -0
- package/dist/src/shapes/Object/AnimatableObject.d.ts +33 -0
- package/dist/src/shapes/Object/FabricObject.d.ts +11 -0
- package/dist/src/shapes/Object/FabricObjectSVGExportMixin.d.ts +74 -0
- package/dist/src/shapes/Object/InteractiveObject.d.ts +296 -0
- package/dist/src/shapes/Object/Object.d.ts +599 -0
- package/dist/src/shapes/Object/ObjectGeometry.d.ts +327 -0
- package/dist/src/shapes/Object/ObjectOrigin.d.ts +109 -0
- package/dist/src/shapes/Object/StackedObject.d.ts +72 -0
- package/dist/src/shapes/Object/defaultValues.d.ts +76 -0
- package/dist/src/shapes/Object/types/BaseProps.d.ts +84 -0
- package/dist/src/shapes/Object/types/BorderProps.d.ts +37 -0
- package/dist/src/shapes/Object/types/ControlProps.d.ts +62 -0
- package/dist/src/shapes/Object/types/FabricObjectProps.d.ts +96 -0
- package/dist/src/shapes/Object/types/FillStrokeProps.d.ts +80 -0
- package/dist/src/shapes/Object/types/LockInteractionProps.d.ts +51 -0
- package/dist/src/shapes/Object/types/ObjectProps.d.ts +42 -0
- package/dist/src/shapes/Object/types/SerializedObjectProps.d.ts +66 -0
- package/dist/src/shapes/Object/types/index.d.ts +6 -0
- package/dist/src/shapes/Path.d.ts +214 -0
- package/dist/src/shapes/Polygon.d.ts +10 -0
- package/dist/src/shapes/Polyline.d.ts +147 -0
- package/dist/src/shapes/Rect.d.ts +82 -0
- package/dist/src/shapes/Text/StyledText.d.ts +123 -0
- package/dist/src/shapes/Text/Text.d.ts +688 -0
- package/dist/src/shapes/Text/TextSVGExportMixin.d.ts +32 -0
- package/dist/src/shapes/Text/constants.d.ts +13 -0
- package/dist/src/shapes/Textbox.d.ts +204 -0
- package/dist/src/shapes/Triangle.d.ts +26 -0
- package/dist/src/typedefs.d.ts +96 -0
- package/dist/src/util/animation/AnimationBase.d.ts +54 -0
- package/dist/src/util/animation/AnimationFrameProvider.d.ts +3 -0
- package/dist/src/util/animation/AnimationRegistry.d.ts +29 -0
- package/dist/src/util/animation/ArrayAnimation.d.ts +10 -0
- package/dist/src/util/animation/ColorAnimation.d.ts +11 -0
- package/dist/src/util/animation/ValueAnimation.d.ts +10 -0
- package/dist/src/util/animation/animate.d.ts +37 -0
- package/dist/src/util/animation/easing.d.ts +130 -0
- package/dist/src/util/animation/index.d.ts +3 -0
- package/dist/src/util/animation/types.d.ts +87 -0
- package/dist/src/util/applyMixins.d.ts +8 -0
- package/dist/src/util/dom_event.d.ts +5 -0
- package/dist/src/util/dom_misc.d.ts +12 -0
- package/dist/src/util/dom_request.d.ts +14 -0
- package/dist/src/util/dom_style.d.ts +7 -0
- package/dist/src/util/index.d.ts +36 -0
- package/dist/src/util/internals/cleanupSvgAttribute.d.ts +2 -0
- package/dist/src/util/internals/cleanupSvgAttribute.test.d.ts +2 -0
- package/dist/src/util/internals/cloneDeep.d.ts +2 -0
- package/dist/src/util/internals/cloneDeep.test.d.ts +2 -0
- package/dist/src/util/internals/getRandomInt.d.ts +8 -0
- package/dist/src/util/internals/getRandomInt.test.d.ts +2 -0
- package/dist/src/util/internals/ifNaN.d.ts +8 -0
- package/dist/src/util/internals/index.d.ts +4 -0
- package/dist/src/util/internals/removeFromArray.d.ts +9 -0
- package/dist/src/util/internals/uid.d.ts +2 -0
- package/dist/src/util/lang_string.d.ts +22 -0
- package/dist/src/util/misc/boundingBoxFromPoints.d.ts +9 -0
- package/dist/src/util/misc/capValue.d.ts +2 -0
- package/dist/src/util/misc/cos.d.ts +10 -0
- package/dist/src/util/misc/dom.d.ts +28 -0
- package/dist/src/util/misc/findScaleTo.d.ts +20 -0
- package/dist/src/util/misc/groupSVGElements.d.ts +9 -0
- package/dist/src/util/misc/isTransparent.d.ts +11 -0
- package/dist/src/util/misc/matrix.d.ts +168 -0
- package/dist/src/util/misc/mergeClipPaths.d.ts +23 -0
- package/dist/src/util/misc/objectEnlive.d.ts +41 -0
- package/dist/src/util/misc/objectTransforms.d.ts +68 -0
- package/dist/src/util/misc/pick.d.ts +9 -0
- package/dist/src/util/misc/planeChange.d.ts +81 -0
- package/dist/src/util/misc/projectStroke/StrokeLineCapProjections.d.ts +52 -0
- package/dist/src/util/misc/projectStroke/StrokeLineJoinProjections.d.ts +82 -0
- package/dist/src/util/misc/projectStroke/StrokeProjectionsBase.d.ts +26 -0
- package/dist/src/util/misc/projectStroke/index.d.ts +12 -0
- package/dist/src/util/misc/projectStroke/types.d.ts +23 -0
- package/dist/src/util/misc/radiansDegreesConversion.d.ts +14 -0
- package/dist/src/util/misc/resolveOrigin.d.ts +9 -0
- package/dist/src/util/misc/rotatePoint.d.ts +12 -0
- package/dist/src/util/misc/sin.d.ts +10 -0
- package/dist/src/util/misc/svgParsing.d.ts +45 -0
- package/dist/src/util/misc/textStyles.d.ts +32 -0
- package/dist/src/util/misc/toFixed.d.ts +8 -0
- package/dist/src/util/misc/vectors.d.ts +58 -0
- package/dist/src/util/path/index.d.ts +96 -0
- package/dist/src/util/path/regex.d.ts +2 -0
- package/dist/src/util/path/typechecks.d.ts +24 -0
- package/dist/src/util/path/typedefs.d.ts +220 -0
- package/dist/src/util/transform_matrix_removal.d.ts +14 -0
- package/dist/src/util/typeAssertions.d.ts +19 -0
- package/e2e/site/index.html +25 -0
- package/e2e/utils/objects.ts +36 -0
- package/fabric.ts +72 -0
- package/index.node.ts +43 -0
- package/index.ts +1 -0
- package/jest.config.js +194 -0
- package/lib/aligning_guidelines.js +2 -2
- package/package.json +110 -40
- package/playwright.config.ts +64 -0
- package/publish.js +0 -26
- package/rollup.config.mjs +99 -0
- package/rollup.test.config.js +24 -0
- package/scripts/build.mjs +50 -0
- package/scripts/buildLock.mjs +115 -0
- package/scripts/buildReporter.mjs +15 -0
- package/scripts/buildStats.mjs +139 -0
- package/scripts/dirname.mjs +14 -0
- package/scripts/git.mjs +36 -0
- package/scripts/index.mjs +564 -0
- package/scripts/sandbox.mjs +149 -0
- package/src/ClassRegistry.ts +56 -0
- package/src/Collection.ts +346 -0
- package/src/CommonMethods.ts +63 -0
- package/src/EventTypeDefs.ts +298 -0
- package/src/Intersection.ts +302 -0
- package/src/Observable.ts +181 -0
- package/src/Pattern/Pattern.ts +207 -0
- package/src/Pattern/index.ts +2 -0
- package/src/Pattern/types.ts +17 -0
- package/src/Point.ts +388 -0
- package/src/Shadow.ts +214 -0
- package/src/brushes/{base_brush.class.js → BaseBrush.ts} +63 -42
- package/src/brushes/CircleBrush.test.ts +11 -0
- package/src/brushes/CircleBrush.ts +140 -0
- package/src/brushes/PatternBrush.ts +70 -0
- package/src/brushes/PencilBrush.ts +300 -0
- package/src/brushes/SprayBrush.ts +214 -0
- package/src/brushes/typedefs.ts +18 -0
- package/src/cache.ts +90 -0
- package/src/canvas/Canvas.ts +1598 -0
- package/src/canvas/DOMManagers/CanvasDOMManager.ts +124 -0
- package/src/canvas/DOMManagers/StaticCanvasDOMManager.ts +80 -0
- package/src/canvas/DOMManagers/util.spec.ts +26 -0
- package/src/canvas/DOMManagers/util.ts +98 -0
- package/src/canvas/SelectableCanvas.ts +1506 -0
- package/src/canvas/StaticCanvas.ts +1634 -0
- package/src/canvas/TextEditingManager.ts +70 -0
- package/src/canvas/canvas_gestures.mixin.ts +207 -0
- package/src/color/Color.ts +320 -0
- package/src/color/color_map.ts +154 -0
- package/src/color/constants.ts +107 -0
- package/src/color/typedefs.ts +18 -0
- package/src/color/util.ts +93 -0
- package/src/config.ts +159 -0
- package/src/constants.ts +29 -0
- package/src/controls/Control.ts +385 -0
- package/src/controls/changeWidth.ts +53 -0
- package/src/controls/commonControls.ts +105 -0
- package/src/controls/controlRendering.ts +138 -0
- package/src/controls/drag.ts +32 -0
- package/src/controls/fireEvent.ts +18 -0
- package/src/controls/index.ts +22 -0
- package/src/controls/polyControl.ts +135 -0
- package/src/controls/rotate.ts +87 -0
- package/src/controls/scale.ts +277 -0
- package/src/controls/scaleSkew.ts +92 -0
- package/src/controls/skew.ts +243 -0
- package/src/controls/util.ts +155 -0
- package/src/controls/wrapWithFireEvent.ts +25 -0
- package/src/controls/wrapWithFixedAnchor.ts +20 -0
- package/src/env/browser.ts +32 -0
- package/src/env/index.ts +38 -0
- package/src/env/node.ts +58 -0
- package/src/env/types.ts +15 -0
- package/src/filters/{base_filter.class.js → BaseFilter.ts} +203 -151
- package/src/filters/BlendColor.ts +219 -0
- package/src/filters/BlendImage.ts +230 -0
- package/src/filters/Blur.ts +181 -0
- package/src/filters/Boilerplate.ts +94 -0
- package/src/filters/Brightness.ts +85 -0
- package/src/filters/Canvas2dFilterBackend.ts +65 -0
- package/src/filters/ColorMatrix.ts +147 -0
- package/src/filters/ColorMatrixFilters.ts +79 -0
- package/src/filters/Composed.ts +78 -0
- package/src/filters/Contrast.ts +84 -0
- package/src/filters/Convolute.ts +186 -0
- package/src/filters/FilterBackend.ts +38 -0
- package/src/filters/GLProbes/GLProbe.ts +7 -0
- package/src/filters/GLProbes/NodeGLProbe.ts +15 -0
- package/src/filters/GLProbes/WebGLProbe.ts +47 -0
- package/src/filters/Gamma.ts +112 -0
- package/src/filters/Grayscale.ts +104 -0
- package/src/filters/HueRotation.ts +64 -0
- package/src/filters/Invert.ts +101 -0
- package/src/filters/Noise.ts +96 -0
- package/src/filters/Pixelate.ts +98 -0
- package/src/filters/RemoveColor.ts +137 -0
- package/src/filters/Resize.ts +540 -0
- package/src/filters/Saturation.ts +89 -0
- package/src/filters/Vibrance.ts +90 -0
- package/src/filters/WebGLFilterBackend.ts +456 -0
- package/src/filters/filters.ts +28 -0
- package/src/filters/index.ts +12 -0
- package/src/filters/shaders/baseFilter.ts +17 -0
- package/src/filters/shaders/blendColor.ts +33 -0
- package/src/filters/shaders/blendImage.ts +32 -0
- package/src/filters/shaders/blur.ts +24 -0
- package/src/filters/shaders/brightness.ts +11 -0
- package/src/filters/shaders/colorMatrix.ts +12 -0
- package/src/filters/shaders/constrast.ts +11 -0
- package/src/filters/shaders/convolute.ts +154 -0
- package/src/filters/shaders/gamma.ts +15 -0
- package/src/filters/shaders/grayscale.ts +36 -0
- package/src/filters/shaders/invert.ts +19 -0
- package/src/filters/shaders/noise.ts +16 -0
- package/src/filters/shaders/pixelate.ts +19 -0
- package/src/filters/shaders/removeColor.ts +13 -0
- package/src/filters/shaders/saturation.ts +15 -0
- package/src/filters/shaders/vibrance.ts +16 -0
- package/src/filters/typedefs.ts +59 -0
- package/src/filters/utils.ts +7 -0
- package/src/gradient/Gradient.ts +409 -0
- package/src/gradient/constants.ts +12 -0
- package/src/gradient/index.ts +2 -0
- package/src/gradient/parser/index.ts +3 -0
- package/src/gradient/parser/misc.ts +13 -0
- package/src/gradient/parser/parseColorStops.ts +56 -0
- package/src/gradient/parser/parseCoords.ts +73 -0
- package/src/gradient/typedefs.ts +104 -0
- package/src/mixins/{eraser_brush.mixin.js → eraser_brush.mixin.ts} +350 -239
- package/src/parkinglot/canvas_animation.mixin.ts +121 -0
- package/src/parkinglot/straighten.ts +58 -0
- package/src/parser/applyViewboxTransform.ts +158 -0
- package/src/parser/attributes.ts +25 -0
- package/src/parser/constants.ts +116 -0
- package/src/parser/doesSomeParentMatch.ts +18 -0
- package/src/parser/elementById.ts +21 -0
- package/src/parser/elementMatchesRule.ts +16 -0
- package/src/parser/elements_parser.ts +158 -0
- package/src/parser/getCSSRules.ts +61 -0
- package/src/parser/getGlobalStylesForElement.ts +19 -0
- package/src/parser/getGradientDefs.ts +31 -0
- package/src/parser/getMultipleNodes.ts +15 -0
- package/src/parser/getSvgRegex.ts +3 -0
- package/src/parser/hasAncestorWithNodeName.ts +14 -0
- package/src/parser/index.ts +8 -0
- package/src/parser/loadSVGFromString.ts +29 -0
- package/src/parser/loadSVGFromURL.ts +47 -0
- package/src/parser/normalizeAttr.ts +10 -0
- package/src/parser/normalizeValue.ts +64 -0
- package/src/parser/parseAttributes.ts +90 -0
- package/src/parser/parseFontDeclaration.ts +44 -0
- package/src/parser/parsePointsAttribute.ts +34 -0
- package/src/parser/parseSVGDocument.ts +118 -0
- package/src/parser/parseStyleAttribute.ts +27 -0
- package/src/parser/parseStyleObject.ts +15 -0
- package/src/parser/parseStyleString.ts +16 -0
- package/src/parser/parseTransformAttribute.ts +94 -0
- package/src/parser/parseUseDirectives.ts +78 -0
- package/src/parser/percent.ts +27 -0
- package/src/parser/recursivelyParseGradientsXlink.ts +42 -0
- package/src/parser/selectorMatches.ts +25 -0
- package/src/parser/setStrokeFillOpacity.ts +40 -0
- package/src/parser/typedefs.ts +13 -0
- package/src/shapes/ActiveSelection.ts +192 -0
- package/src/shapes/Circle.ts +236 -0
- package/src/shapes/Ellipse.ts +177 -0
- package/src/shapes/Group.ts +1103 -0
- package/src/shapes/IText/DraggableTextDelegate.ts +385 -0
- package/src/shapes/IText/IText.ts +696 -0
- package/src/shapes/IText/ITextBehavior.ts +1073 -0
- package/src/shapes/IText/ITextClickBehavior.ts +292 -0
- package/src/shapes/IText/ITextKeyBehavior.ts +675 -0
- package/src/shapes/IText/constants.ts +53 -0
- package/src/shapes/Image.ts +848 -0
- package/src/shapes/Line.ts +285 -0
- package/src/shapes/Object/AnimatableObject.ts +103 -0
- package/src/shapes/Object/FabricObject.ts +29 -0
- package/src/shapes/Object/FabricObjectSVGExportMixin.ts +278 -0
- package/src/shapes/Object/InteractiveObject.ts +669 -0
- package/src/shapes/Object/Object.ts +1589 -0
- package/src/shapes/Object/ObjectGeometry.ts +814 -0
- package/src/shapes/Object/ObjectOrigin.ts +277 -0
- package/src/shapes/Object/StackedObject.ts +206 -0
- package/src/shapes/Object/defaultValues.ts +110 -0
- package/src/shapes/Object/types/BaseProps.ts +96 -0
- package/src/shapes/Object/types/BorderProps.ts +40 -0
- package/src/shapes/Object/types/ControlProps.ts +69 -0
- package/src/shapes/Object/types/FabricObjectProps.ts +111 -0
- package/src/shapes/Object/types/FillStrokeProps.ts +90 -0
- package/src/shapes/Object/types/LockInteractionProps.ts +57 -0
- package/src/shapes/Object/types/ObjectProps.ts +49 -0
- package/src/shapes/Object/types/SerializedObjectProps.ts +73 -0
- package/src/shapes/Object/types/index.ts +8 -0
- package/src/shapes/Path.ts +434 -0
- package/src/shapes/Polygon.ts +22 -0
- package/src/shapes/Polyline.ts +364 -0
- package/src/shapes/Rect.ts +230 -0
- package/src/shapes/Text/StyledText.ts +323 -0
- package/src/shapes/Text/Text.ts +1891 -0
- package/src/shapes/Text/TextSVGExportMixin.ts +289 -0
- package/src/shapes/Text/constants.ts +111 -0
- package/src/shapes/Textbox.ts +526 -0
- package/src/shapes/Triangle.ts +62 -0
- package/src/typedefs.ts +121 -0
- package/src/util/animation/AnimationBase.ts +166 -0
- package/src/util/animation/AnimationFrameProvider.ts +9 -0
- package/src/util/animation/AnimationRegistry.ts +58 -0
- package/src/util/animation/ArrayAnimation.ts +27 -0
- package/src/util/animation/ColorAnimation.ts +74 -0
- package/src/util/animation/ValueAnimation.ts +29 -0
- package/src/util/animation/animate.ts +74 -0
- package/src/util/animation/easing.ts +327 -0
- package/src/util/animation/index.ts +2 -0
- package/src/util/animation/types.ts +136 -0
- package/src/util/applyMixins.ts +22 -0
- package/src/util/dom_event.ts +28 -0
- package/src/util/dom_misc.ts +44 -0
- package/src/util/dom_request.ts +64 -0
- package/src/util/dom_style.ts +20 -0
- package/src/util/index.ts +106 -0
- package/src/util/internals/cleanupSvgAttribute.test.ts +16 -0
- package/src/util/internals/cleanupSvgAttribute.ts +8 -0
- package/src/util/internals/cloneDeep.test.ts +16 -0
- package/src/util/internals/cloneDeep.ts +2 -0
- package/src/util/internals/getRandomInt.test.ts +33 -0
- package/src/util/internals/getRandomInt.ts +8 -0
- package/src/util/internals/ifNaN.ts +9 -0
- package/src/util/internals/index.ts +3 -0
- package/src/util/internals/removeFromArray.ts +14 -0
- package/src/util/internals/uid.ts +3 -0
- package/src/util/lang_string.ts +79 -0
- package/src/util/misc/boundingBoxFromPoints.ts +38 -0
- package/src/util/misc/capValue.ts +2 -0
- package/src/util/misc/cos.ts +24 -0
- package/src/util/misc/dom.ts +55 -0
- package/src/util/misc/findScaleTo.ts +29 -0
- package/src/util/misc/groupSVGElements.ts +15 -0
- package/src/util/misc/isTransparent.ts +28 -0
- package/src/util/misc/matrix.ts +313 -0
- package/src/util/misc/mergeClipPaths.ts +40 -0
- package/src/util/misc/objectEnlive.ts +174 -0
- package/src/util/misc/objectTransforms.ts +130 -0
- package/src/util/misc/pick.ts +29 -0
- package/src/util/misc/planeChange.ts +127 -0
- package/src/util/misc/projectStroke/StrokeLineCapProjections.ts +113 -0
- package/src/util/misc/projectStroke/StrokeLineJoinProjections.ts +227 -0
- package/src/util/misc/projectStroke/StrokeProjectionsBase.ts +76 -0
- package/src/util/misc/projectStroke/index.ts +55 -0
- package/src/util/misc/projectStroke/types.ts +24 -0
- package/src/util/misc/radiansDegreesConversion.ts +18 -0
- package/src/util/misc/resolveOrigin.ts +22 -0
- package/src/util/misc/rotatePoint.ts +15 -0
- package/src/util/misc/sin.ts +26 -0
- package/src/util/misc/svgParsing.ts +171 -0
- package/src/util/misc/textStyles.ts +132 -0
- package/src/util/misc/toFixed.ts +8 -0
- package/src/util/misc/vectors.ts +83 -0
- package/src/util/path/index.ts +1039 -0
- package/src/util/path/regex.ts +39 -0
- package/src/util/path/typechecks.ts +145 -0
- package/src/util/path/typedefs.ts +305 -0
- package/src/util/transform_matrix_removal.ts +61 -0
- package/src/util/typeAssertions.ts +78 -0
- package/tsconfig.json +106 -0
- package/HEADER.js +0 -203
- package/build.js +0 -287
- package/dist/fabric.js +0 -31187
- package/dist/fabric.min.js +0 -1
- package/old-travis-reference.yml +0 -97
- package/src/brushes/circle_brush.class.js +0 -144
- package/src/brushes/pattern_brush.class.js +0 -61
- package/src/brushes/pencil_brush.class.js +0 -310
- package/src/brushes/spray_brush.class.js +0 -219
- package/src/canvas.class.js +0 -1312
- package/src/color.class.js +0 -636
- package/src/control.class.js +0 -339
- package/src/controls.actions.js +0 -740
- package/src/controls.render.js +0 -99
- package/src/elements_parser.js +0 -152
- package/src/filters/2d_backend.class.js +0 -65
- package/src/filters/blendcolor_filter.class.js +0 -251
- package/src/filters/blendimage_filter.class.js +0 -247
- package/src/filters/blur_filter.class.js +0 -217
- package/src/filters/brightness_filter.class.js +0 -113
- package/src/filters/colormatrix_filter.class.js +0 -159
- package/src/filters/composed_filter.class.js +0 -72
- package/src/filters/contrast_filter.class.js +0 -113
- package/src/filters/convolute_filter.class.js +0 -352
- package/src/filters/filter_boilerplate.js +0 -111
- package/src/filters/filter_generator.js +0 -85
- package/src/filters/gamma_filter.class.js +0 -136
- package/src/filters/grayscale_filter.class.js +0 -154
- package/src/filters/hue_rotation.class.js +0 -107
- package/src/filters/invert_filter.class.js +0 -111
- package/src/filters/noise_filter.class.js +0 -134
- package/src/filters/pixelate_filter.class.js +0 -137
- package/src/filters/removecolor_filter.class.js +0 -173
- package/src/filters/resize_filter.class.js +0 -490
- package/src/filters/saturate_filter.class.js +0 -119
- package/src/filters/vibrance_filter.class.js +0 -122
- package/src/filters/webgl_backend.class.js +0 -396
- package/src/globalFabric.js +0 -4
- package/src/gradient.class.js +0 -490
- package/src/intersection.class.js +0 -172
- package/src/log.js +0 -11
- package/src/mixins/animation.mixin.js +0 -231
- package/src/mixins/canvas_dataurl_exporter.mixin.js +0 -97
- package/src/mixins/canvas_events.mixin.js +0 -974
- package/src/mixins/canvas_gestures.mixin.js +0 -149
- package/src/mixins/canvas_grouping.mixin.js +0 -177
- package/src/mixins/canvas_serialization.mixin.js +0 -228
- package/src/mixins/collection.mixin.js +0 -170
- package/src/mixins/default_controls.js +0 -114
- package/src/mixins/itext.svg_export.js +0 -241
- package/src/mixins/itext_behavior.mixin.js +0 -940
- package/src/mixins/itext_click_behavior.mixin.js +0 -278
- package/src/mixins/itext_key_behavior.mixin.js +0 -694
- package/src/mixins/object.svg_export.js +0 -258
- package/src/mixins/object_geometry.mixin.js +0 -683
- package/src/mixins/object_interactivity.mixin.js +0 -314
- package/src/mixins/object_origin.mixin.js +0 -255
- package/src/mixins/object_stacking.mixin.js +0 -80
- package/src/mixins/object_straightening.mixin.js +0 -80
- package/src/mixins/observable.mixin.js +0 -141
- package/src/mixins/shared_methods.mixin.js +0 -94
- package/src/mixins/stateful.mixin.js +0 -107
- package/src/mixins/text_style.mixin.js +0 -324
- package/src/parser.js +0 -1090
- package/src/pattern.class.js +0 -189
- package/src/point.class.js +0 -337
- package/src/shadow.class.js +0 -195
- package/src/shapes/active_selection.class.js +0 -155
- package/src/shapes/circle.class.js +0 -210
- package/src/shapes/ellipse.class.js +0 -181
- package/src/shapes/group.class.js +0 -593
- package/src/shapes/image.class.js +0 -764
- package/src/shapes/itext.class.js +0 -526
- package/src/shapes/line.class.js +0 -324
- package/src/shapes/object.class.js +0 -2008
- package/src/shapes/path.class.js +0 -384
- package/src/shapes/polygon.class.js +0 -81
- package/src/shapes/polyline.class.js +0 -268
- package/src/shapes/rect.class.js +0 -187
- package/src/shapes/text.class.js +0 -1696
- package/src/shapes/textbox.class.js +0 -461
- package/src/shapes/triangle.class.js +0 -93
- package/src/static_canvas.class.js +0 -1881
- package/src/util/anim_ease.js +0 -398
- package/src/util/animate.js +0 -254
- package/src/util/animate_color.js +0 -74
- package/src/util/dom_event.js +0 -50
- package/src/util/dom_misc.js +0 -300
- package/src/util/dom_request.js +0 -54
- package/src/util/dom_style.js +0 -70
- package/src/util/lang_array.js +0 -94
- package/src/util/lang_class.js +0 -115
- package/src/util/lang_object.js +0 -75
- package/src/util/lang_string.js +0 -110
- package/src/util/misc.js +0 -1330
- package/src/util/named_accessors.mixin.js +0 -428
- package/src/util/path.js +0 -829
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns CSS rules for a given SVG document
|
|
3
|
+
* @param {SVGDocument} doc SVG document to parse
|
|
4
|
+
* @return {Object} CSS rules of this document
|
|
5
|
+
*/
|
|
6
|
+
export function getCSSRules(doc: Document) {
|
|
7
|
+
const styles = doc.getElementsByTagName('style');
|
|
8
|
+
let i;
|
|
9
|
+
let len;
|
|
10
|
+
const allRules: Record<string, Record<string, string>> = {};
|
|
11
|
+
let rules;
|
|
12
|
+
|
|
13
|
+
// very crude parsing of style contents
|
|
14
|
+
for (i = 0, len = styles.length; i < len; i++) {
|
|
15
|
+
const styleContents = (styles[i].textContent || '').replace(
|
|
16
|
+
// remove comments
|
|
17
|
+
/\/\*[\s\S]*?\*\//g,
|
|
18
|
+
''
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
if (styleContents.trim() === '') {
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
// recovers all the rule in this form `body { style code... }`
|
|
25
|
+
// rules = styleContents.match(/[^{]*\{[\s\S]*?\}/g);
|
|
26
|
+
rules = styleContents.split('}');
|
|
27
|
+
// remove empty rules.
|
|
28
|
+
rules = rules.filter(function (rule) {
|
|
29
|
+
return rule.trim();
|
|
30
|
+
});
|
|
31
|
+
// at this point we have hopefully an array of rules `body { style code... `
|
|
32
|
+
// eslint-disable-next-line no-loop-func
|
|
33
|
+
rules.forEach(function (rule) {
|
|
34
|
+
const match = rule.split('{'),
|
|
35
|
+
ruleObj: Record<string, string> = {},
|
|
36
|
+
declaration = match[1].trim(),
|
|
37
|
+
propertyValuePairs = declaration.split(';').filter(function (pair) {
|
|
38
|
+
return pair.trim();
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
for (i = 0, len = propertyValuePairs.length; i < len; i++) {
|
|
42
|
+
const pair = propertyValuePairs[i].split(':'),
|
|
43
|
+
property = pair[0].trim(),
|
|
44
|
+
value = pair[1].trim();
|
|
45
|
+
ruleObj[property] = value;
|
|
46
|
+
}
|
|
47
|
+
rule = match[0].trim();
|
|
48
|
+
rule.split(',').forEach((_rule) => {
|
|
49
|
+
_rule = _rule.replace(/^svg/i, '').trim();
|
|
50
|
+
if (_rule === '') {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
allRules[_rule] = {
|
|
54
|
+
...(allRules[_rule] || {}),
|
|
55
|
+
...ruleObj,
|
|
56
|
+
};
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
return allRules;
|
|
61
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
//@ts-nocheck
|
|
2
|
+
import { cssRules } from './constants';
|
|
3
|
+
import { elementMatchesRule } from './elementMatchesRule';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @private
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export function getGlobalStylesForElement(element, svgUid) {
|
|
10
|
+
const styles = {};
|
|
11
|
+
for (const rule in cssRules[svgUid]) {
|
|
12
|
+
if (elementMatchesRule(element, rule.split(' '))) {
|
|
13
|
+
for (const property in cssRules[svgUid][rule]) {
|
|
14
|
+
styles[property] = cssRules[svgUid][rule][property];
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return styles;
|
|
19
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
//@ts-nocheck
|
|
2
|
+
|
|
3
|
+
import { getMultipleNodes } from './getMultipleNodes';
|
|
4
|
+
import { recursivelyParseGradientsXlink } from './recursivelyParseGradientsXlink';
|
|
5
|
+
|
|
6
|
+
const tagArray = [
|
|
7
|
+
'linearGradient',
|
|
8
|
+
'radialGradient',
|
|
9
|
+
'svg:linearGradient',
|
|
10
|
+
'svg:radialGradient',
|
|
11
|
+
];
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Parses an SVG document, returning all of the gradient declarations found in it
|
|
15
|
+
* @param {SVGDocument} doc SVG document to parse
|
|
16
|
+
* @return {Object} Gradient definitions; key corresponds to element id, value -- to gradient definition element
|
|
17
|
+
*/
|
|
18
|
+
export function getGradientDefs(doc) {
|
|
19
|
+
const elList = getMultipleNodes(doc, tagArray);
|
|
20
|
+
let el;
|
|
21
|
+
const gradientDefs = {};
|
|
22
|
+
let j = elList.length;
|
|
23
|
+
while (j--) {
|
|
24
|
+
el = elList[j];
|
|
25
|
+
if (el.getAttribute('xlink:href')) {
|
|
26
|
+
recursivelyParseGradientsXlink(doc, el);
|
|
27
|
+
}
|
|
28
|
+
gradientDefs[el.getAttribute('id')] = el;
|
|
29
|
+
}
|
|
30
|
+
return gradientDefs;
|
|
31
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
//@ts-nocheck
|
|
2
|
+
|
|
3
|
+
export function getMultipleNodes(doc, nodeNames) {
|
|
4
|
+
let nodeName,
|
|
5
|
+
nodeArray = [],
|
|
6
|
+
nodeList,
|
|
7
|
+
i,
|
|
8
|
+
len;
|
|
9
|
+
for (i = 0, len = nodeNames.length; i < len; i++) {
|
|
10
|
+
nodeName = nodeNames[i];
|
|
11
|
+
nodeList = doc.getElementsByTagName(nodeName);
|
|
12
|
+
nodeArray = nodeArray.concat(Array.prototype.slice.call(nodeList));
|
|
13
|
+
}
|
|
14
|
+
return nodeArray;
|
|
15
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
//@ts-nocheck
|
|
2
|
+
|
|
3
|
+
export function hasAncestorWithNodeName(element, nodeName) {
|
|
4
|
+
while (element && (element = element.parentNode)) {
|
|
5
|
+
if (
|
|
6
|
+
element.nodeName &&
|
|
7
|
+
nodeName.test(element.nodeName.replace('svg:', '')) &&
|
|
8
|
+
!element.getAttribute('instantiated_by_use')
|
|
9
|
+
) {
|
|
10
|
+
return true;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { loadSVGFromURL } from './loadSVGFromURL';
|
|
2
|
+
export { loadSVGFromString } from './loadSVGFromString';
|
|
3
|
+
export { parseAttributes } from './parseAttributes';
|
|
4
|
+
export { parseStyleAttribute } from './parseStyleAttribute';
|
|
5
|
+
export { parsePointsAttribute } from './parsePointsAttribute';
|
|
6
|
+
export { parseTransformAttribute } from './parseTransformAttribute';
|
|
7
|
+
export { getCSSRules } from './getCSSRules';
|
|
8
|
+
export { parseFontDeclaration } from './parseFontDeclaration';
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { getFabricWindow } from '../env';
|
|
2
|
+
import type { LoadImageOptions } from '../util/misc/objectEnlive';
|
|
3
|
+
import { parseSVGDocument } from './parseSVGDocument';
|
|
4
|
+
import type { SVGParsingOutput, TSvgReviverCallback } from './typedefs';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Takes string corresponding to an SVG document, and parses it into a set of fabric objects
|
|
8
|
+
* @memberOf fabric
|
|
9
|
+
* @param {String} string representing the svg
|
|
10
|
+
* @param {TSvgParsedCallback} callback Invoked when the parsing is done, with null if parsing wasn't possible with the list of svg nodes.
|
|
11
|
+
* {@link TSvgParsedCallback} also receives `allElements` array as the last argument. This is the full list of svg nodes available in the document.
|
|
12
|
+
* You may want to use it if you are trying to regroup the objects as they were originally grouped in the SVG. ( This was the reason why it was added )
|
|
13
|
+
* @param {TSvgReviverCallback} [reviver] Extra callback for further parsing of SVG elements, called after each fabric object has been created.
|
|
14
|
+
* Takes as input the original svg element and the generated `FabricObject` as arguments. Used to inspect extra properties not parsed by fabric,
|
|
15
|
+
* or extra custom manipulation
|
|
16
|
+
* @param {Object} [options] Object containing options for parsing
|
|
17
|
+
* @param {String} [options.crossOrigin] crossOrigin setting to use for external resources
|
|
18
|
+
* @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal
|
|
19
|
+
*/
|
|
20
|
+
export function loadSVGFromString(
|
|
21
|
+
string: string,
|
|
22
|
+
reviver?: TSvgReviverCallback,
|
|
23
|
+
options?: LoadImageOptions
|
|
24
|
+
): Promise<SVGParsingOutput> {
|
|
25
|
+
const parser = new (getFabricWindow().DOMParser)(),
|
|
26
|
+
// should we use `image/svg+xml` here?
|
|
27
|
+
doc = parser.parseFromString(string.trim(), 'text/xml');
|
|
28
|
+
return parseSVGDocument(doc.documentElement, reviver, options);
|
|
29
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { request } from '../util/dom_request';
|
|
2
|
+
import { parseSVGDocument, createEmptyResponse } from './parseSVGDocument';
|
|
3
|
+
import type { SVGParsingOutput, TSvgReviverCallback } from './typedefs';
|
|
4
|
+
import type { LoadImageOptions } from '../util/misc/objectEnlive';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Takes url corresponding to an SVG document, and parses it into a set of fabric objects.
|
|
8
|
+
* Note that SVG is fetched via XMLHttpRequest, so it needs to conform to SOP (Same Origin Policy)
|
|
9
|
+
* @memberOf fabric
|
|
10
|
+
* @param {string} url where the SVG is
|
|
11
|
+
* @param {TSvgParsedCallback} callback Invoked when the parsing is done, with null if parsing wasn't possible with the list of svg nodes.
|
|
12
|
+
* {@link TSvgParsedCallback} also receives `allElements` array as the last argument. This is the full list of svg nodes available in the document.
|
|
13
|
+
* You may want to use it if you are trying to regroup the objects as they were originally grouped in the SVG. ( This was the reason why it was added )
|
|
14
|
+
* @param {TSvgReviverCallback} [reviver] Extra callback for further parsing of SVG elements, called after each fabric object has been created.
|
|
15
|
+
* Takes as input the original svg element and the generated `FabricObject` as arguments. Used to inspect extra properties not parsed by fabric,
|
|
16
|
+
* or extra custom manipulation
|
|
17
|
+
* @param {Object} [options] Object containing options for parsing
|
|
18
|
+
* @param {String} [options.crossOrigin] crossOrigin setting to use for external resources
|
|
19
|
+
* @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal
|
|
20
|
+
*/
|
|
21
|
+
export function loadSVGFromURL(
|
|
22
|
+
url: string,
|
|
23
|
+
reviver?: TSvgReviverCallback,
|
|
24
|
+
options: LoadImageOptions = {}
|
|
25
|
+
): Promise<SVGParsingOutput> {
|
|
26
|
+
// need to handle error properly
|
|
27
|
+
return new Promise<HTMLElement>((resolve, reject) => {
|
|
28
|
+
const onComplete = (r: XMLHttpRequest) => {
|
|
29
|
+
const xml = r.responseXML;
|
|
30
|
+
if (xml && xml.documentElement) {
|
|
31
|
+
resolve(xml.documentElement);
|
|
32
|
+
}
|
|
33
|
+
reject();
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
request(url.replace(/^\n\s*/, '').trim(), {
|
|
37
|
+
method: 'get',
|
|
38
|
+
onComplete,
|
|
39
|
+
signal: options.signal,
|
|
40
|
+
});
|
|
41
|
+
})
|
|
42
|
+
.then((parsedDoc) => parseSVGDocument(parsedDoc, reviver, options))
|
|
43
|
+
.catch(() => {
|
|
44
|
+
// this is an unhappy path, we dont care about speed
|
|
45
|
+
return createEmptyResponse();
|
|
46
|
+
});
|
|
47
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
//@ts-nocheck
|
|
2
|
+
import { multiplyTransformMatrices } from '../util/misc/matrix';
|
|
3
|
+
import { parseUnit } from '../util/misc/svgParsing';
|
|
4
|
+
import { parseTransformAttribute } from './parseTransformAttribute';
|
|
5
|
+
import { CENTER, LEFT, RIGHT, NONE } from '../constants';
|
|
6
|
+
|
|
7
|
+
export function normalizeValue(attr, value, parentAttributes, fontSize) {
|
|
8
|
+
const isArray = Array.isArray(value);
|
|
9
|
+
let parsed;
|
|
10
|
+
|
|
11
|
+
if ((attr === 'fill' || attr === 'stroke') && value === NONE) {
|
|
12
|
+
value = '';
|
|
13
|
+
} else if (attr === 'strokeUniform') {
|
|
14
|
+
return value === 'non-scaling-stroke';
|
|
15
|
+
} else if (attr === 'strokeDashArray') {
|
|
16
|
+
if (value === NONE) {
|
|
17
|
+
value = null;
|
|
18
|
+
} else {
|
|
19
|
+
value = value.replace(/,/g, ' ').split(/\s+/).map(parseFloat);
|
|
20
|
+
}
|
|
21
|
+
} else if (attr === 'transformMatrix') {
|
|
22
|
+
if (parentAttributes && parentAttributes.transformMatrix) {
|
|
23
|
+
value = multiplyTransformMatrices(
|
|
24
|
+
parentAttributes.transformMatrix,
|
|
25
|
+
parseTransformAttribute(value)
|
|
26
|
+
);
|
|
27
|
+
} else {
|
|
28
|
+
value = parseTransformAttribute(value);
|
|
29
|
+
}
|
|
30
|
+
} else if (attr === 'visible') {
|
|
31
|
+
value = value !== NONE && value !== 'hidden';
|
|
32
|
+
// display=none on parent element always takes precedence over child element
|
|
33
|
+
if (parentAttributes && parentAttributes.visible === false) {
|
|
34
|
+
value = false;
|
|
35
|
+
}
|
|
36
|
+
} else if (attr === 'opacity') {
|
|
37
|
+
value = parseFloat(value);
|
|
38
|
+
if (parentAttributes && typeof parentAttributes.opacity !== 'undefined') {
|
|
39
|
+
value *= parentAttributes.opacity;
|
|
40
|
+
}
|
|
41
|
+
} else if (attr === 'textAnchor' /* text-anchor */) {
|
|
42
|
+
value = value === 'start' ? LEFT : value === 'end' ? RIGHT : CENTER;
|
|
43
|
+
} else if (attr === 'charSpacing') {
|
|
44
|
+
// parseUnit returns px and we convert it to em
|
|
45
|
+
parsed = (parseUnit(value, fontSize) / fontSize) * 1000;
|
|
46
|
+
} else if (attr === 'paintFirst') {
|
|
47
|
+
const fillIndex = value.indexOf('fill');
|
|
48
|
+
const strokeIndex = value.indexOf('stroke');
|
|
49
|
+
value = 'fill';
|
|
50
|
+
if (fillIndex > -1 && strokeIndex > -1 && strokeIndex < fillIndex) {
|
|
51
|
+
value = 'stroke';
|
|
52
|
+
} else if (fillIndex === -1 && strokeIndex > -1) {
|
|
53
|
+
value = 'stroke';
|
|
54
|
+
}
|
|
55
|
+
} else if (attr === 'href' || attr === 'xlink:href' || attr === 'font') {
|
|
56
|
+
return value;
|
|
57
|
+
} else if (attr === 'imageSmoothing') {
|
|
58
|
+
return value === 'optimizeQuality';
|
|
59
|
+
} else {
|
|
60
|
+
parsed = isArray ? value.map(parseUnit) : parseUnit(value, fontSize);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return !isArray && isNaN(parsed) ? value : parsed;
|
|
64
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
//@ts-nocheck
|
|
2
|
+
import { DEFAULT_SVG_FONT_SIZE } from '../constants';
|
|
3
|
+
import { parseUnit } from '../util/misc/svgParsing';
|
|
4
|
+
import { cPath, fSize, svgValidParentsRegEx } from './constants';
|
|
5
|
+
import { getGlobalStylesForElement } from './getGlobalStylesForElement';
|
|
6
|
+
import { normalizeAttr } from './normalizeAttr';
|
|
7
|
+
import { normalizeValue } from './normalizeValue';
|
|
8
|
+
import { parseFontDeclaration } from './parseFontDeclaration';
|
|
9
|
+
import { parseStyleAttribute } from './parseStyleAttribute';
|
|
10
|
+
import { setStrokeFillOpacity } from './setStrokeFillOpacity';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Returns an object of attributes' name/value, given element and an array of attribute names;
|
|
14
|
+
* Parses parent "g" nodes recursively upwards.
|
|
15
|
+
* @param {SVGElement | HTMLElement} element Element to parse
|
|
16
|
+
* @param {Array} attributes Array of attributes to parse
|
|
17
|
+
* @return {Object} object containing parsed attributes' names/values
|
|
18
|
+
*/
|
|
19
|
+
export function parseAttributes(
|
|
20
|
+
element: SVGElement | HTMLElement,
|
|
21
|
+
attributes: string[],
|
|
22
|
+
svgUid?: string
|
|
23
|
+
): Record<string, any> {
|
|
24
|
+
if (!element) {
|
|
25
|
+
return {};
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
let value,
|
|
29
|
+
parentAttributes = {},
|
|
30
|
+
fontSize,
|
|
31
|
+
parentFontSize;
|
|
32
|
+
|
|
33
|
+
if (typeof svgUid === 'undefined') {
|
|
34
|
+
svgUid = element.getAttribute('svgUid');
|
|
35
|
+
}
|
|
36
|
+
// if there's a parent container (`g` or `a` or `symbol` node), parse its attributes recursively upwards
|
|
37
|
+
if (
|
|
38
|
+
element.parentNode &&
|
|
39
|
+
svgValidParentsRegEx.test(element.parentNode.nodeName)
|
|
40
|
+
) {
|
|
41
|
+
parentAttributes = parseAttributes(element.parentNode, attributes, svgUid);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
let ownAttributes = attributes.reduce(function (memo, attr) {
|
|
45
|
+
value = element.getAttribute(attr);
|
|
46
|
+
if (value) {
|
|
47
|
+
// eslint-disable-line
|
|
48
|
+
memo[attr] = value;
|
|
49
|
+
}
|
|
50
|
+
return memo;
|
|
51
|
+
}, {});
|
|
52
|
+
// add values parsed from style, which take precedence over attributes
|
|
53
|
+
// (see: http://www.w3.org/TR/SVG/styling.html#UsingPresentationAttributes)
|
|
54
|
+
const cssAttrs = Object.assign(
|
|
55
|
+
getGlobalStylesForElement(element, svgUid),
|
|
56
|
+
parseStyleAttribute(element)
|
|
57
|
+
);
|
|
58
|
+
ownAttributes = Object.assign(ownAttributes, cssAttrs);
|
|
59
|
+
if (cssAttrs[cPath]) {
|
|
60
|
+
element.setAttribute(cPath, cssAttrs[cPath]);
|
|
61
|
+
}
|
|
62
|
+
fontSize = parentFontSize =
|
|
63
|
+
parentAttributes.fontSize || DEFAULT_SVG_FONT_SIZE;
|
|
64
|
+
if (ownAttributes[fSize]) {
|
|
65
|
+
// looks like the minimum should be 9px when dealing with ems. this is what looks like in browsers.
|
|
66
|
+
ownAttributes[fSize] = fontSize = parseUnit(
|
|
67
|
+
ownAttributes[fSize],
|
|
68
|
+
parentFontSize
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const normalizedStyle = {};
|
|
73
|
+
for (const attr in ownAttributes) {
|
|
74
|
+
const normalizedAttr = normalizeAttr(attr);
|
|
75
|
+
const normalizedValue = normalizeValue(
|
|
76
|
+
normalizedAttr,
|
|
77
|
+
ownAttributes[attr],
|
|
78
|
+
parentAttributes,
|
|
79
|
+
fontSize
|
|
80
|
+
);
|
|
81
|
+
normalizedStyle[normalizedAttr] = normalizedValue;
|
|
82
|
+
}
|
|
83
|
+
if (normalizedStyle && normalizedStyle.font) {
|
|
84
|
+
parseFontDeclaration(normalizedStyle.font, normalizedStyle);
|
|
85
|
+
}
|
|
86
|
+
const mergedAttrs = { ...parentAttributes, ...normalizedStyle };
|
|
87
|
+
return svgValidParentsRegEx.test(element.nodeName)
|
|
88
|
+
? mergedAttrs
|
|
89
|
+
: setStrokeFillOpacity(mergedAttrs);
|
|
90
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
//@ts-nocheck
|
|
2
|
+
import { parseUnit } from '../util/misc/svgParsing';
|
|
3
|
+
import { reFontDeclaration } from './constants';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Parses a short font declaration, building adding its properties to a style object
|
|
7
|
+
* @static
|
|
8
|
+
* @function
|
|
9
|
+
* @memberOf fabric
|
|
10
|
+
* @param {String} value font declaration
|
|
11
|
+
* @param {Object} oStyle definition
|
|
12
|
+
*/
|
|
13
|
+
export function parseFontDeclaration(value, oStyle) {
|
|
14
|
+
const match = value.match(reFontDeclaration);
|
|
15
|
+
|
|
16
|
+
if (!match) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
const fontStyle = match[1],
|
|
20
|
+
// font variant is not used
|
|
21
|
+
// fontVariant = match[2],
|
|
22
|
+
fontWeight = match[3],
|
|
23
|
+
fontSize = match[4],
|
|
24
|
+
lineHeight = match[5],
|
|
25
|
+
fontFamily = match[6];
|
|
26
|
+
|
|
27
|
+
if (fontStyle) {
|
|
28
|
+
oStyle.fontStyle = fontStyle;
|
|
29
|
+
}
|
|
30
|
+
if (fontWeight) {
|
|
31
|
+
oStyle.fontWeight = isNaN(parseFloat(fontWeight))
|
|
32
|
+
? fontWeight
|
|
33
|
+
: parseFloat(fontWeight);
|
|
34
|
+
}
|
|
35
|
+
if (fontSize) {
|
|
36
|
+
oStyle.fontSize = parseUnit(fontSize);
|
|
37
|
+
}
|
|
38
|
+
if (fontFamily) {
|
|
39
|
+
oStyle.fontFamily = fontFamily;
|
|
40
|
+
}
|
|
41
|
+
if (lineHeight) {
|
|
42
|
+
oStyle.lineHeight = lineHeight === 'normal' ? 1 : lineHeight;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
//@ts-nocheck
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Parses "points" attribute, returning an array of values
|
|
5
|
+
* @static
|
|
6
|
+
* @memberOf fabric
|
|
7
|
+
* @param {String} points points attribute string
|
|
8
|
+
* @return {Array} array of points
|
|
9
|
+
*/
|
|
10
|
+
export function parsePointsAttribute(points) {
|
|
11
|
+
// points attribute is required and must not be empty
|
|
12
|
+
if (!points) {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// replace commas with whitespace and remove bookending whitespace
|
|
17
|
+
points = points.replace(/,/g, ' ').trim();
|
|
18
|
+
|
|
19
|
+
points = points.split(/\s+/);
|
|
20
|
+
const parsedPoints = [];
|
|
21
|
+
|
|
22
|
+
for (let i = 0; i < points.length; i += 2) {
|
|
23
|
+
parsedPoints.push({
|
|
24
|
+
x: parseFloat(points[i]),
|
|
25
|
+
y: parseFloat(points[i + 1]),
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// odd number of points is an error
|
|
30
|
+
// if (parsedPoints.length % 2 !== 0) {
|
|
31
|
+
// return null;
|
|
32
|
+
// }
|
|
33
|
+
return parsedPoints;
|
|
34
|
+
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
import { uid } from '../util/internals/uid';
|
|
3
|
+
import { applyViewboxTransform } from './applyViewboxTransform';
|
|
4
|
+
import {
|
|
5
|
+
clipPaths,
|
|
6
|
+
cssRules,
|
|
7
|
+
gradientDefs,
|
|
8
|
+
svgInvalidAncestorsRegEx,
|
|
9
|
+
svgValidTagNamesRegEx,
|
|
10
|
+
} from './constants';
|
|
11
|
+
import { getCSSRules } from './getCSSRules';
|
|
12
|
+
import { getGradientDefs } from './getGradientDefs';
|
|
13
|
+
import { hasAncestorWithNodeName } from './hasAncestorWithNodeName';
|
|
14
|
+
import { parseUseDirectives } from './parseUseDirectives';
|
|
15
|
+
import type { SVGParsingOutput, TSvgReviverCallback } from './typedefs';
|
|
16
|
+
import type { LoadImageOptions } from '../util/misc/objectEnlive';
|
|
17
|
+
import { ElementsParser } from './elements_parser';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Parses an SVG document, converts it to an array of corresponding fabric.* instances and passes them to a callback
|
|
21
|
+
* @static
|
|
22
|
+
* @function
|
|
23
|
+
* @memberOf fabric
|
|
24
|
+
* @param {HTMLElement} doc SVG document to parse
|
|
25
|
+
* @param {TSvgParsedCallback} callback Invoked when the parsing is done, with null if parsing wasn't possible with the list of svg nodes.
|
|
26
|
+
* @param {TSvgReviverCallback} [reviver] Extra callback for further parsing of SVG elements, called after each fabric object has been created.
|
|
27
|
+
* Takes as input the original svg element and the generated `FabricObject` as arguments. Used to inspect extra properties not parsed by fabric,
|
|
28
|
+
* or extra custom manipulation
|
|
29
|
+
* @param {Object} [options] Object containing options for parsing
|
|
30
|
+
* @param {String} [options.crossOrigin] crossOrigin setting to use for external resources
|
|
31
|
+
* @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal
|
|
32
|
+
* @return {SVGParsingOutput}
|
|
33
|
+
* {@link SVGParsingOutput} also receives `allElements` array as the last argument. This is the full list of svg nodes available in the document.
|
|
34
|
+
* You may want to use it if you are trying to regroup the objects as they were originally grouped in the SVG. ( This was the reason why it was added )
|
|
35
|
+
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
export const createEmptyResponse = (): SVGParsingOutput => ({
|
|
39
|
+
objects: [],
|
|
40
|
+
elements: [],
|
|
41
|
+
options: {},
|
|
42
|
+
allElements: [],
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
export async function parseSVGDocument(
|
|
46
|
+
doc: HTMLElement,
|
|
47
|
+
reviver?: TSvgReviverCallback,
|
|
48
|
+
{ crossOrigin, signal }: LoadImageOptions = {}
|
|
49
|
+
): Promise<SVGParsingOutput> {
|
|
50
|
+
if (signal && signal.aborted) {
|
|
51
|
+
console.log('`options.signal` is in `aborted` state');
|
|
52
|
+
// this is an unhappy path, we dont care about speed
|
|
53
|
+
return createEmptyResponse();
|
|
54
|
+
}
|
|
55
|
+
parseUseDirectives(doc);
|
|
56
|
+
|
|
57
|
+
const svgUid = uid(),
|
|
58
|
+
descendants = Array.from(doc.getElementsByTagName('*')),
|
|
59
|
+
options = {
|
|
60
|
+
...applyViewboxTransform(doc),
|
|
61
|
+
crossOrigin,
|
|
62
|
+
svgUid,
|
|
63
|
+
signal,
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
const elements = descendants.filter(function (el) {
|
|
67
|
+
applyViewboxTransform(el);
|
|
68
|
+
return (
|
|
69
|
+
svgValidTagNamesRegEx.test(el.nodeName.replace('svg:', '')) &&
|
|
70
|
+
!hasAncestorWithNodeName(el, svgInvalidAncestorsRegEx)
|
|
71
|
+
); // http://www.w3.org/TR/SVG/struct.html#DefsElement
|
|
72
|
+
});
|
|
73
|
+
if (!elements || (elements && !elements.length)) {
|
|
74
|
+
return {
|
|
75
|
+
...createEmptyResponse(),
|
|
76
|
+
options,
|
|
77
|
+
allElements: descendants,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
const localClipPaths = {};
|
|
81
|
+
descendants
|
|
82
|
+
.filter((el) => el.nodeName.replace('svg:', '') === 'clipPath')
|
|
83
|
+
.forEach((el) => {
|
|
84
|
+
const id = el.getAttribute('id');
|
|
85
|
+
localClipPaths[id] = Array.from(el.getElementsByTagName('*')).filter(
|
|
86
|
+
(el) => svgValidTagNamesRegEx.test(el.nodeName.replace('svg:', ''))
|
|
87
|
+
);
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
// thos are like globals we need to fix
|
|
91
|
+
gradientDefs[svgUid] = getGradientDefs(doc);
|
|
92
|
+
cssRules[svgUid] = getCSSRules(doc);
|
|
93
|
+
clipPaths[svgUid] = localClipPaths;
|
|
94
|
+
|
|
95
|
+
// Precedence of rules: style > class > attribute
|
|
96
|
+
const elementParser = new ElementsParser(
|
|
97
|
+
elements,
|
|
98
|
+
options,
|
|
99
|
+
reviver,
|
|
100
|
+
{
|
|
101
|
+
crossOrigin,
|
|
102
|
+
signal,
|
|
103
|
+
},
|
|
104
|
+
doc
|
|
105
|
+
);
|
|
106
|
+
const instances = await elementParser.parse();
|
|
107
|
+
|
|
108
|
+
delete gradientDefs[svgUid];
|
|
109
|
+
delete cssRules[svgUid];
|
|
110
|
+
delete clipPaths[svgUid];
|
|
111
|
+
|
|
112
|
+
return {
|
|
113
|
+
objects: instances,
|
|
114
|
+
elements,
|
|
115
|
+
options,
|
|
116
|
+
allElements: descendants,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
//@ts-nocheck
|
|
2
|
+
import { parseStyleObject } from './parseStyleObject';
|
|
3
|
+
import { parseStyleString } from './parseStyleString';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Parses "style" attribute, retuning an object with values
|
|
7
|
+
* @static
|
|
8
|
+
* @memberOf fabric
|
|
9
|
+
* @param {SVGElement} element Element to parse
|
|
10
|
+
* @return {Object} Objects with values parsed from style attribute of an element
|
|
11
|
+
*/
|
|
12
|
+
export function parseStyleAttribute(element) {
|
|
13
|
+
const oStyle = {},
|
|
14
|
+
style = element.getAttribute('style');
|
|
15
|
+
|
|
16
|
+
if (!style) {
|
|
17
|
+
return oStyle;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
if (typeof style === 'string') {
|
|
21
|
+
parseStyleString(style, oStyle);
|
|
22
|
+
} else {
|
|
23
|
+
parseStyleObject(style, oStyle);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return oStyle;
|
|
27
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
//@ts-nocheck
|
|
2
|
+
|
|
3
|
+
export function parseStyleObject(style, oStyle) {
|
|
4
|
+
let attr, value;
|
|
5
|
+
for (const prop in style) {
|
|
6
|
+
if (typeof style[prop] === 'undefined') {
|
|
7
|
+
continue;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
attr = prop.toLowerCase();
|
|
11
|
+
value = style[prop];
|
|
12
|
+
|
|
13
|
+
oStyle[attr] = value;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
//@ts-nocheck
|
|
2
|
+
|
|
3
|
+
export function parseStyleString(style, oStyle) {
|
|
4
|
+
let attr, value;
|
|
5
|
+
style
|
|
6
|
+
.replace(/;\s*$/, '')
|
|
7
|
+
.split(';')
|
|
8
|
+
.forEach(function (chunk) {
|
|
9
|
+
const pair = chunk.split(':');
|
|
10
|
+
|
|
11
|
+
attr = pair[0].trim().toLowerCase();
|
|
12
|
+
value = pair[1].trim();
|
|
13
|
+
|
|
14
|
+
oStyle[attr] = value;
|
|
15
|
+
});
|
|
16
|
+
}
|