UNPKG

@atlaskit/editor-common

Version:

A package that contains common classes and components for editor and renderer

370 lines (361 loc) • 14.7 kB
// Disable no-re-export rule for entry point files /* eslint-disable @atlaskit/editor/no-re-export */ import { hasParentNodeOfType } from '@atlaskit/editor-prosemirror/utils'; import { hasDocAsParent } from './document'; import { isEmptyParagraph } from './editor-core-utils'; export { shouldAutoLinkifyMatch } from './should-auto-linkify-tld'; export { getAnnotationMarksForPos, canApplyAnnotationOnRange, containsAnyAnnotations, getAnnotationIdsFromRange, getAnnotationInlineNodeTypes, hasAnnotationMark, getRangeInlineNodeNames, isEmptyTextSelection } from './annotation'; export { getExtensionLozengeData } from './macro'; export { /** * @private * @deprecated * * Please use `@atlaskit/editor-common/browser` entry-point instead. */ browser } from './browser'; export { /** * @private * @deprecated * * Please use `@atlaskit/editor-common/error-reporter` entry-point instead. */ ErrorReporter } from './error-reporter'; export { isPastDate, timestampToIsoFormat, timestampToString, timestampToTaskContext, timestampToUTCDate, todayTimestampInUTC } from './date'; export { isElementInTableCell, isTextSelection, isLastItemMediaGroup, setNodeSelection, setTextSelection, setAllSelection, setCellSelection, nonNullable, stepAddsOneOf, stepHasSlice, extractSliceFromStep, isValidPosition, isEmptyParagraph, isInLayoutColumn, removeBlockMarks, filterChildrenBetween } from './editor-core-utils'; export { withImageLoader } from './imageLoader'; export { absoluteBreakoutWidth, calcBreakoutWidth, calcWideWidth, breakoutConsts, calculateBreakoutStyles, calcBreakoutWidthPx, getNextBreakoutMode, getTitle, calcBreakoutWithCustomWidth } from './breakout'; export { /** * @private * @deprecated * * This is only used in editor-core and shouldn't be used anywhere else. * If you do need it please reach out to #cc-editor-lego */ findChangedNodesFromTransaction, /** * @private * @deprecated * * This is only used in editor-core and shouldn't be used anywhere else. * If you do need it please reach out to #cc-editor-lego */ validNode, /** * @private * @deprecated * * This is only used in editor-core and shouldn't be used anywhere else. * If you do need it please reach out to #cc-editor-lego */ validateNodes, isType, isParagraph, isText, isLinkMark, SelectedState, isNodeSelectedOrInRange, isSupportedInParent, isMediaNode, isNodeBeforeMediaNode } from './nodes'; export { pluginFactory } from './plugin-state-factory'; export { getFragmentBackingArray, mapFragment, mapSlice, flatmap, mapChildren } from './slice'; export { walkUpTreeUntil, unwrap, removeNestedEmptyEls, containsClassName, closest, closestElement, parsePx, mapElem, maphElem } from './dom'; export { default as ADFTraversor } from './traversor'; /** * @private * @deprecated * * Use entry-point `@atlaskit/editor-common/utils/analytics` instead */ export { analyticsEventKey, getAnalyticsAppearance, getAnalyticsEditorAppearance, getAnalyticsEventSeverity, SEVERITY } from './analytics'; export { getUnsupportedContentLevelData, UNSUPPORTED_CONTENT_LEVEL_SEVERITY, UNSUPPORTED_CONTENT_LEVEL_SEVERITY_THRESHOLD_DEFAULTS } from './unsupportedContent/get-unsupported-content-level-data'; export { findAndTrackUnsupportedContentNodes } from './track-unsupported-content'; export { /** * @private * @deprecated * * Please use `@atlaskit/editor-common/performance/measure-render` entry-point instead. */ getDistortedDurationMonitor, /** * @private * @deprecated * * Please use `@atlaskit/editor-common/performance/measure-render` entry-point instead. */ measureRender } from './performance/measure-render'; export { startMeasure, stopMeasure, clearMeasure } from './performance/measure'; export { /** * @private * @deprecated * Private API - should not be used. Use `@atlaskit/editor-common/performance/measure-tti` if required. */ measureTTI, /** * @private * @deprecated * Private API - should not be used. Use `@atlaskit/editor-common/performance/measure-tti` if required. */ getTTISeverity, /** * @private * @deprecated * Private API - should not be used. Use `@atlaskit/editor-common/performance/measure-tti` if required. */ TTI_SEVERITY_THRESHOLD_DEFAULTS, /** * @private * @deprecated * Private API - should not be used. Use `@atlaskit/editor-common/performance/measure-tti` if required. */ TTI_FROM_INVOCATION_SEVERITY_THRESHOLD_DEFAULTS } from './performance/measure-tti'; /** * @private * @deprecated * * Private API - should not be used. Use `@atlaskit/editor-common/is-performance-api-available` if required. * */ export { isPerformanceAPIAvailable, isPerformanceObserverAvailable } from './performance/is-performance-api-available'; /** * @private * @deprecated * * Private API - should not be used. Use `@atlaskit/editor-common/performance/navigation` if required. */ export { getResponseEndTime } from './performance/navigation'; export { getExtensionRenderer } from './extension-handler'; export { hasMergedCell, getColumnWidths, calcTableColumnWidths, convertProsemirrorTableNodeToArrayOfRows, isPositionNearTableRow } from './table'; export { createCompareNodes } from './compareNodes'; export { compose } from './compose'; export { isTextInput } from './is-text-input'; // eslint-disable-next-line @repo/internal/deprecations/deprecation-ticket-required -- Ignored via go/ED-25883 /** * @deprecated - [ED-23844] moving to own entry point @atlaskit/editor-common/whitespace */ export { ZERO_WIDTH_SPACE, ZERO_WIDTH_JOINER } from '../whitespace'; export { shouldForceTracking } from './should-force-tracking'; export { getModeFromTheme } from './getModeFromTheme'; export { getPerformanceOptions, startMeasureReactNodeViewRendered, stopMeasureReactNodeViewRendered } from './get-performance-options'; export { sniffUserBrowserExtensions } from './browser-extensions'; export { RenderCountProfiler, PROFILER_KEY } from './profiler/render-count'; export { validateADFEntity, validationErrorHandler } from './validate-using-spec'; export { getShallowPropsDifference, getPropsDifference } from './compare-props'; export { /** * @private * @deprecated * * Private API do not use - if you really need it use `@atlaskit/editor-common/use-component-render-tracking`; */ useComponentRenderTracking } from './performance/hooks/use-component-render-tracking'; /** * @private * @deprecated * * Private API do not use */ export { isOutdatedBrowser } from './outdated-browsers'; export { autoJoinTr } from './prosemirror/autojoin'; export { isReferencedSource, removeConnectedNodes, getChildrenInfo, getNodeName } from './referentiality'; export { getItemCounterDigitsSize, getOrderFromOrderedListNode, resolveOrder, isListNode, isParagraphNode, isListItemNode, isBulletList } from './list'; export { isFromCurrentDomain, LinkMatcher, normalizeUrl, linkifyContent, getLinkDomain, findFilepaths, isLinkInMatches, FILEPATH_REGEXP, DONTLINKIFY_REGEXP, getLinkCreationAnalyticsEvent, canLinkBeCreatedInRange } from './hyperlink'; // prosemirror-history does not export its plugin key export var pmHistoryPluginKey = 'history$'; export { gridTypeForLayout } from './grid'; export { nodesBetweenChanged, getStepRange, isEmptyDocument, hasDocAsParent, bracketTyped, hasVisibleContent, isSelectionEndOfParagraph, getChangedNodes } from './document'; /** * @private * @deprecated * * Use `@atlaskit/editor-common/process-raw-value` entry-point instead. */ export { processRawValue } from './processRawValue'; export { floatingLayouts, isRichMediaInsideOfBlockNode, calculateSnapPoints, alignAttributes, nonWrappedLayouts } from './rich-media-utils'; export { sanitizeNodeForPrivacy } from './filter/privacy-filter'; export { canRenderDatasource, getDatasourceType } from './datasource'; export { filterCommand, isEmptySelectionAtStart, isEmptySelectionAtEnd, insertContentDeleteRange, deleteEmptyParagraphAndMoveBlockUp, insertNewLineWithAnalytics, createNewParagraphAbove, createNewParagraphBelow, createParagraphNear, walkNextNode, walkPrevNode } from './commands'; export { GUTTER_SELECTOR, GUTTER_SIZE_IN_PX, GUTTER_SIZE_MOBILE_IN_PX } from './scroll-gutter'; /** * @private * @deprecated * * Private API - do not use. */ export { getTimeSince } from './performance/get-performance-timing'; export { countNodes } from './count-nodes'; // Ignored via go/ees005 // eslint-disable-next-line @typescript-eslint/no-explicit-any export function shallowEqual() { var obj1 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var obj2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var keys1 = Object.keys(obj1); var keys2 = Object.keys(obj2); return keys1.length === keys2.length && keys1.reduce(function (acc, key) { return acc && obj1[key] === obj2[key]; }, true); } export { inputRuleWithAnalytics, createWrappingJoinRule, createRule } from './input-rules'; export function isSelectionInsideLastNodeInDocument(selection) { var docNode = selection.$anchor.node(0); var rootNode = selection.$anchor.node(1); return docNode.lastChild === rootNode; } export var isInListItem = function isInListItem(state) { return hasParentNodeOfType(state.schema.nodes.listItem)(state.selection); }; /** * Find the farthest node given a condition * @param predicate Function to check the node */ export var findFarthestParentNode = function findFarthestParentNode(predicate) { return function ($pos) { var candidate = null; for (var i = $pos.depth; i > 0; i--) { var node = $pos.node(i); if (predicate(node)) { candidate = { pos: i > 0 ? $pos.before(i) : 0, start: $pos.start(i), depth: i, node: node }; } } return candidate; }; }; export var insideTableCell = function insideTableCell(state) { var _state$schema$nodes = state.schema.nodes, tableCell = _state$schema$nodes.tableCell, tableHeader = _state$schema$nodes.tableHeader; return hasParentNodeOfType([tableCell, tableHeader])(state.selection); }; /** * Traverse the document until an "ancestor" is found. Any nestable block can be an ancestor. */ // Ignored via go/ees005 // eslint-disable-next-line @typescript-eslint/no-explicit-any function findAncestorPosition(doc, pos) { var nestableBlocks = ['blockquote', 'bulletList', 'orderedList']; if (pos.depth === 1) { return pos; } var node = pos.node(pos.depth); var newPos = pos; while (pos.depth >= 1) { pos = doc.resolve(pos.before(pos.depth)); node = pos.node(pos.depth); if (node && nestableBlocks.indexOf(node.type.name) !== -1) { newPos = pos; } } return newPos; } export function checkNodeDown(selection, doc, filter) { var ancestorDepth = findAncestorPosition(doc, selection.$to).depth; // Top level node if (ancestorDepth === 0) { return false; } var res = doc.resolve(selection.$to.after(ancestorDepth)); return res.nodeAfter ? filter(res.nodeAfter) : false; } export var isEmptyNode = function isEmptyNode(schema) { var _schema$nodes = schema.nodes, doc = _schema$nodes.doc, paragraph = _schema$nodes.paragraph, expand = _schema$nodes.expand, codeBlock = _schema$nodes.codeBlock, blockquote = _schema$nodes.blockquote, panel = _schema$nodes.panel, heading = _schema$nodes.heading, listItem = _schema$nodes.listItem, bulletList = _schema$nodes.bulletList, orderedList = _schema$nodes.orderedList, taskList = _schema$nodes.taskList, taskItem = _schema$nodes.taskItem, decisionList = _schema$nodes.decisionList, decisionItem = _schema$nodes.decisionItem, media = _schema$nodes.media, mediaGroup = _schema$nodes.mediaGroup, mediaSingle = _schema$nodes.mediaSingle; var innerIsEmptyNode = function innerIsEmptyNode(node) { switch (node.type) { case media: case mediaGroup: case mediaSingle: return false; case paragraph: case codeBlock: case heading: case taskItem: case decisionItem: return node.content.size === 0; case expand: case blockquote: case panel: case listItem: // Ignored via go/ees005 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion return node.content.size === 2 && innerIsEmptyNode(node.content.firstChild); case bulletList: case orderedList: // Ignored via go/ees005 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion return node.content.size === 4 && innerIsEmptyNode(node.content.firstChild); case taskList: case decisionList: // Ignored via go/ees005 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion return node.content.size === 2 && innerIsEmptyNode(node.content.firstChild); case doc: var isEmpty = true; node.content.forEach(function (child) { isEmpty = isEmpty && innerIsEmptyNode(child); }); return isEmpty; default: return isNodeEmpty(node); } }; return innerIsEmptyNode; }; /** * Checks if a node has any content. Ignores node that only contain empty block nodes. */ export function isNodeEmpty(node) { if (node && node.textContent) { return false; } if (!node || !node.childCount || node.childCount === 1 && isEmptyParagraph(node.firstChild)) { return true; } var block = []; var nonBlock = []; node.forEach(function (child) { child.isInline ? nonBlock.push(child) : block.push(child); }); return !nonBlock.length && !block.filter(function (childNode) { return !!childNode.childCount && !(childNode.childCount === 1 && isEmptyParagraph(childNode.firstChild)) || childNode.isAtom; }).length; } export function isInEmptyLine(state) { var selection = state.selection; var _ref = selection, $cursor = _ref.$cursor, $anchor = _ref.$anchor; if (!$cursor) { return false; } var node = $cursor.node(); if (!node) { return false; } return isEmptyParagraph(node) && hasDocAsParent($anchor); } export { dedupe } from './dedupe'; export { createWrapSelectionTransaction, getWrappingOptions } from './create-wrap-selection-transaction'; export { transformNodeIntoListItem } from './insert-node-into-ordered-list'; export { wrapSelectionIn } from './wrap-selection-in'; export { toJSON, nodeToJSON } from './nodes'; export { calculateToolbarPositionAboveSelection, calculateToolbarPositionTrackHead } from './calculate-toolbar-position'; export { findNodePosByLocalIds } from './nodes-by-localIds'; export { getPageElementCounts } from './page-element-counts'; export { withFeatureFlaggedComponent } from './withFeatureFlaggedComponent';