Tldraw/packages/tldraw/src/state/shapes/shared/getTextSvgElement.ts

44 wiersze
1.6 KiB
TypeScript

import type { TLBounds } from '@tldraw/core'
import { AlignStyle, StickyShape, TextShape } from '~types'
import { getFontFace, getFontSize } from './shape-styles'
import { getTextAlign } from './getTextAlign'
export function getTextSvgElement(shape: TextShape | StickyShape, bounds: TLBounds) {
const { text, style } = shape
const fontSize = getFontSize(shape.style.size, shape.style.font)
const g = document.createElementNS('http://www.w3.org/2000/svg', 'g')
const LINE_HEIGHT = fontSize * 1.3
const textLines = text.split('\n').map((line, i) => {
const textElm = document.createElementNS('http://www.w3.org/2000/svg', 'text')
textElm.textContent = line
textElm.setAttribute('font-family', getFontFace(style.font))
textElm.setAttribute('font-size', fontSize + 'px')
textElm.setAttribute('text-anchor', 'start')
textElm.setAttribute('alignment-baseline', 'central')
textElm.setAttribute('text-align', getTextAlign(style.textAlign))
textElm.setAttribute('y', LINE_HEIGHT * (0.5 + i) + '')
g.appendChild(textElm)
return textElm
})
if (style.textAlign === AlignStyle.Middle) {
textLines.forEach((textElm) => {
textElm.setAttribute('x', bounds.width / 2 + '')
textElm.setAttribute('text-align', 'center')
textElm.setAttribute('text-anchor', 'middle')
})
} else if (style.textAlign === AlignStyle.End) {
textLines.forEach((textElm) => {
textElm.setAttribute('x', bounds.width + '')
textElm.setAttribute('text-align', 'right')
textElm.setAttribute('text-anchor', 'end')
})
}
return g
}