{"version":3,"file":"util.cjs","sources":["../../../../../../packages/components/typography/src/util.tsx"],"sourcesContent":["import type { CSSProperties, VNodeTypes } from 'vue';\nimport { styleToString } from '@antdv/utils';\nimport { createApp } from 'vue';\n\ninterface MeasureResult {\n  finished: boolean\n  vNode: VNodeTypes\n}\ninterface Option {\n  rows: number\n  suffix?: string\n}\n\n// We only handle element & text node.\nconst TEXT_NODE = 3;\nconst COMMENT_NODE = 8;\n\nlet ellipsisContainer: HTMLParagraphElement;\n\nconst wrapperStyle: CSSProperties = {\n  padding: 0,\n  margin: 0,\n  display: 'inline',\n  lineHeight: 'inherit',\n};\n\nfunction resetDomStyles(target: HTMLElement, origin: HTMLElement) {\n  target.setAttribute('aria-hidden', 'true');\n  const originStyle = window.getComputedStyle(origin);\n  const originCSS = styleToString(originStyle);\n  // Set shadow\n  target.setAttribute('style', originCSS);\n  target.style.position = 'fixed';\n  target.style.left = '0';\n  target.style.height = 'auto';\n  target.style.minHeight = 'auto';\n  target.style.maxHeight = 'auto';\n  target.style.paddingTop = '0';\n  target.style.paddingBottom = '0';\n  target.style.borderTopWidth = '0';\n  target.style.borderBottomWidth = '0';\n  target.style.top = '-999999px';\n  target.style.zIndex = '-1000';\n  // clean up css overflow\n  target.style.textOverflow = 'clip';\n  target.style.whiteSpace = 'normal';\n  (target.style as any).webkitLineClamp = 'none';\n}\n\nfunction getRealLineHeight(originElement: HTMLElement) {\n  const heightContainer = document.createElement('div');\n  resetDomStyles(heightContainer, originElement);\n  heightContainer.appendChild(document.createTextNode('text'));\n  document.body.appendChild(heightContainer);\n  // The element real height is always less than multiple of line-height\n  // Use getBoundingClientRect to get actual single row height of the element\n  const realHeight = heightContainer.getBoundingClientRect().height;\n  document.body.removeChild(heightContainer);\n  return realHeight;\n}\n\nexport default (\n  originElement: HTMLElement,\n  option: Option,\n  content: string,\n  fixedContent: VNodeTypes[],\n  ellipsisStr: string,\n): {\n  content: VNodeTypes\n  text: string\n  ellipsis: boolean\n} => {\n  if (!ellipsisContainer) {\n    ellipsisContainer = document.createElement('div');\n    ellipsisContainer.setAttribute('aria-hidden', 'true');\n    document.body.appendChild(ellipsisContainer);\n  }\n\n  const { rows, suffix = '' } = option;\n  const lineHeight = getRealLineHeight(originElement);\n  const maxHeight = Math.round(lineHeight * rows * 100) / 100;\n\n  resetDomStyles(ellipsisContainer, originElement);\n\n  // Render in the fake container\n  const vm = createApp({\n    render() {\n      return (\n        <div style={wrapperStyle}>\n          <span style={wrapperStyle}>\n            {content}\n            {suffix}\n          </span>\n          <span style={wrapperStyle}>{fixedContent}</span>\n        </div>\n      );\n    },\n  });\n\n  vm.mount(ellipsisContainer);\n\n  // Check if ellipsis in measure div is height enough for content\n  function inRange() {\n    const currentHeight = Math.round(ellipsisContainer.getBoundingClientRect().height * 100) / 100;\n    return currentHeight - 0.1 <= maxHeight; // -.1 for firefox\n  }\n\n  // Skip ellipsis if already match\n  if (inRange()) {\n    vm.unmount();\n    return { content, text: ellipsisContainer.innerHTML, ellipsis: false };\n  }\n  const childNodes = Array.prototype.slice\n    .apply(ellipsisContainer.childNodes[0].childNodes[0].cloneNode(true).childNodes)\n    .filter(({ nodeType, data }) => nodeType !== COMMENT_NODE && data !== '');\n  const fixedNodes = Array.prototype.slice.apply(\n    ellipsisContainer.childNodes[0].childNodes[1].cloneNode(true).childNodes,\n  );\n\n  vm.unmount();\n\n  // ========================= Find match ellipsis content =========================\n  const ellipsisChildren = [];\n  ellipsisContainer.innerHTML = '';\n\n  // Create origin content holder\n  const ellipsisContentHolder = document.createElement('span');\n  ellipsisContainer.appendChild(ellipsisContentHolder);\n  const ellipsisTextNode = document.createTextNode(ellipsisStr + suffix);\n  ellipsisContentHolder.appendChild(ellipsisTextNode);\n\n  fixedNodes.forEach((childNode) => {\n    ellipsisContainer.appendChild(childNode);\n  });\n\n  // Append before fixed nodes\n  function appendChildNode(node: ChildNode) {\n    ellipsisContentHolder.insertBefore(node, ellipsisTextNode);\n  }\n\n  // Get maximum text\n  function measureText(\n    textNode: Text,\n    fullText: string,\n    startLoc = 0,\n    endLoc = fullText.length,\n    lastSuccessLoc = 0,\n  ): MeasureResult {\n    const midLoc = Math.floor((startLoc + endLoc) / 2);\n    const currentText = fullText.slice(0, midLoc);\n    textNode.textContent = currentText;\n\n    if (startLoc >= endLoc - 1) {\n      // Loop when step is small\n      for (let step = endLoc; step >= startLoc; step -= 1) {\n        const currentStepText = fullText.slice(0, step);\n        textNode.textContent = currentStepText;\n\n        if (inRange() || !currentStepText) {\n          return step === fullText.length\n            ? {\n                finished: false,\n                vNode: fullText,\n              }\n            : {\n                finished: true,\n                vNode: currentStepText,\n              };\n        }\n      }\n    }\n\n    if (inRange())\n      return measureText(textNode, fullText, midLoc, endLoc, midLoc);\n\n    return measureText(textNode, fullText, startLoc, midLoc, lastSuccessLoc);\n  }\n\n  function measureNode(childNode: ChildNode): MeasureResult {\n    const type = childNode.nodeType;\n    // console.log('type', type);\n    // if (type === ELEMENT_NODE) {\n    //   // We don't split element, it will keep if whole element can be displayed.\n    //   appendChildNode(childNode);\n    //   if (inRange()) {\n    //     return {\n    //       finished: false,\n    //       vNode: contentList[index],\n    //     };\n    //   }\n\n    //   // Clean up if can not pull in\n    //   ellipsisContentHolder.removeChild(childNode);\n    //   return {\n    //     finished: true,\n    //     vNode: null,\n    //   };\n    // }\n    if (type === TEXT_NODE) {\n      const fullText = childNode.textContent || '';\n      const textNode = document.createTextNode(fullText);\n      appendChildNode(textNode);\n      return measureText(textNode, fullText);\n    }\n\n    // Not handle other type of content\n    return {\n      finished: false,\n      vNode: null,\n    };\n  }\n\n  childNodes.some((childNode) => {\n    const { finished, vNode } = measureNode(childNode);\n    if (vNode)\n      ellipsisChildren.push(vNode);\n\n    return finished;\n  });\n\n  return {\n    content: ellipsisChildren,\n    text: ellipsisContainer.innerHTML,\n    ellipsis: true,\n  };\n};\n"],"names":["TEXT_NODE","COMMENT_NODE","ellipsisContainer","wrapperStyle","padding","margin","display","lineHeight","resetDomStyles","target","origin","setAttribute","originStyle","window","getComputedStyle","originCSS","styleToString","style","position","left","height","minHeight","maxHeight","paddingTop","paddingBottom","borderTopWidth","borderBottomWidth","top","zIndex","textOverflow","whiteSpace","webkitLineClamp","getRealLineHeight","originElement","heightContainer","document","createElement","appendChild","createTextNode","body","realHeight","getBoundingClientRect","removeChild","option","content","fixedContent","ellipsisStr","rows","suffix","Math","round","vm","createApp","render","_createVNode","mount","inRange","currentHeight","unmount","text","innerHTML","ellipsis","childNodes","Array","prototype","slice","apply","cloneNode","filter","nodeType","data","fixedNodes","ellipsisChildren","ellipsisContentHolder","ellipsisTextNode","forEach","childNode","appendChildNode","node","insertBefore","measureText","textNode","fullText","startLoc","endLoc","length","lastSuccessLoc","midLoc","floor","currentText","textContent","step","currentStepText","finished","vNode","measureNode","type","some","push"],"mappings":"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"}