96 lines
2.3 KiB
TypeScript
96 lines
2.3 KiB
TypeScript
import { EditorState } from "prosemirror-state";
|
|
import { CellSelection, isInTable, selectedRect } from "prosemirror-tables";
|
|
|
|
export function getColumnIndex(state: EditorState): number | undefined {
|
|
if (state.selection instanceof CellSelection) {
|
|
if (state.selection.isColSelection()) {
|
|
const rect = selectedRect(state);
|
|
return rect.left;
|
|
}
|
|
}
|
|
|
|
return undefined;
|
|
}
|
|
|
|
export function getRowIndex(state: EditorState): number | undefined {
|
|
if (state.selection instanceof CellSelection) {
|
|
if (state.selection.isRowSelection()) {
|
|
const rect = selectedRect(state);
|
|
return rect.top;
|
|
}
|
|
}
|
|
|
|
return undefined;
|
|
}
|
|
|
|
export function getCellsInColumn(index: number) {
|
|
return (state: EditorState): number[] => {
|
|
if (!isInTable(state)) {
|
|
return [];
|
|
}
|
|
|
|
const rect = selectedRect(state);
|
|
const cells = [];
|
|
|
|
for (let i = index; i < rect.map.map.length; i += rect.map.width) {
|
|
const cell = rect.tableStart + rect.map.map[i];
|
|
cells.push(cell);
|
|
}
|
|
return cells;
|
|
};
|
|
}
|
|
|
|
export function getCellsInRow(index: number) {
|
|
return (state: EditorState): number[] => {
|
|
if (!isInTable(state)) {
|
|
return [];
|
|
}
|
|
|
|
const rect = selectedRect(state);
|
|
const cells = [];
|
|
|
|
for (let i = 0; i < rect.map.width; i += 1) {
|
|
const cell = rect.tableStart + rect.map.map[index * rect.map.width + i];
|
|
cells.push(cell);
|
|
}
|
|
return cells;
|
|
};
|
|
}
|
|
|
|
export function isColumnSelected(index: number) {
|
|
return (state: EditorState): boolean => {
|
|
if (state.selection instanceof CellSelection) {
|
|
if (state.selection.isColSelection()) {
|
|
const rect = selectedRect(state);
|
|
return rect.left <= index && rect.right > index;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
};
|
|
}
|
|
|
|
export function isRowSelected(index: number) {
|
|
return (state: EditorState): boolean => {
|
|
if (state.selection instanceof CellSelection) {
|
|
if (state.selection.isRowSelection()) {
|
|
const rect = selectedRect(state);
|
|
return rect.top <= index && rect.bottom > index;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
};
|
|
}
|
|
|
|
export function isTableSelected(state: EditorState): boolean {
|
|
const rect = selectedRect(state);
|
|
|
|
return (
|
|
rect.top === 0 &&
|
|
rect.left === 0 &&
|
|
rect.bottom === rect.map.height &&
|
|
rect.right === rect.map.width
|
|
);
|
|
}
|