@unovis/ts 1.1.2-beta.1 → 1.1.2-beta.3
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/components/axis/index.js +4 -4
- package/components/axis/index.js.map +1 -1
- package/components/brush/index.js +2 -2
- package/components/brush/index.js.map +1 -1
- package/components/graph/index.js +30 -33
- package/components/graph/index.js.map +1 -1
- package/components/graph/modules/layout.js +123 -130
- package/components/graph/modules/layout.js.map +1 -1
- package/components/graph/modules/node/index.js +1 -1
- package/components/graph/modules/node/index.js.map +1 -1
- package/components/leaflet-flow-map/index.js +4 -4
- package/components/leaflet-flow-map/index.js.map +1 -1
- package/components/leaflet-map/index.js +1 -1
- package/components/leaflet-map/index.js.map +1 -1
- package/components/leaflet-map/modules/map.js +70 -73
- package/components/leaflet-map/modules/map.js.map +1 -1
- package/components/leaflet-map/modules/utils.js +1 -1
- package/components/leaflet-map/modules/utils.js.map +1 -1
- package/package.json +1 -1
- package/styles/index.d.ts +1 -0
- package/styles/index.js +2 -1
- package/styles/index.js.map +1 -1
- package/utils/text.js +12 -6
- package/utils/text.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sources":["../../../../src/components/leaflet-map/modules/utils.ts"],"sourcesContent":["import type L from 'leaflet'\nimport { min, max } from 'd3-array'\nimport Supercluster, { ClusterFeature, PointFeature } from 'supercluster'\n\n// Utils\nimport { clamp, getString, getNumber } from 'utils/data'\nimport { getColor } from 'utils/color'\nimport { polygon, circlePath } from 'utils/path'\nimport { getHTMLTransform } from 'utils/html'\n\n// Types\nimport { NumericAccessor, StringAccessor } from 'types/accessor'\nimport { GenericDataRecord } from 'types/data'\n\n// Local Types\nimport {\n LeafletMapPoint,\n LeafletMapPointShape,\n LeafletMapPieDatum,\n LeafletMapPointStyles,\n PointExpandedClusterProperties,\n LeafletMapPointDatum,\n LeafletMapClusterDatum,\n} from '../types'\n\n// Config\nimport { LeafletMapConfig } from '../config'\n\nexport function bBoxMerge (\n bBoxArray: ({x1: number; x2: number; y1: number; y2: number})[]):\n { x: number; y: number; width: number; height: number } {\n let box = { x1: 0, x2: 0, y1: 0, y2: 0 }\n bBoxArray.forEach(coords => {\n if (!box) {\n box = { ...coords }\n } else {\n if (box.x1 > coords.x1) box.x1 = coords.x1\n if (box.y1 > coords.y1) box.y1 = coords.y1\n if (box.x2 < coords.x2) box.x2 = coords.x2\n if (box.y2 < coords.y2) box.y2 = coords.y2\n }\n })\n\n return {\n x: box.x1,\n y: box.y1,\n width: box.x2 - box.x1,\n height: box.y2 - box.y1,\n }\n}\n\nexport const getNextZoomLevelOnClusterClick = (level: number): number => clamp(1 + level * 1.5, level, 12)\n\nexport function projectPoint<D extends GenericDataRecord> (\n geoJSONPoint: LeafletMapPoint<D> | ClusterFeature<LeafletMapClusterDatum<D>> | PointFeature<LeafletMapPointDatum<D>>,\n leafletMap: L.Map\n): { x: number; y: number } {\n const lat = geoJSONPoint.geometry.coordinates[1]\n const lon = geoJSONPoint.geometry.coordinates[0]\n const projected = leafletMap.latLngToLayerPoint([lat, lon])\n return projected\n}\n\nexport function getPointRadius<D extends GenericDataRecord> (\n geoPoint: ClusterFeature<LeafletMapClusterDatum<D>> | PointFeature<LeafletMapPointDatum<D>> | PointFeature<PointExpandedClusterProperties<D>>,\n pointRadius: NumericAccessor<D>,\n zoomLevel: number\n): number {\n const isDynamic = !pointRadius\n const radius = isDynamic ? 1 + 2 * Math.pow(zoomLevel, 0.80) : getNumber((geoPoint.properties as LeafletMapPointDatum<D>), pointRadius)\n\n const isCluster = (geoPoint as ClusterFeature<D>).properties.cluster\n return (isCluster && isDynamic)\n ? clamp(Math.pow((geoPoint as ClusterFeature<D>).properties.point_count, 0.35) * radius, radius * 1.1, radius * 3)\n : radius\n}\n\nexport function getPointPos<D extends GenericDataRecord> (point: LeafletMapPoint<D> | ClusterFeature<LeafletMapClusterDatum<D>> | PointFeature<LeafletMapPointDatum<D>>, leafletMap: L.Map): { x: number; y: number } {\n const properties = point.properties as LeafletMapPointDatum<D>\n const isFromCluster = !!(properties).expandedClusterPoint\n\n if (isFromCluster) {\n const { x, y } = projectPoint(properties.expandedClusterPoint, leafletMap)\n return {\n x: x + properties.dx,\n y: y + properties.dy,\n }\n } else {\n return projectPoint(point, leafletMap)\n }\n}\n\nexport function getPointDisplayOrder<D extends GenericDataRecord> (\n d: LeafletMapPoint<D>,\n pointStatus: StringAccessor<LeafletMapPointDatum<D> | LeafletMapClusterDatum<D>>,\n colorMap: LeafletMapPointStyles<D>\n): number {\n const status = getString(d.properties, pointStatus)\n const statusList = Object.keys(colorMap)\n return Object.keys(statusList).indexOf(status)\n}\n\nexport function toGeoJSONPoint<D extends GenericDataRecord> (d: D, i: number, pointLatitude: NumericAccessor<D>, pointLongitude: NumericAccessor<D>): PointFeature<D> {\n const lat = getNumber(d, pointLatitude) as number\n const lon = getNumber(d, pointLongitude) as number\n\n return {\n type: 'Feature',\n properties: {\n ...d,\n _index: i,\n },\n geometry: {\n type: 'Point',\n coordinates: [lon, lat],\n },\n }\n}\n\nexport function calculateClusterIndex<D extends GenericDataRecord> (data: D[], config: LeafletMapConfig<D>, maxClusterZoomLevel = 23): Supercluster<D> {\n const { colorMap, pointShape, pointLatitude, pointLongitude, clusteringDistance } = config\n return new Supercluster<D, Supercluster.AnyProps>({\n radius: clusteringDistance,\n maxZoom: maxClusterZoomLevel,\n map: (d): Supercluster.AnyProps => {\n const shape = getString(d, pointShape)\n\n const clusterPoint = { shape }\n for (const key of Object.keys(colorMap)) {\n clusterPoint[key] = d[key] || 0\n }\n\n return clusterPoint\n },\n reduce: (acc, clusterPoint): void => {\n acc.shape = acc.shape === clusterPoint.shape ? acc.shape : LeafletMapPointShape.Circle\n acc.value = (acc.value ?? 0) + (clusterPoint.value ?? 0)\n\n for (const key of Object.keys(colorMap)) {\n acc[key] += clusterPoint[key]\n }\n },\n }).load(data.map((d, i) => toGeoJSONPoint(d, i, pointLatitude, pointLongitude)))\n}\n\nexport function getNodePathData ({ x, y }: { x: number; y: number }, radius: number, shape: LeafletMapPointShape): string {\n switch (shape) {\n case LeafletMapPointShape.Triangle:\n return polygon(radius * 2, 3)\n case LeafletMapPointShape.Square:\n return polygon(radius * 2, 4)\n case LeafletMapPointShape.Circle:\n case LeafletMapPointShape.Ring:\n default:\n return circlePath(x, y, radius)\n }\n}\n\nexport function getDonutData<D extends GenericDataRecord> (\n d: LeafletMapClusterDatum<D> | LeafletMapPointDatum<D>,\n colorMap: LeafletMapPointStyles<D>\n): LeafletMapPieDatum[] {\n return Object.keys(colorMap).map(key => ({\n name: key,\n value: d[key] as number,\n color: colorMap[key].color,\n className: colorMap[key].className,\n }))\n}\n\nexport function geoJsonPointToScreenPoint<D extends GenericDataRecord> (\n geoPoint: ClusterFeature<LeafletMapClusterDatum<D>> | PointFeature<LeafletMapPointDatum<D>>,\n i: number,\n leafletMap: L.Map,\n config: LeafletMapConfig<D>\n): LeafletMapPoint<D> {\n const zoomLevel = leafletMap.getZoom()\n const isCluster = (geoPoint.properties as LeafletMapClusterDatum<D>).cluster\n const clusterIndex = (geoPoint.properties as LeafletMapClusterDatum<D>).clusterIndex\n const clusterPoints = isCluster ? clusterIndex.getLeaves((geoPoint.properties as LeafletMapClusterDatum<D>).cluster_id as number, Infinity).map(d => d.properties) : undefined\n const { x, y } = getPointPos(geoPoint, leafletMap)\n\n const id = isCluster ? `cluster-${geoPoint.id}` : (getString(geoPoint.properties as LeafletMapPointDatum<D>, config.pointId) ?? geoPoint.geometry.coordinates.join(''))\n const pointColor = getColor(geoPoint.properties, isCluster ? config.clusterColor : config.pointColor)\n const radius = getPointRadius(geoPoint, isCluster ? config.clusterRadius : config.pointRadius, zoomLevel)\n const shape = isCluster ? LeafletMapPointShape.Circle : getString(geoPoint.properties as LeafletMapPointDatum<D>, config.pointShape) as LeafletMapPointShape\n const isRing = shape === LeafletMapPointShape.Ring\n\n const donutData = getDonutData(geoPoint.properties, config.colorMap)\n const maxValue = max(donutData, d => d.value)\n const maxValueIndex = donutData.map(d => d.value).indexOf(maxValue)\n const biggestDatum = donutData[maxValueIndex ?? 0]\n\n const color = isCluster ? pointColor\n : (isRing ? null : (pointColor ?? biggestDatum?.color))\n const bbox = { x1: x - radius, y1: y - radius, x2: x + radius, y2: y + radius }\n const path = getNodePathData({ x: 0, y: 0 }, radius, shape)\n const _zIndex = 0\n\n const screenPoint: LeafletMapPoint<D> = {\n ...geoPoint,\n id,\n bbox,\n radius,\n donutData,\n path,\n color,\n isCluster,\n clusterIndex,\n clusterPoints,\n _zIndex,\n }\n\n return screenPoint\n}\n\nexport function shouldClusterExpand<D extends GenericDataRecord> (\n cluster: LeafletMapPoint<D>,\n zoomLevel: number,\n midLevel = 4,\n maxLevel = 8,\n maxClusterZoomLevel = 23\n): boolean {\n if (!cluster) return false\n\n const clusterExpansionZoomLevel = cluster.clusterIndex.getClusterExpansionZoom(cluster.properties.cluster_id as number)\n return zoomLevel >= maxLevel ||\n (zoomLevel >= midLevel && (cluster.properties.point_count < 20 || clusterExpansionZoomLevel >= maxClusterZoomLevel))\n}\n\nexport function findPointAndClusterByPointId<D extends GenericDataRecord> (\n points: LeafletMapPoint<D>[],\n id: string,\n pointId: StringAccessor<D>\n): {\n point: PointFeature<D> | undefined;\n cluster: LeafletMapPoint<D> | undefined;\n } {\n let point\n let cluster\n points.forEach(p => {\n if (p.isCluster) {\n const leaves = p.clusterIndex.getLeaves((p.properties as LeafletMapClusterDatum<D>).cluster_id as number, Infinity) ?? []\n const foundPoint = leaves.find(d => getString(d.properties, pointId) === id)\n if (foundPoint) {\n point = foundPoint\n cluster = p\n }\n }\n })\n return { point, cluster }\n}\n\nexport function getNodeRelativePosition<D extends GenericDataRecord> (d: LeafletMapPoint<D>, leafletMap: L.Map): { x: number; y: number } {\n const paneTransform = getHTMLTransform(leafletMap.getPane('mapPane'))\n const { x, y } = getPointPos(d, leafletMap)\n return { x: x + paneTransform[0], y: y + paneTransform[1] }\n}\n\nexport function getClusterRadius<D extends GenericDataRecord> (cluster: { points: PointFeature<PointExpandedClusterProperties<D>>[]; cluster: LeafletMapPoint<D> }): number {\n const { points } = cluster\n const minX = min<number>(points.map(d => d.properties.dx - d.properties.r))\n const maxX = max<number>(points.map(d => d.properties.dx + d.properties.r))\n const minY = min<number>(points.map(d => d.properties.dy - d.properties.r))\n const maxY = max<number>(points.map(d => d.properties.dy + d.properties.r))\n return Math.sqrt((maxX - minX) ** 2 + (maxY - minY) ** 2) * 0.5\n}\n\nexport function getClustersAndPoints<D extends GenericDataRecord> (\n clusterIndex: Supercluster<D>,\n leafletMap: L.Map,\n customBounds?: [number, number, number, number]\n): (ClusterFeature<LeafletMapClusterDatum<D>> | PointFeature<D>)[] {\n const leafletBounds = leafletMap.getBounds()\n const southWest = leafletBounds.getSouthWest()\n const northEast = leafletBounds.getNorthEast()\n const bounds = customBounds || [southWest.lng, southWest.lat, northEast.lng, northEast.lat]\n const zoom = Math.round(leafletMap.getZoom())\n const points = clusterIndex.getClusters(bounds, zoom) // as ClusterFeature<LeafletMapPointDatum<D>>[]\n\n for (const p of points) {\n const point = p as ClusterFeature<LeafletMapClusterDatum<D>>\n const isCluster = point.properties.cluster\n if (isCluster) {\n point.properties.clusterIndex = clusterIndex\n point.properties.clusterPoints = clusterIndex.getLeaves(point.properties.cluster_id, Infinity).map(d => d.properties)\n }\n }\n\n return points as (ClusterFeature<LeafletMapClusterDatum<D>> | PointFeature<D>)[]\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../../../src/components/leaflet-map/modules/utils.ts"],"sourcesContent":["import type L from 'leaflet'\nimport { min, max } from 'd3-array'\nimport Supercluster, { ClusterFeature, PointFeature } from 'supercluster'\n\n// Utils\nimport { clamp, getString, getNumber } from 'utils/data'\nimport { getColor } from 'utils/color'\nimport { polygon, circlePath } from 'utils/path'\nimport { getHTMLTransform } from 'utils/html'\n\n// Types\nimport { NumericAccessor, StringAccessor } from 'types/accessor'\nimport { GenericDataRecord } from 'types/data'\n\n// Local Types\nimport {\n LeafletMapPoint,\n LeafletMapPointShape,\n LeafletMapPieDatum,\n LeafletMapPointStyles,\n PointExpandedClusterProperties,\n LeafletMapPointDatum,\n LeafletMapClusterDatum,\n} from '../types'\n\n// Config\nimport { LeafletMapConfig } from '../config'\n\nexport function bBoxMerge (\n bBoxArray: ({x1: number; x2: number; y1: number; y2: number})[]):\n { x: number; y: number; width: number; height: number } {\n let box = { x1: 0, x2: 0, y1: 0, y2: 0 }\n bBoxArray.forEach(coords => {\n if (!box) {\n box = { ...coords }\n } else {\n if (box.x1 > coords.x1) box.x1 = coords.x1\n if (box.y1 > coords.y1) box.y1 = coords.y1\n if (box.x2 < coords.x2) box.x2 = coords.x2\n if (box.y2 < coords.y2) box.y2 = coords.y2\n }\n })\n\n return {\n x: box.x1,\n y: box.y1,\n width: box.x2 - box.x1,\n height: box.y2 - box.y1,\n }\n}\n\nexport const getNextZoomLevelOnClusterClick = (level: number): number => clamp(1 + level * 1.5, level, 12)\n\nexport function projectPoint<D extends GenericDataRecord> (\n geoJSONPoint: LeafletMapPoint<D> | ClusterFeature<LeafletMapClusterDatum<D>> | PointFeature<LeafletMapPointDatum<D>>,\n leafletMap: L.Map\n): { x: number; y: number } {\n const lat = geoJSONPoint.geometry.coordinates[1]\n const lon = geoJSONPoint.geometry.coordinates[0]\n const projected = leafletMap.latLngToLayerPoint([lat, lon])\n return projected\n}\n\nexport function getPointRadius<D extends GenericDataRecord> (\n geoPoint: ClusterFeature<LeafletMapClusterDatum<D>> | PointFeature<LeafletMapPointDatum<D>> | PointFeature<PointExpandedClusterProperties<D>>,\n pointRadius: NumericAccessor<D>,\n zoomLevel: number\n): number {\n const isDynamic = !pointRadius\n const radius = isDynamic ? 1 + 2 * Math.pow(zoomLevel, 0.80) : getNumber((geoPoint.properties as LeafletMapPointDatum<D>), pointRadius)\n\n const isCluster = (geoPoint as ClusterFeature<D>).properties.cluster\n return (isCluster && isDynamic)\n ? clamp(Math.pow((geoPoint as ClusterFeature<D>).properties.point_count, 0.35) * radius, radius * 1.1, radius * 3)\n : radius\n}\n\nexport function getPointPos<D extends GenericDataRecord> (point: LeafletMapPoint<D> | ClusterFeature<LeafletMapClusterDatum<D>> | PointFeature<LeafletMapPointDatum<D>>, leafletMap: L.Map): { x: number; y: number } {\n const properties = point.properties as LeafletMapPointDatum<D>\n const isFromCluster = !!(properties).expandedClusterPoint\n\n if (isFromCluster) {\n const { x, y } = projectPoint(properties.expandedClusterPoint, leafletMap)\n return {\n x: x + properties.dx,\n y: y + properties.dy,\n }\n } else {\n return projectPoint(point, leafletMap)\n }\n}\n\nexport function getPointDisplayOrder<D extends GenericDataRecord> (\n d: LeafletMapPoint<D>,\n pointStatus: StringAccessor<LeafletMapPointDatum<D> | LeafletMapClusterDatum<D>>,\n colorMap: LeafletMapPointStyles<D>\n): number {\n const status = getString(d.properties, pointStatus)\n const statusList = Object.keys(colorMap)\n return Object.keys(statusList).indexOf(status)\n}\n\nexport function toGeoJSONPoint<D extends GenericDataRecord> (d: D, i: number, pointLatitude: NumericAccessor<D>, pointLongitude: NumericAccessor<D>): PointFeature<D> {\n const lat = getNumber(d, pointLatitude) as number\n const lon = getNumber(d, pointLongitude) as number\n\n return {\n type: 'Feature',\n properties: {\n ...d,\n _index: i,\n },\n geometry: {\n type: 'Point',\n coordinates: [lon, lat],\n },\n }\n}\n\nexport function calculateClusterIndex<D extends GenericDataRecord> (data: D[], config: LeafletMapConfig<D>, maxClusterZoomLevel = 23): Supercluster<D> {\n const { colorMap, pointShape, pointLatitude, pointLongitude, clusteringDistance } = config\n return new Supercluster<D, Supercluster.AnyProps>({\n radius: clusteringDistance,\n maxZoom: maxClusterZoomLevel,\n map: (d): Supercluster.AnyProps => {\n const shape = getString(d, pointShape)\n\n const clusterPoint = { shape }\n for (const key of Object.keys(colorMap)) {\n clusterPoint[key] = d[key] || 0\n }\n\n return clusterPoint\n },\n reduce: (acc, clusterPoint): void => {\n acc.shape = acc.shape === clusterPoint.shape ? acc.shape : LeafletMapPointShape.Circle\n acc.value = (acc.value ?? 0) + (clusterPoint.value ?? 0)\n\n for (const key of Object.keys(colorMap)) {\n acc[key] += clusterPoint[key]\n }\n },\n }).load(data.map((d, i) => toGeoJSONPoint(d, i, pointLatitude, pointLongitude)))\n}\n\nexport function getNodePathData ({ x, y }: { x: number; y: number }, radius: number, shape: LeafletMapPointShape): string {\n switch (shape) {\n case LeafletMapPointShape.Triangle:\n return polygon(radius * 2, 3)\n case LeafletMapPointShape.Square:\n return polygon(radius * 2, 4)\n case LeafletMapPointShape.Circle:\n case LeafletMapPointShape.Ring:\n default:\n return circlePath(x, y, radius)\n }\n}\n\nexport function getDonutData<D extends GenericDataRecord> (\n d: LeafletMapClusterDatum<D> | LeafletMapPointDatum<D>,\n colorMap: LeafletMapPointStyles<D>\n): LeafletMapPieDatum[] {\n return Object.keys(colorMap).map(key => ({\n name: key,\n value: d[key] as number,\n color: colorMap[key].color,\n className: colorMap[key].className,\n }))\n}\n\nexport function geoJsonPointToScreenPoint<D extends GenericDataRecord> (\n geoPoint: ClusterFeature<LeafletMapClusterDatum<D>> | PointFeature<LeafletMapPointDatum<D>>,\n i: number,\n leafletMap: L.Map,\n config: LeafletMapConfig<D>\n): LeafletMapPoint<D> {\n const zoomLevel = leafletMap.getZoom()\n const isCluster = (geoPoint.properties as LeafletMapClusterDatum<D>).cluster\n const clusterIndex = (geoPoint.properties as LeafletMapClusterDatum<D>).clusterIndex\n const clusterPoints = isCluster ? clusterIndex.getLeaves((geoPoint.properties as LeafletMapClusterDatum<D>).cluster_id as number, Infinity).map(d => d.properties) : undefined\n const { x, y } = getPointPos(geoPoint, leafletMap)\n\n const id = isCluster ? `cluster-${geoPoint.id}` : (getString(geoPoint.properties as LeafletMapPointDatum<D>, config.pointId) ?? geoPoint.geometry.coordinates.join(''))\n const pointColor = getColor(geoPoint.properties, isCluster ? config.clusterColor : config.pointColor)\n const radius = getPointRadius(geoPoint, isCluster ? config.clusterRadius : config.pointRadius, zoomLevel)\n const shape = isCluster ? LeafletMapPointShape.Circle : getString(geoPoint.properties as LeafletMapPointDatum<D>, config.pointShape) as LeafletMapPointShape\n const isRing = shape === LeafletMapPointShape.Ring\n\n const donutData = getDonutData(geoPoint.properties, config.colorMap)\n const maxValue = max(donutData, d => d.value)\n const maxValueIndex = donutData.map(d => d.value).indexOf(maxValue)\n const biggestDatum = donutData[maxValueIndex ?? 0]\n\n const color = isCluster ? pointColor\n : (isRing ? null : (pointColor ?? biggestDatum?.color))\n const bbox = { x1: x - radius, y1: y - radius, x2: x + radius, y2: y + radius }\n const path = getNodePathData({ x: 0, y: 0 }, radius, shape)\n const _zIndex = 0\n\n const screenPoint: LeafletMapPoint<D> = {\n ...geoPoint,\n id,\n bbox,\n radius,\n donutData,\n path,\n color,\n isCluster,\n clusterIndex,\n clusterPoints,\n _zIndex,\n }\n\n return screenPoint\n}\n\nexport function shouldClusterExpand<D extends GenericDataRecord> (\n cluster: LeafletMapPoint<D>,\n zoomLevel: number,\n midLevel = 4,\n maxLevel = 8,\n maxClusterZoomLevel = 23\n): boolean {\n if (!cluster) return false\n\n const clusterExpansionZoomLevel = cluster.clusterIndex.getClusterExpansionZoom(cluster.properties.cluster_id as number)\n return zoomLevel >= maxLevel ||\n (zoomLevel >= midLevel && (cluster.properties.point_count < 20 || clusterExpansionZoomLevel >= maxClusterZoomLevel))\n}\n\nexport function findPointAndClusterByPointId<D extends GenericDataRecord> (\n points: LeafletMapPoint<D>[],\n id: string,\n pointId: StringAccessor<D>\n): {\n point: PointFeature<D> | undefined;\n cluster: LeafletMapPoint<D> | undefined;\n } {\n let point\n let cluster\n points.forEach(p => {\n if (p.isCluster) {\n const leaves = p.clusterIndex.getLeaves((p.properties as LeafletMapClusterDatum<D>).cluster_id as number, Infinity) ?? []\n const foundPoint = leaves.find(d => getString(d.properties, pointId) === id)\n if (foundPoint) {\n point = foundPoint\n cluster = p\n }\n }\n })\n return { point, cluster }\n}\n\nexport function getNodeRelativePosition<D extends GenericDataRecord> (d: LeafletMapPoint<D>, leafletMap: L.Map): { x: number; y: number } {\n const paneTransform = getHTMLTransform(leafletMap.getPane('mapPane'))\n const { x, y } = getPointPos(d, leafletMap)\n return { x: x + paneTransform[0], y: y + paneTransform[1] }\n}\n\nexport function getClusterRadius<D extends GenericDataRecord> (cluster: { points: PointFeature<PointExpandedClusterProperties<D>>[]; cluster: LeafletMapPoint<D> }): number {\n const { points } = cluster\n const minX = min<number>(points.map(d => d.properties.dx - d.properties.r))\n const maxX = max<number>(points.map(d => d.properties.dx + d.properties.r))\n const minY = min<number>(points.map(d => d.properties.dy - d.properties.r))\n const maxY = max<number>(points.map(d => d.properties.dy + d.properties.r))\n return Math.sqrt((maxX - minX) ** 2 + (maxY - minY) ** 2) * 0.5\n}\n\nexport function getClustersAndPoints<D extends GenericDataRecord> (\n clusterIndex: Supercluster<D>,\n leafletMap: L.Map,\n customBounds?: [number, number, number, number]\n): (ClusterFeature<LeafletMapClusterDatum<D>> | PointFeature<D>)[] {\n const leafletBounds = leafletMap.getBounds()\n const southWest = leafletBounds.getSouthWest()\n const northEast = leafletBounds.getNorthEast()\n const bounds = customBounds || [southWest.lng, southWest.lat, northEast.lng, northEast.lat]\n const zoom = Math.round(leafletMap.getZoom())\n const points = clusterIndex.getClusters(bounds, zoom) // as ClusterFeature<LeafletMapPointDatum<D>>[]\n\n for (const p of points) {\n const point = p as ClusterFeature<LeafletMapClusterDatum<D>>\n const isCluster = point.properties.cluster\n if (isCluster) {\n point.properties.clusterIndex = clusterIndex\n point.properties.clusterPoints = clusterIndex.getLeaves(point.properties.cluster_id, Infinity).map(d => d.properties)\n }\n }\n\n return points as (ClusterFeature<LeafletMapClusterDatum<D>> | PointFeature<D>)[]\n}\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@unovis/ts",
|
|
3
3
|
"description": "Modular data visualization framework for React, Angular, Svelte, and vanilla TypeScript or JavaScript",
|
|
4
|
-
"version": "1.1.2-beta.
|
|
4
|
+
"version": "1.1.2-beta.3",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
7
7
|
"url": "https://github.com/f5/unovis.git",
|
package/styles/index.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { UnovisText } from "../types/text";
|
|
|
2
2
|
export declare const UNOVIS_ICON_FONT_FAMILY_DEFAULT: any;
|
|
3
3
|
export declare const UNOVIS_FONT_WH_RATIO_DEFAULT: number;
|
|
4
4
|
export declare const UNOVIS_TEXT_SEPARATOR_DEFAULT: string[];
|
|
5
|
+
export declare const UNOVIS_TEXT_HYPHEN_CHARACTER_DEFAULT: string;
|
|
5
6
|
export declare const UNOVIS_TEXT_DEFAULT: UnovisText;
|
|
6
7
|
export declare const variables: void;
|
|
7
8
|
export declare function getFontWidthToHeightRatio(context?: HTMLElement | SVGGElement | undefined): number;
|
package/styles/index.js
CHANGED
|
@@ -5,6 +5,7 @@ import { getCSSColorVariable, getLighterColor, colors, getDarkerColor, colorsDar
|
|
|
5
5
|
const UNOVIS_ICON_FONT_FAMILY_DEFAULT = (globalThis === null || globalThis === void 0 ? void 0 : globalThis.UNOVIS_ICON_FONT_FAMILY) || 'FontAwesome';
|
|
6
6
|
const UNOVIS_FONT_WH_RATIO_DEFAULT = (globalThis === null || globalThis === void 0 ? void 0 : globalThis.UNOVIS_FONT_W2H_RATIO_DEFAULT) || 0.5;
|
|
7
7
|
const UNOVIS_TEXT_SEPARATOR_DEFAULT = (globalThis === null || globalThis === void 0 ? void 0 : globalThis.UNOVIS_TEXT_SEPARATOR_DEFAULT) || [' ', '-', '.', ','];
|
|
8
|
+
const UNOVIS_TEXT_HYPHEN_CHARACTER_DEFAULT = (globalThis === null || globalThis === void 0 ? void 0 : globalThis.UNOVIS_TEXT_HYPHEN_CHARACTER_DEFAULT) || '-';
|
|
8
9
|
const UNOVIS_TEXT_DEFAULT = (globalThis === null || globalThis === void 0 ? void 0 : globalThis.UNOVIS_TEXT_DEFAULT) || {
|
|
9
10
|
text: '',
|
|
10
11
|
fontSize: 12,
|
|
@@ -34,5 +35,5 @@ function getFontWidthToHeightRatio(context = window === null || window === void
|
|
|
34
35
|
return context ? +getCSSVariableValue('var(--vis-font-wh-ratio)', context) : UNOVIS_FONT_WH_RATIO_DEFAULT;
|
|
35
36
|
}
|
|
36
37
|
|
|
37
|
-
export { UNOVIS_FONT_WH_RATIO_DEFAULT, UNOVIS_ICON_FONT_FAMILY_DEFAULT, UNOVIS_TEXT_DEFAULT, UNOVIS_TEXT_SEPARATOR_DEFAULT, getFontWidthToHeightRatio, variables };
|
|
38
|
+
export { UNOVIS_FONT_WH_RATIO_DEFAULT, UNOVIS_ICON_FONT_FAMILY_DEFAULT, UNOVIS_TEXT_DEFAULT, UNOVIS_TEXT_HYPHEN_CHARACTER_DEFAULT, UNOVIS_TEXT_SEPARATOR_DEFAULT, getFontWidthToHeightRatio, variables };
|
|
38
39
|
//# sourceMappingURL=index.js.map
|
package/styles/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/styles/index.ts"],"sourcesContent":["import { injectGlobal } from '@emotion/css'\nimport { getCSSVariableValue } from 'utils/misc'\nimport { UnovisText } from 'types/text'\nimport { colors, colorsDark, getCSSColorVariable, getLighterColor, getDarkerColor } from './colors'\n\nexport const UNOVIS_ICON_FONT_FAMILY_DEFAULT = globalThis?.UNOVIS_ICON_FONT_FAMILY || 'FontAwesome'\nexport const UNOVIS_FONT_WH_RATIO_DEFAULT: number = globalThis?.UNOVIS_FONT_W2H_RATIO_DEFAULT || 0.5\nexport const UNOVIS_TEXT_SEPARATOR_DEFAULT: string[] = globalThis?.UNOVIS_TEXT_SEPARATOR_DEFAULT || [' ', '-', '.', ',']\nexport const UNOVIS_TEXT_DEFAULT: UnovisText = globalThis?.UNOVIS_TEXT_DEFAULT || {\n text: '',\n fontSize: 12,\n fontFamily: 'var(--vis-font-family)',\n lineHeight: 1.25,\n marginTop: 0,\n marginBottom: 0,\n}\n\nexport const variables = injectGlobal`\n :root {\n label: vis-root-styles;\n --vis-font-family: Inter, Arial, \"Helvetica Neue\", Helvetica, sans-serif;\n --vis-font-wh-ratio: ${UNOVIS_FONT_WH_RATIO_DEFAULT};\n --vis-color-main: var(${getCSSColorVariable(0)});\n --vis-color-main-light: ${getLighterColor(colors[0])};\n --vis-color-main-dark: ${getDarkerColor(colors[0])};\n --vis-color-grey: #2a2a2a;\n ${colors.map((c, i) => `${getCSSColorVariable(i)}: ${c};`)}\n ${colorsDark.map((c, i) => `--vis-dark-color${i}: ${c};`)}\n\n body.theme-dark {\n ${colors.map((c, i) => `${getCSSColorVariable(i)}: var(--vis-dark-color${i});`)}\n }\n }\n`\n\nexport function getFontWidthToHeightRatio (context: HTMLElement | SVGGElement | undefined = window?.document.body): number {\n return context ? +getCSSVariableValue('var(--vis-font-wh-ratio)', context) : UNOVIS_FONT_WH_RATIO_DEFAULT\n}\n"],"names":[],"mappings":";;;;AAKO,MAAM,+BAA+B,GAAG,CAAA,UAAU,KAAA,IAAA,IAAV,UAAU,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAV,UAAU,CAAE,uBAAuB,KAAI,cAAa;AAC5F,MAAM,4BAA4B,GAAW,CAAA,UAAU,KAAA,IAAA,IAAV,UAAU,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAV,UAAU,CAAE,6BAA6B,KAAI,IAAG;MACvF,6BAA6B,GAAa,CAAA,UAAU,KAAA,IAAA,IAAV,UAAU,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAV,UAAU,CAAE,6BAA6B,KAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAC;AACjH,MAAM,mBAAmB,GAAe,CAAA,UAAU,KAAV,IAAA,IAAA,UAAU,KAAV,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,UAAU,CAAE,mBAAmB,KAAI;AAChF,IAAA,IAAI,EAAE,EAAE;AACR,IAAA,QAAQ,EAAE,EAAE;AACZ,IAAA,UAAU,EAAE,wBAAwB;AACpC,IAAA,UAAU,EAAE,IAAI;AAChB,IAAA,SAAS,EAAE,CAAC;AACZ,IAAA,YAAY,EAAE,CAAC;EAChB;AAEM,MAAM,SAAS,GAAG,YAAY,CAAA,CAAA;;;;2BAIV,4BAA4B,CAAA;4BAC3B,mBAAmB,CAAC,CAAC,CAAC,CAAA;AACpB,4BAAA,EAAA,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;AAC3B,2BAAA,EAAA,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;;AAEhD,IAAA,EAAA,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAA,EAAG,mBAAmB,CAAC,CAAC,CAAC,CAAK,EAAA,EAAA,CAAC,GAAG,CAAC,CAAA;AACxD,IAAA,EAAA,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAmB,gBAAA,EAAA,CAAC,CAAK,EAAA,EAAA,CAAC,GAAG,CAAC,CAAA;;;AAGrD,MAAA,EAAA,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAA,EAAG,mBAAmB,CAAC,CAAC,CAAC,CAAyB,sBAAA,EAAA,CAAC,IAAI,CAAC,CAAA;;;EAGpF;AAEe,SAAA,yBAAyB,CAAE,OAAA,GAAiD,MAAM,KAAA,IAAA,IAAN,MAAM,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAN,MAAM,CAAE,QAAQ,CAAC,IAAI,EAAA;AAC/G,IAAA,OAAO,OAAO,GAAG,CAAC,mBAAmB,CAAC,0BAA0B,EAAE,OAAO,CAAC,GAAG,4BAA4B,CAAA;AAC3G;;;;"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/styles/index.ts"],"sourcesContent":["import { injectGlobal } from '@emotion/css'\nimport { getCSSVariableValue } from 'utils/misc'\nimport { UnovisText } from 'types/text'\nimport { colors, colorsDark, getCSSColorVariable, getLighterColor, getDarkerColor } from './colors'\n\nexport const UNOVIS_ICON_FONT_FAMILY_DEFAULT = globalThis?.UNOVIS_ICON_FONT_FAMILY || 'FontAwesome'\nexport const UNOVIS_FONT_WH_RATIO_DEFAULT: number = globalThis?.UNOVIS_FONT_W2H_RATIO_DEFAULT || 0.5\nexport const UNOVIS_TEXT_SEPARATOR_DEFAULT: string[] = globalThis?.UNOVIS_TEXT_SEPARATOR_DEFAULT || [' ', '-', '.', ',']\nexport const UNOVIS_TEXT_HYPHEN_CHARACTER_DEFAULT: string = globalThis?.UNOVIS_TEXT_HYPHEN_CHARACTER_DEFAULT || '-'\nexport const UNOVIS_TEXT_DEFAULT: UnovisText = globalThis?.UNOVIS_TEXT_DEFAULT || {\n text: '',\n fontSize: 12,\n fontFamily: 'var(--vis-font-family)',\n lineHeight: 1.25,\n marginTop: 0,\n marginBottom: 0,\n}\n\nexport const variables = injectGlobal`\n :root {\n label: vis-root-styles;\n --vis-font-family: Inter, Arial, \"Helvetica Neue\", Helvetica, sans-serif;\n --vis-font-wh-ratio: ${UNOVIS_FONT_WH_RATIO_DEFAULT};\n --vis-color-main: var(${getCSSColorVariable(0)});\n --vis-color-main-light: ${getLighterColor(colors[0])};\n --vis-color-main-dark: ${getDarkerColor(colors[0])};\n --vis-color-grey: #2a2a2a;\n ${colors.map((c, i) => `${getCSSColorVariable(i)}: ${c};`)}\n ${colorsDark.map((c, i) => `--vis-dark-color${i}: ${c};`)}\n\n body.theme-dark {\n ${colors.map((c, i) => `${getCSSColorVariable(i)}: var(--vis-dark-color${i});`)}\n }\n }\n`\n\nexport function getFontWidthToHeightRatio (context: HTMLElement | SVGGElement | undefined = window?.document.body): number {\n return context ? +getCSSVariableValue('var(--vis-font-wh-ratio)', context) : UNOVIS_FONT_WH_RATIO_DEFAULT\n}\n"],"names":[],"mappings":";;;;AAKO,MAAM,+BAA+B,GAAG,CAAA,UAAU,KAAA,IAAA,IAAV,UAAU,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAV,UAAU,CAAE,uBAAuB,KAAI,cAAa;AAC5F,MAAM,4BAA4B,GAAW,CAAA,UAAU,KAAA,IAAA,IAAV,UAAU,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAV,UAAU,CAAE,6BAA6B,KAAI,IAAG;MACvF,6BAA6B,GAAa,CAAA,UAAU,KAAA,IAAA,IAAV,UAAU,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAV,UAAU,CAAE,6BAA6B,KAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAC;AACjH,MAAM,oCAAoC,GAAW,CAAA,UAAU,KAAA,IAAA,IAAV,UAAU,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAV,UAAU,CAAE,oCAAoC,KAAI,IAAG;AAC5G,MAAM,mBAAmB,GAAe,CAAA,UAAU,KAAV,IAAA,IAAA,UAAU,KAAV,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,UAAU,CAAE,mBAAmB,KAAI;AAChF,IAAA,IAAI,EAAE,EAAE;AACR,IAAA,QAAQ,EAAE,EAAE;AACZ,IAAA,UAAU,EAAE,wBAAwB;AACpC,IAAA,UAAU,EAAE,IAAI;AAChB,IAAA,SAAS,EAAE,CAAC;AACZ,IAAA,YAAY,EAAE,CAAC;EAChB;AAEM,MAAM,SAAS,GAAG,YAAY,CAAA,CAAA;;;;2BAIV,4BAA4B,CAAA;4BAC3B,mBAAmB,CAAC,CAAC,CAAC,CAAA;AACpB,4BAAA,EAAA,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;AAC3B,2BAAA,EAAA,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;;AAEhD,IAAA,EAAA,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAA,EAAG,mBAAmB,CAAC,CAAC,CAAC,CAAK,EAAA,EAAA,CAAC,GAAG,CAAC,CAAA;AACxD,IAAA,EAAA,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAmB,gBAAA,EAAA,CAAC,CAAK,EAAA,EAAA,CAAC,GAAG,CAAC,CAAA;;;AAGrD,MAAA,EAAA,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAA,EAAG,mBAAmB,CAAC,CAAC,CAAC,CAAyB,sBAAA,EAAA,CAAC,IAAI,CAAC,CAAA;;;EAGpF;AAEe,SAAA,yBAAyB,CAAE,OAAA,GAAiD,MAAM,KAAA,IAAA,IAAN,MAAM,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAN,MAAM,CAAE,QAAQ,CAAC,IAAI,EAAA;AAC/G,IAAA,OAAO,OAAO,GAAG,CAAC,mBAAmB,CAAC,0BAA0B,EAAE,OAAO,CAAC,GAAG,4BAA4B,CAAA;AAC3G;;;;"}
|
package/utils/text.js
CHANGED
|
@@ -2,7 +2,7 @@ import { sum } from 'd3-array';
|
|
|
2
2
|
import { TrimMode, VerticalAlign, TextAlign } from '../types/text.js';
|
|
3
3
|
import { flatten, isArray, merge } from './data.js';
|
|
4
4
|
import { getTextAnchorFromTextAlign } from '../types/svg.js';
|
|
5
|
-
import { getFontWidthToHeightRatio, UNOVIS_TEXT_SEPARATOR_DEFAULT, UNOVIS_TEXT_DEFAULT } from '../styles/index.js';
|
|
5
|
+
import { getFontWidthToHeightRatio, UNOVIS_TEXT_HYPHEN_CHARACTER_DEFAULT, UNOVIS_TEXT_SEPARATOR_DEFAULT, UNOVIS_TEXT_DEFAULT } from '../styles/index.js';
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* Converts a kebab-case string to camelCase.
|
|
@@ -251,7 +251,7 @@ function breakTextIntoLines(textBlock, width = undefined, fastMode = true, separ
|
|
|
251
251
|
if (subLineLengthPx > width) {
|
|
252
252
|
let breakIndex = (line.trim()).length - 2; // Place at least 2 characters onto the next line
|
|
253
253
|
while (breakIndex > 0) {
|
|
254
|
-
const subLine = `${line.substring(0, breakIndex)}
|
|
254
|
+
const subLine = `${line.substring(0, breakIndex)}${UNOVIS_TEXT_HYPHEN_CHARACTER_DEFAULT}`; // Use hyphen when force breaking words
|
|
255
255
|
const subLinePx = fastMode
|
|
256
256
|
? estimateStringPixelLength(subLine, textBlock.fontSize, textBlock.fontWidthToHeightRatio)
|
|
257
257
|
: getPreciseStringLengthPx(subLine, textBlock.fontFamily, textBlock.fontSize);
|
|
@@ -303,14 +303,20 @@ function getWrappedText(text, width = undefined, height = undefined, fastMode =
|
|
|
303
303
|
const dh = text.fontSize * text.lineHeight;
|
|
304
304
|
// Iterate over lines and handle text overflow based on the height limit if provided
|
|
305
305
|
for (let k = 0; k < lines.length; k += 1) {
|
|
306
|
-
|
|
306
|
+
let line = lines[k];
|
|
307
307
|
h += dh;
|
|
308
308
|
if (height && (h + dh) > height && (k !== lines.length - 1)) {
|
|
309
|
+
// Remove hyphen character from the end of the line if it's there
|
|
310
|
+
const lastCharacter = line.charAt(line.length - 1);
|
|
311
|
+
if (lastCharacter === UNOVIS_TEXT_HYPHEN_CHARACTER_DEFAULT) {
|
|
312
|
+
line = line.substr(0, lines[k].length - 1);
|
|
313
|
+
}
|
|
314
|
+
const lineWithEllipsis = `${line} …`;
|
|
309
315
|
const textLengthPx = fastMode
|
|
310
|
-
? estimateStringPixelLength(
|
|
311
|
-
: getPreciseStringLengthPx(
|
|
316
|
+
? estimateStringPixelLength(lineWithEllipsis, text.fontSize, text.fontWidthToHeightRatio)
|
|
317
|
+
: getPreciseStringLengthPx(lineWithEllipsis, text.fontFamily, text.fontSize);
|
|
312
318
|
if (textLengthPx < width) {
|
|
313
|
-
lines[k]
|
|
319
|
+
lines[k] = lineWithEllipsis;
|
|
314
320
|
}
|
|
315
321
|
else {
|
|
316
322
|
lines[k] = `${lines[k].substr(0, lines[k].length - 2)}…`;
|
package/utils/text.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.js","sources":["../../src/utils/text.ts"],"sourcesContent":["import { Selection } from 'd3-selection'\nimport { sum } from 'd3-array'\n\n// Types\nimport { TextAlign, TrimMode, UnovisText, UnovisTextFrameOptions, UnovisTextOptions, UnovisWrappedText, VerticalAlign } from 'types/text'\n\n// Utils\nimport { flatten, isArray, merge } from 'utils/data'\nimport { getTextAnchorFromTextAlign } from 'types/svg'\n\n// Styles\nimport { getFontWidthToHeightRatio, UNOVIS_TEXT_DEFAULT, UNOVIS_TEXT_SEPARATOR_DEFAULT } from 'styles/index'\n\n/**\n * Converts a kebab-case string to camelCase.\n *\n * @param {string} str - The kebab-case string to be converted.\n * @returns {string} The resulting camelCase string.\n */\nexport function kebabCaseToCamel (str: string): string {\n return str.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase())\n}\n\n/**\n * Converts a given string to kebab-case.\n * @param {string} str - The input string to be converted to kebab-case.\n * @returns {string} - The kebab-cased string.\n */\nexport function kebabCase (str: string): string {\n return str.match(/[A-Z]{2,}(?=[A-Z][a-z0-9]*|\\b)|[A-Z]?[a-z0-9]*|[A-Z]|[0-9]+/g)\n ?.filter(Boolean)\n .map(x => x.toLowerCase())\n .join('-')\n}\n\n/**\n * Trims the input string from the start, leaving only the specified maximum length.\n * @param {string} [str=''] - The input string to be trimmed.\n * @param {number} [maxLength=15] - The maximum allowed length of the trimmed string.\n * @returns {string} - The trimmed string.\n */\nexport function trimStringStart (str = '', maxLength = 15): string {\n return str.length > maxLength ? `…${str.substr(str.length - maxLength, maxLength)}` : str\n}\n\n/**\n * Trims the input string from the middle, leaving only the specified maximum length.\n * @param {string} [str=''] - The input string to be trimmed.\n * @param {number} [maxLength=15] - The maximum allowed length of the trimmed string.\n * @returns {string} - The trimmed string.\n */\nexport function trimStringMiddle (str = '', maxLength = 15): string {\n const dist = Math.floor((maxLength - 3) / 2)\n return str.length > maxLength ? `${str.substr(0, dist)}…${str.substr(-dist, dist)}` : str\n}\n\n/**\n * Trims the input string from the end, leaving only the specified maximum length.\n * @param {string} [str=''] - The input string to be trimmed.\n * @param {number} [maxLength=15] - The maximum allowed length of the trimmed string.\n * @returns {string} - The trimmed string.\n */\nexport function trimStringEnd (str = '', maxLength = 15): string {\n return str.length > maxLength ? `${str.substr(0, maxLength)}…` : str\n}\n\n/**\n * Trims the input string according to the specified trim mode.\n * @param {string} [str=''] - The input string to be trimmed.\n * @param {number} [length=15] - The maximum allowed length of the trimmed string.\n * @param {TrimMode} [type=TrimMode.Middle] - The trim mode to be applied.\n * @returns {string} - The trimmed string.\n */\nexport function trimString (str = '', length = 15, type = TrimMode.Middle): string {\n let result = trimStringEnd(str, length)\n if (type === TrimMode.Start) result = trimStringStart(str, length)\n else if (type === TrimMode.Middle) result = trimStringMiddle(str, length)\n return result\n}\n\n/**\n * Splits the input string according to the specified separators.\n * @param {string} text - The input string to be split.\n * @param {string[]} [separators=[' ']] - The array of separators to be used for splitting.\n * @returns {string[]} - The array of split words.\n */\nexport function splitString (text: string, separators = [' ']): string[] {\n let result = [text] as any[]\n for (let i = 0; i < separators.length; i++) {\n const sep = separators[i]\n result.forEach((d, id) => {\n const separated = d.split(sep)\n const words = separated.map((word, j) => `${word}${j === separated.length - 1 ? '' : sep}`)\n result[id] = words\n })\n result = flatten(result)\n }\n\n return result\n}\n\n/**\n * Wraps an SVG text element to fit within the specified width.\n * @param {Selection<SVGTextElement, any, SVGElement, any>} textElement - The SVG text element to be wrapped.\n * @param {number} width - The maximum allowed width for the text element.\n * @param {(string | string[])} [separator=[' ', '-', '.', ',']] - The separator(s) to be used for wrapping.\n */\nexport function wrapSVGText (\n textElement: Selection<SVGTextElement, any, SVGElement, any>,\n width: number,\n separator: string | string[] = [' ', '-', '.', ',']\n): void {\n const text = textElement.text()\n if (!text) return\n\n // Wrap\n const separators = (isArray(separator) ? separator : [separator]) as string[]\n const words = splitString(text, separators)\n const x = parseFloat(textElement.attr('x')) || 0\n\n textElement.text('')\n let tspan = textElement.append('tspan').attr('x', x)\n let tspanContent = `${words[0]}`\n tspan.text(tspanContent)\n\n words.forEach((word, i) => {\n if (i === 0) return\n\n const tspanText = `${tspanContent}${word}`\n tspan.text(tspanText)\n const tspanWidth = tspan.node().getComputedTextLength()\n if (tspanWidth > width) {\n tspan.text(tspanContent.trim())\n\n tspan = textElement.append('tspan')\n .attr('x', x)\n .attr('dy', '1.2em')\n .text(word)\n\n tspanContent = word\n } else tspanContent += word\n })\n}\n\n/**\n * Trims an SVG text element based on the specified max width, trim type, and other options.\n * @param {Selection<SVGTextElement, any, SVGElement, any>} svgTextSelection - The D3 selection of the SVG text element to be trimmed.\n * @param {number} [maxWidth=50] - The maximum width of the text element.\n * @param {TrimMode} [trimType=TrimMode.Middle] - The type of trim (start, middle, or end).\n * @param {boolean} [fastMode=true] - Whether to use a fast estimation method for text length calculation.\n * @param {number} [fontSize=0] - The font size of the text.\n * @param {number} [fontWidthToHeightRatio=getFontWidthToHeightRatio()] - The font width to height ratio.\n * @returns {boolean} True if the text was trimmed, false otherwise.\n */\nexport function trimSVGText (\n svgTextSelection: Selection<SVGTextElement, any, SVGElement, any>,\n maxWidth = 50,\n trimType = TrimMode.Middle,\n fastMode = true,\n fontSize = +window.getComputedStyle(svgTextSelection.node())?.fontSize || 0,\n fontWidthToHeightRatio = getFontWidthToHeightRatio()\n): boolean {\n const text = svgTextSelection.text()\n const textLength = text.length\n\n const textWidth = fastMode ? fontSize * textLength * fontWidthToHeightRatio : svgTextSelection.node().getComputedTextLength()\n const tolerance = 1.1\n const maxCharacters = Math.ceil(textLength * maxWidth / (tolerance * textWidth))\n if (maxCharacters < textLength) {\n svgTextSelection.text(trimString(text, maxCharacters, trimType))\n return true\n }\n\n return false\n}\n\n/**\n * Estimates the length of a string in pixels.\n * @param {string} str - The string to be measured.\n * @param {number} fontSize - The font size of the string.\n * @param {number} [fontWidthToHeightRatio=getFontWidthToHeightRatio()] - The font width to height ratio.\n * @returns {number} The estimated length of the string in pixels.\n */\nexport function estimateStringPixelLength (\n str: string,\n fontSize: number,\n fontWidthToHeightRatio = getFontWidthToHeightRatio()\n): number {\n return str.length * fontSize * fontWidthToHeightRatio || 0\n}\n\n/**\n * Calculates the precise length of a string in pixels.\n * @param {string} str - The string to be measured.\n * @param {string} [fontFamily] - The font family of the string.\n * @param {(string | number)} [fontSize] - The font size of the string.\n * @returns {number} The precise length of the string in pixels.\n */\nexport function getPreciseStringLengthPx (str: string, fontFamily?: string, fontSize?: string | number): number {\n const svgNS = 'http://www.w3.org/2000/svg'\n const svg = document.createElementNS(svgNS, 'svg')\n const text = document.createElementNS(svgNS, 'text')\n\n text.textContent = str\n text.setAttribute('font-size', `${fontSize}`)\n text.setAttribute('font-family', fontFamily)\n\n svg.appendChild(text)\n document.body.appendChild(svg)\n const length = text.getComputedTextLength()\n document.body.removeChild(svg)\n\n return length\n}\n\n/**\n * Estimates the dimensions of an SVG text element.\n *\n * @export\n * @param {Selection<SVGTextElement, any, SVGElement, any>} svgTextSelection - The D3 selection of the SVG text element.\n * @param {number} fontSize - The font size.\n * @param {number} [dy=0.32] - The line height scaling factor.\n * @param {boolean} [fastMode=true] - Whether to use a fast estimation method or a more accurate one.\n * @param {number} [fontWidthToHeightRatio] - The font width-to-height ratio.\n * @returns {{width: number, height: number}} - The estimated dimensions of the text element.\n */\nexport function estimateTextSize (\n svgTextSelection: Selection<SVGTextElement, any, SVGElement, any>,\n fontSize: number,\n dy = 0.32,\n fastMode = true,\n fontWidthToHeightRatio?: number\n): { width: number; height: number } {\n fontWidthToHeightRatio = fontWidthToHeightRatio || getFontWidthToHeightRatio()\n const tspanSelection = svgTextSelection.selectAll('tspan')\n\n const lines = tspanSelection.size() || 1\n const height = svgTextSelection.text() ? 0.85 * fontSize * lines * (1 + dy) - dy : 0\n\n let width = 0\n if (tspanSelection.empty()) {\n const textLength = svgTextSelection.text().length\n width = fastMode ? fontSize * textLength * fontWidthToHeightRatio : svgTextSelection.node().getComputedTextLength()\n } else {\n for (const tspan of tspanSelection.nodes()) {\n const tspanTextLength = (tspan as SVGTSpanElement).textContent.length\n const w = fastMode ? fontSize * tspanTextLength * fontWidthToHeightRatio : (tspan as SVGTSpanElement).getComputedTextLength()\n if (w > width) width = w\n }\n }\n\n return { width, height }\n}\n\n/**\n * Breaks a text block into lines based on the specified width.\n *\n * @param {UnovisText} textBlock - The text block to break into lines.\n * @param {number | undefined} [width=undefined] - The maximum width of a line in pixels.\n * @param {(number | undefined)} [height=undefined] - The height limit for the wrapped text in pixels.\n * @param {boolean} [fastMode=true] - Whether to use a fast estimation method or a more accurate one.\n * @param {string | string[]} [separator] - The word separators.\n * @returns {string[]} - The text split into lines.\n */\nfunction breakTextIntoLines (\n textBlock: UnovisText,\n width: number | undefined = undefined,\n fastMode = true,\n separator: string | string[] = UNOVIS_TEXT_SEPARATOR_DEFAULT,\n wordBreak = false\n): string[] {\n const text = `${textBlock.text}`\n if (!text) return []\n const separators = Array.isArray(separator) ? separator : [separator]\n\n const splitByNewLine = text.split('\\n')\n return splitByNewLine.map((str) => {\n const lines: string[] = []\n if (!width) return [str]\n\n const words = splitString(str, separators)\n let line = ''\n for (let i = 0; i < words.length; i += 1) {\n const textLengthPx = fastMode\n ? estimateStringPixelLength(line + words[i], textBlock.fontSize, textBlock.fontWidthToHeightRatio)\n : getPreciseStringLengthPx(line + words[i], textBlock.fontFamily, textBlock.fontSize)\n\n if (textLengthPx < width || i === 0) {\n line += words[i]\n } else {\n lines.push(line.trim())\n line = words[i]\n }\n\n // Word break functionality\n if (wordBreak) {\n while (line.length > 0) {\n const subLineLengthPx = fastMode\n ? estimateStringPixelLength(line, textBlock.fontSize, textBlock.fontWidthToHeightRatio)\n : getPreciseStringLengthPx(line, textBlock.fontFamily, textBlock.fontSize)\n\n if (subLineLengthPx > width) {\n let breakIndex = (line.trim()).length - 2 // Place at least 2 characters onto the next line\n while (breakIndex > 0) {\n const subLine = `${line.substring(0, breakIndex)}-` // Use hyphen when force breaking words\n const subLinePx = fastMode\n ? estimateStringPixelLength(subLine, textBlock.fontSize, textBlock.fontWidthToHeightRatio)\n : getPreciseStringLengthPx(subLine, textBlock.fontFamily, textBlock.fontSize)\n\n if (subLinePx <= width) {\n lines.push(subLine.trim())\n line = line.substring(breakIndex)\n break\n }\n breakIndex--\n }\n } else {\n break\n }\n }\n }\n\n if (i === words.length - 1) lines.push(line.trim())\n }\n\n return lines\n }).flat()\n}\n\n/**\n * Wraps a text or array of texts to fit within specified width and height, if provided.\n *\n * @export\n * @param {UnovisText | UnovisText[]} text - The text or array of texts to wrap.\n * @param {number | undefined} [width=undefined] - The maximum width of a line in pixels.\n * @param {boolean} [fastMode=true] - Whether to use a fast estimation method or a more accurate one.\n * @param {string | string[]} [separator] - The word separators.\n * @returns {UnovisWrappedText[]} - The wrapped texts.\n */\nexport function getWrappedText (\n text: UnovisText | UnovisText[],\n width: number | undefined = undefined,\n height: number | undefined = undefined,\n fastMode = true,\n separator: string | string[] = UNOVIS_TEXT_SEPARATOR_DEFAULT,\n wordBreak = false\n): UnovisWrappedText[] {\n // Merge input text with default values and convert it to an array if it's not already\n const textArrays = Array.isArray(text) ? text.map(t => merge(UNOVIS_TEXT_DEFAULT, t)) : [merge(UNOVIS_TEXT_DEFAULT, text)]\n\n // Break input text into lines based on width and separator\n const textWrapped: Array<string[]> = textArrays.map(block => breakTextIntoLines(block, width, fastMode, separator, wordBreak))\n\n const firstBlock = textArrays[0]\n let h = -firstBlock.fontSize * (firstBlock.lineHeight - 1)\n const blocks: UnovisWrappedText[] = []\n\n // Process each text block and its lines based on height limit\n textArrays.forEach((text, i) => {\n let lines = textWrapped[i]\n\n const prevBlock = i > 0 ? blocks[i - 1] : undefined\n const prevBlockMarginBottomPx = prevBlock ? prevBlock.marginBottom : 0\n const marginTopPx = text.marginTop\n const effectiveMarginPx = Math.max(prevBlockMarginBottomPx, marginTopPx)\n\n h += effectiveMarginPx\n const dh = text.fontSize * text.lineHeight\n // Iterate over lines and handle text overflow based on the height limit if provided\n for (let k = 0; k < lines.length; k += 1) {\n const line = lines[k]\n h += dh\n\n if (height && (h + dh) > height && (k !== lines.length - 1)) {\n const textLengthPx = fastMode\n ? estimateStringPixelLength(line, text.fontSize, text.fontWidthToHeightRatio)\n : getPreciseStringLengthPx(line, text.fontFamily, text.fontSize)\n\n if (textLengthPx < width) {\n lines[k] += ' …'\n } else {\n lines[k] = `${lines[k].substr(0, lines[k].length - 2)}…`\n }\n\n lines = lines.slice(0, k + 1)\n break\n }\n }\n\n // Create wrapped text block with its calculated properties\n blocks.push({ ...text, _lines: lines, _estimatedHeight: h - (prevBlock?._estimatedHeight || 0) })\n })\n\n return blocks\n}\n\n\n/**\n * Renders a text or array of texts to SVG tspan strings.\n *\n * @param {UnovisWrappedText[]} blocks - The wrapped text blocks.\n * @param {number} [x=0] - The x-coordinate for the tspan elements.\n * @param {number} [y] - The y-coordinate for the tspan elements.\n * @returns {string[]} - The SVG tspan strings.\n */\nfunction renderTextToTspanStrings (blocks: UnovisWrappedText[], x = 0, y?: number): string[] {\n return blocks.map((b, i) => {\n const prevBlock = i > 0 ? blocks[i - 1] : undefined\n const prevBlockMarginBottomEm = prevBlock ? prevBlock.marginBottom / prevBlock.fontSize : 0\n const marginTopEm = b.marginTop / b.fontSize\n const marginEm = Math.max(prevBlockMarginBottomEm, marginTopEm)\n const attributes = {\n fontSize: b.fontSize,\n fontFamily: b.fontFamily,\n fill: b.color,\n y: (i === 0) && y,\n }\n\n const attributesString = Object.entries(attributes)\n .filter(([_, value]) => value)\n .map(([key, value]) => `${kebabCase(key)}=\"${escape(value.toString())}\"`)\n .join(' ')\n\n return `<tspan xmlns=\"http://www.w3.org/2000/svg\" ${attributesString}>${b._lines.map((line, k) => {\n let dy: number\n if (i === 0 && k === 0) dy = 0.8 + marginEm\n else if (k === 0) dy = marginEm + b.lineHeight\n else dy = b.lineHeight\n\n return `<tspan x=\"${x}\" dy=\"${dy}em\">${line.length ? line : ' '}</tspan>`\n }).join('')}</tspan>`\n })\n}\n\n/**\n * Estimates the height of wrapped text blocks.\n *\n * @export\n * @param {UnovisWrappedText[]} blocks - The wrapped text blocks.\n * @returns {number} - The estimated height of the wrapped text blocks.\n */\nexport function estimateWrappedTextHeight (blocks: UnovisWrappedText[]): number {\n return sum(blocks, b => b._estimatedHeight)\n}\n\n/**\n * Renders a text or array of texts to an SVG text element.\n * Calling this function will replace the contents of the specified SVG text element.\n *\n * @export\n * @param {SVGTextElement} textElement - The SVG text element to render the text into.\n * @param {UnovisText | UnovisText[]} text - The text or array of texts to render.\n * @param {UnovisTextOptions} options - The text options.\n */\nexport function renderTextToSvgTextElement (\n textElement: SVGTextElement,\n text: UnovisText | UnovisText[],\n options: UnovisTextOptions\n): void {\n const wrappedText = getWrappedText(text, options.width, undefined, options.fastMode, options.separator, options.wordBreak)\n const textElementX = +textElement.getAttribute('x')\n const textElementY = +textElement.getAttribute('y')\n const x = textElementX ?? 0\n let y = textElementY ?? 0\n if (options.textAlign) textElement.setAttribute('text-anchor', getTextAnchorFromTextAlign(options.textAlign))\n if (options.verticalAlign && options.verticalAlign !== VerticalAlign.Top) {\n const height = estimateWrappedTextHeight(wrappedText)\n const dy = options.verticalAlign === VerticalAlign.Middle ? -height / 2\n : options.verticalAlign === VerticalAlign.Bottom ? -height : 0\n\n y += dy\n }\n\n const parser = new DOMParser()\n textElement.textContent = ''\n wrappedText.forEach(block => {\n const svgCode = renderTextToTspanStrings([block], x, y).join('')\n const parsedSvgCode = parser.parseFromString(svgCode, 'image/svg+xml').firstChild\n textElement.appendChild(parsedSvgCode)\n })\n}\n\n/**\n * Renders a text or array of texts into a frame.\n * Calling this function will replace the contents of the specified SVG group.\n *\n * @export\n * @param {SVGGElement} group - The SVG group element to render the text into.\n * @param {UnovisText | UnovisText[]} text - The text or array of texts to render.\n * @param {UnovisTextFrameOptions} frameOptions - The text frame options.\n */\nexport function renderTextIntoFrame (\n group: SVGGElement,\n text: UnovisText | UnovisText[],\n frameOptions: UnovisTextFrameOptions\n): void {\n const wrappedText = getWrappedText(text, frameOptions.width, frameOptions.height, frameOptions.fastMode, frameOptions.separator, frameOptions.wordBreak)\n\n const x = frameOptions.textAlign === TextAlign.Center ? frameOptions.width / 2\n : frameOptions.textAlign === TextAlign.Right ? frameOptions.width : 0\n\n let y = 0\n const height = estimateWrappedTextHeight(wrappedText)\n if (frameOptions.height && height < frameOptions.height) {\n const height = estimateWrappedTextHeight(wrappedText)\n const dh = frameOptions.height - height\n y = frameOptions.verticalAlign === VerticalAlign.Middle ? dh / 2\n : frameOptions.verticalAlign === VerticalAlign.Bottom ? dh : 0\n }\n\n const translate = (frameOptions.x || frameOptions.y)\n ? `transform=\"translate(${frameOptions.x ?? 0},${frameOptions.y ?? 0})\"`\n : ''\n\n const svgCode =\n `<text\n xmlns=\"http://www.w3.org/2000/svg\"\n text-anchor=\"${getTextAnchorFromTextAlign(frameOptions.textAlign)}\"\n ${translate}\n >\n ${renderTextToTspanStrings(wrappedText, x, y).join('')}\n </text>`\n\n const parser = new DOMParser()\n const parsedSvgCode = parser.parseFromString(svgCode, 'image/svg+xml').firstChild\n\n group.textContent = ''\n group.appendChild(parsedSvgCode)\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"text.js","sources":["../../src/utils/text.ts"],"sourcesContent":["import { Selection } from 'd3-selection'\nimport { sum } from 'd3-array'\n\n// Types\nimport { TextAlign, TrimMode, UnovisText, UnovisTextFrameOptions, UnovisTextOptions, UnovisWrappedText, VerticalAlign } from 'types/text'\n\n// Utils\nimport { flatten, isArray, merge } from 'utils/data'\nimport { getTextAnchorFromTextAlign } from 'types/svg'\n\n// Styles\nimport { getFontWidthToHeightRatio, UNOVIS_TEXT_DEFAULT, UNOVIS_TEXT_SEPARATOR_DEFAULT, UNOVIS_TEXT_HYPHEN_CHARACTER_DEFAULT } from 'styles/index'\n\n/**\n * Converts a kebab-case string to camelCase.\n *\n * @param {string} str - The kebab-case string to be converted.\n * @returns {string} The resulting camelCase string.\n */\nexport function kebabCaseToCamel (str: string): string {\n return str.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase())\n}\n\n/**\n * Converts a given string to kebab-case.\n * @param {string} str - The input string to be converted to kebab-case.\n * @returns {string} - The kebab-cased string.\n */\nexport function kebabCase (str: string): string {\n return str.match(/[A-Z]{2,}(?=[A-Z][a-z0-9]*|\\b)|[A-Z]?[a-z0-9]*|[A-Z]|[0-9]+/g)\n ?.filter(Boolean)\n .map(x => x.toLowerCase())\n .join('-')\n}\n\n/**\n * Trims the input string from the start, leaving only the specified maximum length.\n * @param {string} [str=''] - The input string to be trimmed.\n * @param {number} [maxLength=15] - The maximum allowed length of the trimmed string.\n * @returns {string} - The trimmed string.\n */\nexport function trimStringStart (str = '', maxLength = 15): string {\n return str.length > maxLength ? `…${str.substr(str.length - maxLength, maxLength)}` : str\n}\n\n/**\n * Trims the input string from the middle, leaving only the specified maximum length.\n * @param {string} [str=''] - The input string to be trimmed.\n * @param {number} [maxLength=15] - The maximum allowed length of the trimmed string.\n * @returns {string} - The trimmed string.\n */\nexport function trimStringMiddle (str = '', maxLength = 15): string {\n const dist = Math.floor((maxLength - 3) / 2)\n return str.length > maxLength ? `${str.substr(0, dist)}…${str.substr(-dist, dist)}` : str\n}\n\n/**\n * Trims the input string from the end, leaving only the specified maximum length.\n * @param {string} [str=''] - The input string to be trimmed.\n * @param {number} [maxLength=15] - The maximum allowed length of the trimmed string.\n * @returns {string} - The trimmed string.\n */\nexport function trimStringEnd (str = '', maxLength = 15): string {\n return str.length > maxLength ? `${str.substr(0, maxLength)}…` : str\n}\n\n/**\n * Trims the input string according to the specified trim mode.\n * @param {string} [str=''] - The input string to be trimmed.\n * @param {number} [length=15] - The maximum allowed length of the trimmed string.\n * @param {TrimMode} [type=TrimMode.Middle] - The trim mode to be applied.\n * @returns {string} - The trimmed string.\n */\nexport function trimString (str = '', length = 15, type = TrimMode.Middle): string {\n let result = trimStringEnd(str, length)\n if (type === TrimMode.Start) result = trimStringStart(str, length)\n else if (type === TrimMode.Middle) result = trimStringMiddle(str, length)\n return result\n}\n\n/**\n * Splits the input string according to the specified separators.\n * @param {string} text - The input string to be split.\n * @param {string[]} [separators=[' ']] - The array of separators to be used for splitting.\n * @returns {string[]} - The array of split words.\n */\nexport function splitString (text: string, separators = [' ']): string[] {\n let result = [text] as any[]\n for (let i = 0; i < separators.length; i++) {\n const sep = separators[i]\n result.forEach((d, id) => {\n const separated = d.split(sep)\n const words = separated.map((word, j) => `${word}${j === separated.length - 1 ? '' : sep}`)\n result[id] = words\n })\n result = flatten(result)\n }\n\n return result\n}\n\n/**\n * Wraps an SVG text element to fit within the specified width.\n * @param {Selection<SVGTextElement, any, SVGElement, any>} textElement - The SVG text element to be wrapped.\n * @param {number} width - The maximum allowed width for the text element.\n * @param {(string | string[])} [separator=[' ', '-', '.', ',']] - The separator(s) to be used for wrapping.\n */\nexport function wrapSVGText (\n textElement: Selection<SVGTextElement, any, SVGElement, any>,\n width: number,\n separator: string | string[] = [' ', '-', '.', ',']\n): void {\n const text = textElement.text()\n if (!text) return\n\n // Wrap\n const separators = (isArray(separator) ? separator : [separator]) as string[]\n const words = splitString(text, separators)\n const x = parseFloat(textElement.attr('x')) || 0\n\n textElement.text('')\n let tspan = textElement.append('tspan').attr('x', x)\n let tspanContent = `${words[0]}`\n tspan.text(tspanContent)\n\n words.forEach((word, i) => {\n if (i === 0) return\n\n const tspanText = `${tspanContent}${word}`\n tspan.text(tspanText)\n const tspanWidth = tspan.node().getComputedTextLength()\n if (tspanWidth > width) {\n tspan.text(tspanContent.trim())\n\n tspan = textElement.append('tspan')\n .attr('x', x)\n .attr('dy', '1.2em')\n .text(word)\n\n tspanContent = word\n } else tspanContent += word\n })\n}\n\n/**\n * Trims an SVG text element based on the specified max width, trim type, and other options.\n * @param {Selection<SVGTextElement, any, SVGElement, any>} svgTextSelection - The D3 selection of the SVG text element to be trimmed.\n * @param {number} [maxWidth=50] - The maximum width of the text element.\n * @param {TrimMode} [trimType=TrimMode.Middle] - The type of trim (start, middle, or end).\n * @param {boolean} [fastMode=true] - Whether to use a fast estimation method for text length calculation.\n * @param {number} [fontSize=0] - The font size of the text.\n * @param {number} [fontWidthToHeightRatio=getFontWidthToHeightRatio()] - The font width to height ratio.\n * @returns {boolean} True if the text was trimmed, false otherwise.\n */\nexport function trimSVGText (\n svgTextSelection: Selection<SVGTextElement, any, SVGElement, any>,\n maxWidth = 50,\n trimType = TrimMode.Middle,\n fastMode = true,\n fontSize = +window.getComputedStyle(svgTextSelection.node())?.fontSize || 0,\n fontWidthToHeightRatio = getFontWidthToHeightRatio()\n): boolean {\n const text = svgTextSelection.text()\n const textLength = text.length\n\n const textWidth = fastMode ? fontSize * textLength * fontWidthToHeightRatio : svgTextSelection.node().getComputedTextLength()\n const tolerance = 1.1\n const maxCharacters = Math.ceil(textLength * maxWidth / (tolerance * textWidth))\n if (maxCharacters < textLength) {\n svgTextSelection.text(trimString(text, maxCharacters, trimType))\n return true\n }\n\n return false\n}\n\n/**\n * Estimates the length of a string in pixels.\n * @param {string} str - The string to be measured.\n * @param {number} fontSize - The font size of the string.\n * @param {number} [fontWidthToHeightRatio=getFontWidthToHeightRatio()] - The font width to height ratio.\n * @returns {number} The estimated length of the string in pixels.\n */\nexport function estimateStringPixelLength (\n str: string,\n fontSize: number,\n fontWidthToHeightRatio = getFontWidthToHeightRatio()\n): number {\n return str.length * fontSize * fontWidthToHeightRatio || 0\n}\n\n/**\n * Calculates the precise length of a string in pixels.\n * @param {string} str - The string to be measured.\n * @param {string} [fontFamily] - The font family of the string.\n * @param {(string | number)} [fontSize] - The font size of the string.\n * @returns {number} The precise length of the string in pixels.\n */\nexport function getPreciseStringLengthPx (str: string, fontFamily?: string, fontSize?: string | number): number {\n const svgNS = 'http://www.w3.org/2000/svg'\n const svg = document.createElementNS(svgNS, 'svg')\n const text = document.createElementNS(svgNS, 'text')\n\n text.textContent = str\n text.setAttribute('font-size', `${fontSize}`)\n text.setAttribute('font-family', fontFamily)\n\n svg.appendChild(text)\n document.body.appendChild(svg)\n const length = text.getComputedTextLength()\n document.body.removeChild(svg)\n\n return length\n}\n\n/**\n * Estimates the dimensions of an SVG text element.\n *\n * @export\n * @param {Selection<SVGTextElement, any, SVGElement, any>} svgTextSelection - The D3 selection of the SVG text element.\n * @param {number} fontSize - The font size.\n * @param {number} [dy=0.32] - The line height scaling factor.\n * @param {boolean} [fastMode=true] - Whether to use a fast estimation method or a more accurate one.\n * @param {number} [fontWidthToHeightRatio] - The font width-to-height ratio.\n * @returns {{width: number, height: number}} - The estimated dimensions of the text element.\n */\nexport function estimateTextSize (\n svgTextSelection: Selection<SVGTextElement, any, SVGElement, any>,\n fontSize: number,\n dy = 0.32,\n fastMode = true,\n fontWidthToHeightRatio?: number\n): { width: number; height: number } {\n fontWidthToHeightRatio = fontWidthToHeightRatio || getFontWidthToHeightRatio()\n const tspanSelection = svgTextSelection.selectAll('tspan')\n\n const lines = tspanSelection.size() || 1\n const height = svgTextSelection.text() ? 0.85 * fontSize * lines * (1 + dy) - dy : 0\n\n let width = 0\n if (tspanSelection.empty()) {\n const textLength = svgTextSelection.text().length\n width = fastMode ? fontSize * textLength * fontWidthToHeightRatio : svgTextSelection.node().getComputedTextLength()\n } else {\n for (const tspan of tspanSelection.nodes()) {\n const tspanTextLength = (tspan as SVGTSpanElement).textContent.length\n const w = fastMode ? fontSize * tspanTextLength * fontWidthToHeightRatio : (tspan as SVGTSpanElement).getComputedTextLength()\n if (w > width) width = w\n }\n }\n\n return { width, height }\n}\n\n/**\n * Breaks a text block into lines based on the specified width.\n *\n * @param {UnovisText} textBlock - The text block to break into lines.\n * @param {number | undefined} [width=undefined] - The maximum width of a line in pixels.\n * @param {(number | undefined)} [height=undefined] - The height limit for the wrapped text in pixels.\n * @param {boolean} [fastMode=true] - Whether to use a fast estimation method or a more accurate one.\n * @param {string | string[]} [separator] - The word separators.\n * @returns {string[]} - The text split into lines.\n */\nfunction breakTextIntoLines (\n textBlock: UnovisText,\n width: number | undefined = undefined,\n fastMode = true,\n separator: string | string[] = UNOVIS_TEXT_SEPARATOR_DEFAULT,\n wordBreak = false\n): string[] {\n const text = `${textBlock.text}`\n if (!text) return []\n const separators = Array.isArray(separator) ? separator : [separator]\n\n const splitByNewLine = text.split('\\n')\n return splitByNewLine.map((str) => {\n const lines: string[] = []\n if (!width) return [str]\n\n const words = splitString(str, separators)\n let line = ''\n for (let i = 0; i < words.length; i += 1) {\n const textLengthPx = fastMode\n ? estimateStringPixelLength(line + words[i], textBlock.fontSize, textBlock.fontWidthToHeightRatio)\n : getPreciseStringLengthPx(line + words[i], textBlock.fontFamily, textBlock.fontSize)\n\n if (textLengthPx < width || i === 0) {\n line += words[i]\n } else {\n lines.push(line.trim())\n line = words[i]\n }\n\n // Word break functionality\n if (wordBreak) {\n while (line.length > 0) {\n const subLineLengthPx = fastMode\n ? estimateStringPixelLength(line, textBlock.fontSize, textBlock.fontWidthToHeightRatio)\n : getPreciseStringLengthPx(line, textBlock.fontFamily, textBlock.fontSize)\n\n if (subLineLengthPx > width) {\n let breakIndex = (line.trim()).length - 2 // Place at least 2 characters onto the next line\n while (breakIndex > 0) {\n const subLine = `${line.substring(0, breakIndex)}${UNOVIS_TEXT_HYPHEN_CHARACTER_DEFAULT}` // Use hyphen when force breaking words\n const subLinePx = fastMode\n ? estimateStringPixelLength(subLine, textBlock.fontSize, textBlock.fontWidthToHeightRatio)\n : getPreciseStringLengthPx(subLine, textBlock.fontFamily, textBlock.fontSize)\n\n if (subLinePx <= width) {\n lines.push(subLine.trim())\n line = line.substring(breakIndex)\n break\n }\n breakIndex--\n }\n } else {\n break\n }\n }\n }\n\n if (i === words.length - 1) lines.push(line.trim())\n }\n\n return lines\n }).flat()\n}\n\n/**\n * Wraps a text or array of texts to fit within specified width and height, if provided.\n *\n * @export\n * @param {UnovisText | UnovisText[]} text - The text or array of texts to wrap.\n * @param {number | undefined} [width=undefined] - The maximum width of a line in pixels.\n * @param {boolean} [fastMode=true] - Whether to use a fast estimation method or a more accurate one.\n * @param {string | string[]} [separator] - The word separators.\n * @returns {UnovisWrappedText[]} - The wrapped texts.\n */\nexport function getWrappedText (\n text: UnovisText | UnovisText[],\n width: number | undefined = undefined,\n height: number | undefined = undefined,\n fastMode = true,\n separator: string | string[] = UNOVIS_TEXT_SEPARATOR_DEFAULT,\n wordBreak = false\n): UnovisWrappedText[] {\n // Merge input text with default values and convert it to an array if it's not already\n const textArrays = Array.isArray(text) ? text.map(t => merge(UNOVIS_TEXT_DEFAULT, t)) : [merge(UNOVIS_TEXT_DEFAULT, text)]\n\n // Break input text into lines based on width and separator\n const textWrapped: Array<string[]> = textArrays.map(block => breakTextIntoLines(block, width, fastMode, separator, wordBreak))\n\n const firstBlock = textArrays[0]\n let h = -firstBlock.fontSize * (firstBlock.lineHeight - 1)\n const blocks: UnovisWrappedText[] = []\n\n // Process each text block and its lines based on height limit\n textArrays.forEach((text, i) => {\n let lines = textWrapped[i]\n\n const prevBlock = i > 0 ? blocks[i - 1] : undefined\n const prevBlockMarginBottomPx = prevBlock ? prevBlock.marginBottom : 0\n const marginTopPx = text.marginTop\n const effectiveMarginPx = Math.max(prevBlockMarginBottomPx, marginTopPx)\n\n h += effectiveMarginPx\n const dh = text.fontSize * text.lineHeight\n // Iterate over lines and handle text overflow based on the height limit if provided\n for (let k = 0; k < lines.length; k += 1) {\n let line = lines[k]\n h += dh\n\n if (height && (h + dh) > height && (k !== lines.length - 1)) {\n // Remove hyphen character from the end of the line if it's there\n const lastCharacter = line.charAt(line.length - 1)\n if (lastCharacter === UNOVIS_TEXT_HYPHEN_CHARACTER_DEFAULT) {\n line = line.substr(0, lines[k].length - 1)\n }\n\n const lineWithEllipsis = `${line} …`\n const textLengthPx = fastMode\n ? estimateStringPixelLength(lineWithEllipsis, text.fontSize, text.fontWidthToHeightRatio)\n : getPreciseStringLengthPx(lineWithEllipsis, text.fontFamily, text.fontSize)\n\n if (textLengthPx < width) {\n lines[k] = lineWithEllipsis\n } else {\n lines[k] = `${lines[k].substr(0, lines[k].length - 2)}…`\n }\n\n lines = lines.slice(0, k + 1)\n break\n }\n }\n\n // Create wrapped text block with its calculated properties\n blocks.push({ ...text, _lines: lines, _estimatedHeight: h - (prevBlock?._estimatedHeight || 0) })\n })\n\n return blocks\n}\n\n\n/**\n * Renders a text or array of texts to SVG tspan strings.\n *\n * @param {UnovisWrappedText[]} blocks - The wrapped text blocks.\n * @param {number} [x=0] - The x-coordinate for the tspan elements.\n * @param {number} [y] - The y-coordinate for the tspan elements.\n * @returns {string[]} - The SVG tspan strings.\n */\nfunction renderTextToTspanStrings (blocks: UnovisWrappedText[], x = 0, y?: number): string[] {\n return blocks.map((b, i) => {\n const prevBlock = i > 0 ? blocks[i - 1] : undefined\n const prevBlockMarginBottomEm = prevBlock ? prevBlock.marginBottom / prevBlock.fontSize : 0\n const marginTopEm = b.marginTop / b.fontSize\n const marginEm = Math.max(prevBlockMarginBottomEm, marginTopEm)\n const attributes = {\n fontSize: b.fontSize,\n fontFamily: b.fontFamily,\n fill: b.color,\n y: (i === 0) && y,\n }\n\n const attributesString = Object.entries(attributes)\n .filter(([_, value]) => value)\n .map(([key, value]) => `${kebabCase(key)}=\"${escape(value.toString())}\"`)\n .join(' ')\n\n return `<tspan xmlns=\"http://www.w3.org/2000/svg\" ${attributesString}>${b._lines.map((line, k) => {\n let dy: number\n if (i === 0 && k === 0) dy = 0.8 + marginEm\n else if (k === 0) dy = marginEm + b.lineHeight\n else dy = b.lineHeight\n\n return `<tspan x=\"${x}\" dy=\"${dy}em\">${line.length ? line : ' '}</tspan>`\n }).join('')}</tspan>`\n })\n}\n\n/**\n * Estimates the height of wrapped text blocks.\n *\n * @export\n * @param {UnovisWrappedText[]} blocks - The wrapped text blocks.\n * @returns {number} - The estimated height of the wrapped text blocks.\n */\nexport function estimateWrappedTextHeight (blocks: UnovisWrappedText[]): number {\n return sum(blocks, b => b._estimatedHeight)\n}\n\n/**\n * Renders a text or array of texts to an SVG text element.\n * Calling this function will replace the contents of the specified SVG text element.\n *\n * @export\n * @param {SVGTextElement} textElement - The SVG text element to render the text into.\n * @param {UnovisText | UnovisText[]} text - The text or array of texts to render.\n * @param {UnovisTextOptions} options - The text options.\n */\nexport function renderTextToSvgTextElement (\n textElement: SVGTextElement,\n text: UnovisText | UnovisText[],\n options: UnovisTextOptions\n): void {\n const wrappedText = getWrappedText(text, options.width, undefined, options.fastMode, options.separator, options.wordBreak)\n const textElementX = +textElement.getAttribute('x')\n const textElementY = +textElement.getAttribute('y')\n const x = textElementX ?? 0\n let y = textElementY ?? 0\n if (options.textAlign) textElement.setAttribute('text-anchor', getTextAnchorFromTextAlign(options.textAlign))\n if (options.verticalAlign && options.verticalAlign !== VerticalAlign.Top) {\n const height = estimateWrappedTextHeight(wrappedText)\n const dy = options.verticalAlign === VerticalAlign.Middle ? -height / 2\n : options.verticalAlign === VerticalAlign.Bottom ? -height : 0\n\n y += dy\n }\n\n const parser = new DOMParser()\n textElement.textContent = ''\n wrappedText.forEach(block => {\n const svgCode = renderTextToTspanStrings([block], x, y).join('')\n const parsedSvgCode = parser.parseFromString(svgCode, 'image/svg+xml').firstChild\n textElement.appendChild(parsedSvgCode)\n })\n}\n\n/**\n * Renders a text or array of texts into a frame.\n * Calling this function will replace the contents of the specified SVG group.\n *\n * @export\n * @param {SVGGElement} group - The SVG group element to render the text into.\n * @param {UnovisText | UnovisText[]} text - The text or array of texts to render.\n * @param {UnovisTextFrameOptions} frameOptions - The text frame options.\n */\nexport function renderTextIntoFrame (\n group: SVGGElement,\n text: UnovisText | UnovisText[],\n frameOptions: UnovisTextFrameOptions\n): void {\n const wrappedText = getWrappedText(text, frameOptions.width, frameOptions.height, frameOptions.fastMode, frameOptions.separator, frameOptions.wordBreak)\n\n const x = frameOptions.textAlign === TextAlign.Center ? frameOptions.width / 2\n : frameOptions.textAlign === TextAlign.Right ? frameOptions.width : 0\n\n let y = 0\n const height = estimateWrappedTextHeight(wrappedText)\n if (frameOptions.height && height < frameOptions.height) {\n const height = estimateWrappedTextHeight(wrappedText)\n const dh = frameOptions.height - height\n y = frameOptions.verticalAlign === VerticalAlign.Middle ? dh / 2\n : frameOptions.verticalAlign === VerticalAlign.Bottom ? dh : 0\n }\n\n const translate = (frameOptions.x || frameOptions.y)\n ? `transform=\"translate(${frameOptions.x ?? 0},${frameOptions.y ?? 0})\"`\n : ''\n\n const svgCode =\n `<text\n xmlns=\"http://www.w3.org/2000/svg\"\n text-anchor=\"${getTextAnchorFromTextAlign(frameOptions.textAlign)}\"\n ${translate}\n >\n ${renderTextToTspanStrings(wrappedText, x, y).join('')}\n </text>`\n\n const parser = new DOMParser()\n const parsedSvgCode = parser.parseFromString(svgCode, 'image/svg+xml').firstChild\n\n group.textContent = ''\n group.appendChild(parsedSvgCode)\n}\n"],"names":[],"mappings":"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"}
|