@atlaskit/editor-common
Version:
A package that contains common classes and components for editor and renderer
113 lines (106 loc) • 4.52 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.isSelectionTableNestedInTable = exports.isPanelNestingTableSupported = exports.isNestedTablesSupported = exports.getPositionAfterTopParentNodeOfType = exports.getParentOfTypeCount = void 0;
var _editorTables = require("@atlaskit/editor-tables");
var _expValEquals = require("@atlaskit/tmp-editor-statsig/exp-val-equals");
/*
* Returns the level of nesting of a given `nodeType` in the current position.
* eg. table > table is nested 1 level, table > table > table is nested 2 levels.
*
* ```typescript
* const nestingLevel = getParentOfTypeCount(schema.nodes.table)(position);
* ```
*/
var getParentOfTypeCount = exports.getParentOfTypeCount = function getParentOfTypeCount(nodeType) {
return function ($pos) {
var count = 0;
// Loop through parent nodes from bottom to top
for (var depth = $pos.depth; depth > 0; depth--) {
var node = $pos.node(depth);
// Count the table nodes
if (node.type === nodeType) {
count++;
}
}
return count;
};
};
/*
* Returns the (absolute) position directly after the top parent node of a given `nodeType` in the current position.
*
* ```typescript
* const nestingLevel = getEndTopParentNodeOfType(schema.nodes.table)(position);
* ```
*/
var getPositionAfterTopParentNodeOfType = exports.getPositionAfterTopParentNodeOfType = function getPositionAfterTopParentNodeOfType(nodeType) {
return function ($pos) {
// Loop through parent nodes from top to bottom
for (var depth = 1; depth <= $pos.depth; depth++) {
var node = $pos.node(depth);
// Count the table nodes
if (node.type === nodeType) {
return $pos.after(depth);
}
}
};
};
/*
* Returns true if the current selection is inside a table nested within a table.
*
* ```typescript
* const isNestedTable = isSelectionTableNestedInTable(state);
* ```
*/
var isSelectionTableNestedInTable = exports.isSelectionTableNestedInTable = function isSelectionTableNestedInTable(state) {
var table = (0, _editorTables.findTable)(state.selection);
if (!table) {
return false;
}
var parent = state.doc.resolve(table.pos).parent;
var nodeTypes = state.schema.nodes;
return [nodeTypes.tableHeader, nodeTypes.tableCell].includes(parent.type);
};
/*
* Returns true if the schema supports nesting tables inside table cells.
* This is determined by checking if table cells can contain table nodes in their content model.
*
* ```typescript
* const supportsNestedTables = isNestedTablesSupported(state.schema);
* ```
*/
var isNestedTablesSupported = exports.isNestedTablesSupported = function isNestedTablesSupported(schema) {
var _tableCell$contentMat, _tableHeader$contentM;
var _schema$nodes = schema.nodes,
table = _schema$nodes.table,
tableCell = _schema$nodes.tableCell,
tableHeader = _schema$nodes.tableHeader;
if (!table || !tableCell || !tableHeader) {
return false;
}
// Check if table cells can contain table nodes by testing their content match
var tableCellCanContainTable = ((_tableCell$contentMat = tableCell.contentMatch.matchType(table)) === null || _tableCell$contentMat === void 0 ? void 0 : _tableCell$contentMat.validEnd) === true;
var tableHeaderCanContainTable = ((_tableHeader$contentM = tableHeader.contentMatch.matchType(table)) === null || _tableHeader$contentM === void 0 ? void 0 : _tableHeader$contentM.validEnd) === true;
return tableCellCanContainTable || tableHeaderCanContainTable;
};
/*
* Returns true if the schema supports nesting a table inside a panel (panel_c1 variant),
* AND the `platform_editor_nest_table_in_panel` experiment is enabled.
*
* ```typescript
* const supportsTableInPanel = isPanelNestingTableSupported(state.schema);
* ```
*/
var isPanelNestingTableSupported = exports.isPanelNestingTableSupported = function isPanelNestingTableSupported(schema) {
var _panel_c1$contentMatc;
var _schema$nodes2 = schema.nodes,
table = _schema$nodes2.table,
panel_c1 = _schema$nodes2.panel_c1;
if (!table || !panel_c1) {
return false;
}
// Confirm the PM schema actually allows table inside panel_c1
var panelC1CanContainTable = ((_panel_c1$contentMatc = panel_c1.contentMatch.matchType(table)) === null || _panel_c1$contentMatc === void 0 ? void 0 : _panel_c1$contentMatc.validEnd) === true;
return panelC1CanContainTable && (0, _expValEquals.expValEquals)('platform_editor_nest_table_in_panel', 'isEnabled', true);
};