{"version":3,"file":"applyViewboxTransform.mjs","sources":["../../../src/parser/applyViewboxTransform.ts"],"sourcesContent":["import { svgNS } from './constants';\nimport {\n  parsePreserveAspectRatioAttribute,\n  parseUnit,\n} from '../util/misc/svgParsing';\nimport { svgViewBoxElementsRegEx, reViewBoxAttrValue } from './constants';\nimport { NONE } from '../constants';\n\nexport type ParsedViewboxTransform = Partial<{\n  width: number;\n  height: number;\n  minX: number;\n  minY: number;\n  viewBoxWidth: number;\n  viewBoxHeight: number;\n}>;\n\n/**\n * Add a <g> element that envelop all child elements and makes the viewbox transformMatrix descend on all elements\n */\nexport function applyViewboxTransform(\n  element: Element\n): ParsedViewboxTransform {\n  if (!svgViewBoxElementsRegEx.test(element.nodeName)) {\n    return {};\n  }\n  const viewBoxAttr: string | null = element.getAttribute('viewBox');\n  let scaleX = 1;\n  let scaleY = 1;\n  let minX = 0;\n  let minY = 0;\n  let matrix;\n  let el;\n  const widthAttr = element.getAttribute('width');\n  const heightAttr = element.getAttribute('height');\n  const x = element.getAttribute('x') || 0;\n  const y = element.getAttribute('y') || 0;\n  const goodViewbox = viewBoxAttr && reViewBoxAttrValue.test(viewBoxAttr);\n  const missingViewBox = !goodViewbox;\n  const missingDimAttr =\n    !widthAttr || !heightAttr || widthAttr === '100%' || heightAttr === '100%';\n\n  let translateMatrix = '';\n  let widthDiff = 0;\n  let heightDiff = 0;\n\n  if (missingViewBox) {\n    if (\n      (x || y) &&\n      element.parentNode &&\n      element.parentNode.nodeName !== '#document'\n    ) {\n      translateMatrix =\n        ' translate(' + parseUnit(x || '0') + ' ' + parseUnit(y || '0') + ') ';\n      matrix = (element.getAttribute('transform') || '') + translateMatrix;\n      element.setAttribute('transform', matrix);\n      element.removeAttribute('x');\n      element.removeAttribute('y');\n    }\n  }\n\n  if (missingViewBox && missingDimAttr) {\n    return {\n      width: 0,\n      height: 0,\n    };\n  }\n\n  const parsedDim: ParsedViewboxTransform = {\n    width: 0,\n    height: 0,\n  };\n\n  if (missingViewBox) {\n    parsedDim.width = parseUnit(widthAttr!);\n    parsedDim.height = parseUnit(heightAttr!);\n    // set a transform for elements that have x y and are inner(only) SVGs\n    return parsedDim;\n  }\n\n  const pasedViewBox = viewBoxAttr.match(reViewBoxAttrValue)!;\n  minX = -parseFloat(pasedViewBox[1]);\n  minY = -parseFloat(pasedViewBox[2]);\n  const viewBoxWidth = parseFloat(pasedViewBox[3]);\n  const viewBoxHeight = parseFloat(pasedViewBox[4]);\n  parsedDim.minX = minX;\n  parsedDim.minY = minY;\n  parsedDim.viewBoxWidth = viewBoxWidth;\n  parsedDim.viewBoxHeight = viewBoxHeight;\n  if (!missingDimAttr) {\n    parsedDim.width = parseUnit(widthAttr);\n    parsedDim.height = parseUnit(heightAttr);\n    scaleX = parsedDim.width / viewBoxWidth;\n    scaleY = parsedDim.height / viewBoxHeight;\n  } else {\n    parsedDim.width = viewBoxWidth;\n    parsedDim.height = viewBoxHeight;\n  }\n\n  // default is to preserve aspect ratio\n  const preserveAspectRatio = parsePreserveAspectRatioAttribute(\n    element.getAttribute('preserveAspectRatio') || ''\n  );\n  if (preserveAspectRatio.alignX !== NONE) {\n    //translate all container for the effect of Mid, Min, Max\n    if (preserveAspectRatio.meetOrSlice === 'meet') {\n      scaleY = scaleX = scaleX > scaleY ? scaleY : scaleX;\n      // calculate additional translation to move the viewbox\n    }\n    if (preserveAspectRatio.meetOrSlice === 'slice') {\n      scaleY = scaleX = scaleX > scaleY ? scaleX : scaleY;\n      // calculate additional translation to move the viewbox\n    }\n    widthDiff = parsedDim.width - viewBoxWidth * scaleX;\n    heightDiff = parsedDim.height - viewBoxHeight * scaleX;\n    if (preserveAspectRatio.alignX === 'Mid') {\n      widthDiff /= 2;\n    }\n    if (preserveAspectRatio.alignY === 'Mid') {\n      heightDiff /= 2;\n    }\n    if (preserveAspectRatio.alignX === 'Min') {\n      widthDiff = 0;\n    }\n    if (preserveAspectRatio.alignY === 'Min') {\n      heightDiff = 0;\n    }\n  }\n\n  if (\n    scaleX === 1 &&\n    scaleY === 1 &&\n    minX === 0 &&\n    minY === 0 &&\n    x === 0 &&\n    y === 0\n  ) {\n    return parsedDim;\n  }\n  if ((x || y) && element.parentNode!.nodeName !== '#document') {\n    translateMatrix =\n      ' translate(' + parseUnit(x || '0') + ' ' + parseUnit(y || '0') + ') ';\n  }\n\n  matrix =\n    translateMatrix +\n    ' matrix(' +\n    scaleX +\n    ' 0' +\n    ' 0 ' +\n    scaleY +\n    ' ' +\n    (minX * scaleX + widthDiff) +\n    ' ' +\n    (minY * scaleY + heightDiff) +\n    ') ';\n  // seems unused.\n  // parsedDim.viewboxTransform = parseTransformAttribute(matrix);\n  if (element.nodeName === 'svg') {\n    el = element.ownerDocument.createElementNS(svgNS, 'g');\n    // element.firstChild != null\n    while (element.firstChild) {\n      el.appendChild(element.firstChild);\n    }\n    element.appendChild(el);\n  } else {\n    el = element;\n    el.removeAttribute('x');\n    el.removeAttribute('y');\n    matrix = el.getAttribute('transform') + matrix;\n  }\n  el.setAttribute('transform', matrix);\n  return parsedDim;\n}\n"],"names":["applyViewboxTransform","element","svgViewBoxElementsRegEx","test","nodeName","viewBoxAttr","getAttribute","scaleX","scaleY","minX","minY","matrix","el","widthAttr","heightAttr","x","y","goodViewbox","reViewBoxAttrValue","missingViewBox","missingDimAttr","translateMatrix","widthDiff","heightDiff","parentNode","parseUnit","setAttribute","removeAttribute","width","height","parsedDim","pasedViewBox","match","parseFloat","viewBoxWidth","viewBoxHeight","preserveAspectRatio","parsePreserveAspectRatioAttribute","alignX","NONE","meetOrSlice","alignY","ownerDocument","createElementNS","svgNS","firstChild","appendChild"],"mappings":"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"}