{"version":3,"file":"applyViewboxTransform.min.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","matrix","el","scaleX","scaleY","minX","minY","widthAttr","heightAttr","x","y","missingViewBox","reViewBoxAttrValue","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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"}