fabric
Version:
Object model for HTML5 canvas, and SVG-to-canvas parser. Backed by jsdom and node-canvas.
1 lines • 5.92 kB
Source Map (JSON)
{"version":3,"file":"parseAttributes.mjs","sources":["../../../src/parser/parseAttributes.ts"],"sourcesContent":["import { DEFAULT_SVG_FONT_SIZE } from '../constants';\nimport { parseUnit } from '../util/misc/svgParsing';\nimport { cPath, fSize, svgValidParentsRegEx } from './constants';\nimport { getGlobalStylesForElement } from './getGlobalStylesForElement';\nimport { normalizeAttr } from './normalizeAttr';\nimport { normalizeValue } from './normalizeValue';\nimport { parseFontDeclaration } from './parseFontDeclaration';\nimport { parseStyleAttribute } from './parseStyleAttribute';\nimport { setStrokeFillOpacity } from './setStrokeFillOpacity';\nimport type { CSSRules } from './typedefs';\n\n/**\n * Returns an object of attributes' name/value, given element and an array of attribute names;\n * Parses parent \"g\" nodes recursively upwards.\n * @param {SVGElement | HTMLElement} element Element to parse\n * @param {Array} attributes Array of attributes to parse\n * @return {Object} object containing parsed attributes' names/values\n */\nexport function parseAttributes(\n element: HTMLElement | null,\n attributes: string[],\n cssRules?: CSSRules,\n): Record<string, any> {\n if (!element) {\n return {};\n }\n\n let parentAttributes: Record<string, string> = {},\n fontSize: number,\n parentFontSize = DEFAULT_SVG_FONT_SIZE;\n\n // if there's a parent container (`g` or `a` or `symbol` node), parse its attributes recursively upwards\n if (\n element.parentNode &&\n svgValidParentsRegEx.test(element.parentNode.nodeName)\n ) {\n parentAttributes = parseAttributes(\n element.parentElement,\n attributes,\n cssRules,\n );\n if (parentAttributes.fontSize) {\n fontSize = parentFontSize = parseUnit(parentAttributes.fontSize);\n }\n }\n\n const ownAttributes: Record<string, string> = {\n ...attributes.reduce<Record<string, string>>((memo, attr) => {\n const value = element.getAttribute(attr);\n if (value) {\n memo[attr] = value;\n }\n return memo;\n }, {}),\n // add values parsed from style, which take precedence over attributes\n // (see: http://www.w3.org/TR/SVG/styling.html#UsingPresentationAttributes)\n ...getGlobalStylesForElement(element, cssRules),\n ...parseStyleAttribute(element),\n };\n\n if (ownAttributes[cPath]) {\n element.setAttribute(cPath, ownAttributes[cPath]);\n }\n if (ownAttributes[fSize]) {\n // looks like the minimum should be 9px when dealing with ems. this is what looks like in browsers.\n fontSize = parseUnit(ownAttributes[fSize], parentFontSize);\n ownAttributes[fSize] = `${fontSize}`;\n }\n\n // this should have its own complex type\n const normalizedStyle: Record<\n string,\n string | boolean | number | number[] | null\n > = {};\n for (const attr in ownAttributes) {\n const normalizedAttr = normalizeAttr(attr);\n const normalizedValue = normalizeValue(\n normalizedAttr,\n ownAttributes[attr],\n parentAttributes,\n fontSize!,\n );\n normalizedStyle[normalizedAttr] = normalizedValue;\n }\n if (normalizedStyle && normalizedStyle.font) {\n parseFontDeclaration(normalizedStyle.font as string, normalizedStyle);\n }\n const mergedAttrs = { ...parentAttributes, ...normalizedStyle };\n return svgValidParentsRegEx.test(element.nodeName)\n ? mergedAttrs\n : setStrokeFillOpacity(mergedAttrs);\n}\n"],"names":["parseAttributes","element","attributes","cssRules","parentAttributes","fontSize","parentFontSize","DEFAULT_SVG_FONT_SIZE","parentNode","svgValidParentsRegEx","test","nodeName","parentElement","parseUnit","ownAttributes","_objectSpread","reduce","memo","attr","value","getAttribute","getGlobalStylesForElement","parseStyleAttribute","cPath","setAttribute","fSize","concat","normalizedStyle","normalizedAttr","normalizeAttr","normalizedValue","normalizeValue","font","parseFontDeclaration","mergedAttrs","setStrokeFillOpacity"],"mappings":";;;;;;;;;;;AAWA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASA,eAAeA,CAC7BC,OAA2B,EAC3BC,UAAoB,EACpBC,QAAmB,EACE;EACrB,IAAI,CAACF,OAAO,EAAE;AACZ,IAAA,OAAO,EAAE,CAAA;AACX,GAAA;EAEA,IAAIG,gBAAwC,GAAG,EAAE;IAC/CC,QAAgB;AAChBC,IAAAA,cAAc,GAAGC,qBAAqB,CAAA;;AAExC;AACA,EAAA,IACEN,OAAO,CAACO,UAAU,IAClBC,oBAAoB,CAACC,IAAI,CAACT,OAAO,CAACO,UAAU,CAACG,QAAQ,CAAC,EACtD;IACAP,gBAAgB,GAAGJ,eAAe,CAChCC,OAAO,CAACW,aAAa,EACrBV,UAAU,EACVC,QACF,CAAC,CAAA;IACD,IAAIC,gBAAgB,CAACC,QAAQ,EAAE;MAC7BA,QAAQ,GAAGC,cAAc,GAAGO,SAAS,CAACT,gBAAgB,CAACC,QAAQ,CAAC,CAAA;AAClE,KAAA;AACF,GAAA;AAEA,EAAA,MAAMS,aAAqC,GAAAC,cAAA,CAAAA,cAAA,CAAAA,cAAA,CAAA,EAAA,EACtCb,UAAU,CAACc,MAAM,CAAyB,CAACC,IAAI,EAAEC,IAAI,KAAK;AAC3D,IAAA,MAAMC,KAAK,GAAGlB,OAAO,CAACmB,YAAY,CAACF,IAAI,CAAC,CAAA;AACxC,IAAA,IAAIC,KAAK,EAAE;AACTF,MAAAA,IAAI,CAACC,IAAI,CAAC,GAAGC,KAAK,CAAA;AACpB,KAAA;AACA,IAAA,OAAOF,IAAI,CAAA;AACb,GAAC,EAAE,EAAE,CAAC,CAAA,EAGHI,yBAAyB,CAACpB,OAAO,EAAEE,QAAQ,CAAC,CAC5CmB,EAAAA,mBAAmB,CAACrB,OAAO,CAAC,CAChC,CAAA;AAED,EAAA,IAAIa,aAAa,CAACS,KAAK,CAAC,EAAE;IACxBtB,OAAO,CAACuB,YAAY,CAACD,KAAK,EAAET,aAAa,CAACS,KAAK,CAAC,CAAC,CAAA;AACnD,GAAA;AACA,EAAA,IAAIT,aAAa,CAACW,KAAK,CAAC,EAAE;AACxB;IACApB,QAAQ,GAAGQ,SAAS,CAACC,aAAa,CAACW,KAAK,CAAC,EAAEnB,cAAc,CAAC,CAAA;AAC1DQ,IAAAA,aAAa,CAACW,KAAK,CAAC,MAAAC,MAAA,CAAMrB,QAAQ,CAAE,CAAA;AACtC,GAAA;;AAEA;EACA,MAAMsB,eAGL,GAAG,EAAE,CAAA;AACN,EAAA,KAAK,MAAMT,IAAI,IAAIJ,aAAa,EAAE;AAChC,IAAA,MAAMc,cAAc,GAAGC,aAAa,CAACX,IAAI,CAAC,CAAA;AAC1C,IAAA,MAAMY,eAAe,GAAGC,cAAc,CACpCH,cAAc,EACdd,aAAa,CAACI,IAAI,CAAC,EACnBd,gBAAgB,EAChBC,QACF,CAAC,CAAA;AACDsB,IAAAA,eAAe,CAACC,cAAc,CAAC,GAAGE,eAAe,CAAA;AACnD,GAAA;AACA,EAAA,IAAIH,eAAe,IAAIA,eAAe,CAACK,IAAI,EAAE;AAC3CC,IAAAA,oBAAoB,CAACN,eAAe,CAACK,IAAI,EAAYL,eAAe,CAAC,CAAA;AACvE,GAAA;EACA,MAAMO,WAAW,GAAAnB,cAAA,CAAAA,cAAA,CAAQX,EAAAA,EAAAA,gBAAgB,CAAKuB,EAAAA,eAAe,CAAE,CAAA;AAC/D,EAAA,OAAOlB,oBAAoB,CAACC,IAAI,CAACT,OAAO,CAACU,QAAQ,CAAC,GAC9CuB,WAAW,GACXC,oBAAoB,CAACD,WAAW,CAAC,CAAA;AACvC;;;;"}