diff options
Diffstat (limited to 'packages/excalidraw/element/index.ts')
| -rw-r--r-- | packages/excalidraw/element/index.ts | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/packages/excalidraw/element/index.ts b/packages/excalidraw/element/index.ts new file mode 100644 index 0000000..a9b7476 --- /dev/null +++ b/packages/excalidraw/element/index.ts @@ -0,0 +1,122 @@ +import type { + ExcalidrawElement, + NonDeletedExcalidrawElement, + NonDeleted, +} from "./types"; +import { isInvisiblySmallElement } from "./sizeHelpers"; +import { isLinearElementType } from "./typeChecks"; + +export { + newElement, + newTextElement, + refreshTextDimensions, + newLinearElement, + newArrowElement, + newImageElement, + duplicateElement, +} from "./newElement"; +export { + getElementAbsoluteCoords, + getElementBounds, + getCommonBounds, + getDiamondPoints, + getArrowheadPoints, + getClosestElementBounds, +} from "./bounds"; + +export { + OMIT_SIDES_FOR_MULTIPLE_ELEMENTS, + getTransformHandlesFromCoords, + getTransformHandles, +} from "./transformHandles"; +export { + resizeTest, + getCursorForResizingElement, + getElementWithTransformHandleType, + getTransformHandleTypeFromCoords, +} from "./resizeTest"; +export { + transformElements, + getResizeOffsetXY, + getResizeArrowDirection, +} from "./resizeElements"; +export { + dragSelectedElements, + getDragOffsetXY, + dragNewElement, +} from "./dragElements"; +export { isTextElement, isExcalidrawElement } from "./typeChecks"; +export { redrawTextBoundingBox, getTextFromElements } from "./textElement"; +export { + getPerfectElementSize, + getLockedLinearCursorAlignSize, + isInvisiblySmallElement, + resizePerfectLineForNWHandler, + getNormalizedDimensions, +} from "./sizeHelpers"; +export { showSelectedShapeActions } from "./showSelectedShapeActions"; + +/** + * @deprecated unsafe, use hashElementsVersion instead + */ +export const getSceneVersion = (elements: readonly ExcalidrawElement[]) => + elements.reduce((acc, el) => acc + el.version, 0); + +/** + * Hashes elements' versionNonce (using djb2 algo). Order of elements matters. + */ +export const hashElementsVersion = ( + elements: readonly ExcalidrawElement[], +): number => { + let hash = 5381; + for (let i = 0; i < elements.length; i++) { + hash = (hash << 5) + hash + elements[i].versionNonce; + } + return hash >>> 0; // Ensure unsigned 32-bit integer +}; + +// string hash function (using djb2). Not cryptographically secure, use only +// for versioning and such. +export const hashString = (s: string): number => { + let hash: number = 5381; + for (let i = 0; i < s.length; i++) { + const char: number = s.charCodeAt(i); + hash = (hash << 5) + hash + char; + } + return hash >>> 0; // Ensure unsigned 32-bit integer +}; + +export const getVisibleElements = (elements: readonly ExcalidrawElement[]) => + elements.filter( + (el) => !el.isDeleted && !isInvisiblySmallElement(el), + ) as readonly NonDeletedExcalidrawElement[]; + +export const getNonDeletedElements = <T extends ExcalidrawElement>( + elements: readonly T[], +) => + elements.filter((element) => !element.isDeleted) as readonly NonDeleted<T>[]; + +export const isNonDeletedElement = <T extends ExcalidrawElement>( + element: T, +): element is NonDeleted<T> => !element.isDeleted; + +const _clearElements = ( + elements: readonly ExcalidrawElement[], +): ExcalidrawElement[] => + getNonDeletedElements(elements).map((element) => + isLinearElementType(element.type) + ? { ...element, lastCommittedPoint: null } + : element, + ); + +export const clearElementsForDatabase = ( + elements: readonly ExcalidrawElement[], +) => _clearElements(elements); + +export const clearElementsForExport = ( + elements: readonly ExcalidrawElement[], +) => _clearElements(elements); + +export const clearElementsForLocalStorage = ( + elements: readonly ExcalidrawElement[], +) => _clearElements(elements); |
