aboutsummaryrefslogtreecommitdiff
path: root/src/client/util/ProsemirrorExampleTransfer.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/util/ProsemirrorExampleTransfer.ts')
-rw-r--r--src/client/util/ProsemirrorExampleTransfer.ts71
1 files changed, 14 insertions, 57 deletions
diff --git a/src/client/util/ProsemirrorExampleTransfer.ts b/src/client/util/ProsemirrorExampleTransfer.ts
index 5016e72c6..9c4b2d3d1 100644
--- a/src/client/util/ProsemirrorExampleTransfer.ts
+++ b/src/client/util/ProsemirrorExampleTransfer.ts
@@ -2,8 +2,8 @@ import { chainCommands, exitCode, joinDown, joinUp, lift, selectParentNode, setB
import { redo, undo } from "prosemirror-history";
import { undoInputRule } from "prosemirror-inputrules";
import { Schema } from "prosemirror-model";
-import { liftListItem, } from "./prosemirrorPatches.js";
-import { splitListItem, wrapInList, sinkListItem } from "prosemirror-schema-list";
+import { liftListItem, sinkListItem } from "./prosemirrorPatches.js";
+import { splitListItem, wrapInList, } from "prosemirror-schema-list";
import { EditorState, Transaction, TextSelection, NodeSelection } from "prosemirror-state";
import { TooltipTextMenu } from "./TooltipTextMenu";
@@ -62,7 +62,7 @@ export default function buildKeymap<S extends Schema<any>>(schema: S, mapKeys?:
return true;
}
return false;
- })
+ });
let cmd = chainCommands(exitCode, (state, dispatch) => {
@@ -93,54 +93,16 @@ export default function buildKeymap<S extends Schema<any>>(schema: S, mapKeys?:
bind("Mod-s", TooltipTextMenu.insertStar);
- let updateOrderedList = (start: number, rangeStart: any, delta: number, tx2: Transaction, forward: boolean) => {
- let bs = rangeStart.attrs.bulletStyle;
- bs + delta > 0 && tx2.setNodeMarkup(start, rangeStart.type, { mapStyle: rangeStart.attrs.mapStyle, bulletStyle: rangeStart.attrs.bulletStyle + delta }, rangeStart.marks);
-
- let brk = false;
- rangeStart.descendants((node: any, offset: any, index: any) => {
+ let updateBullets = (tx2: Transaction) => {
+ tx2.doc.descendants((node: any, offset: any, index: any) => {
if (node.type === schema.nodes.ordered_list || node.type === schema.nodes.list_item) {
- if (!brk && (bs !== node.attrs.bulletStyle || delta > 0 || (forward && bs > 1))) {
- tx2.setNodeMarkup(start + offset + 1, node.type, { mapStyle: node.attrs.mapStyle, bulletStyle: node.attrs.bulletStyle + delta }, node.marks);
- } else {
- brk = true;
- }
+ let path = (tx2.doc.resolve(offset) as any).path;
+ let depth = Array.from(path).reduce((p: number, c: any) => p + (c.hasOwnProperty("type") && (c as any).type === schema.nodes.ordered_list ? 1 : 0), 0);
+ if (node.type === schema.nodes.ordered_list) depth++;
+ tx2.setNodeMarkup(offset, node.type, { mapStyle: node.attrs.mapStyle, bulletStyle: depth }, node.marks);
}
});
- }
-
- let updateBullets = (tx2: Transaction, refStart: number, delta: number) => {
- let i = refStart;
- for (let i = refStart; i >= 0; i--) {
- let testPos = tx2.doc.nodeAt(i);
- if (!testPos) {
- for (let i = refStart + 1; i <= tx2.doc.nodeSize; i++) {
- try {
- let testPos = tx2.doc.nodeAt(i);
- if (testPos && testPos.type === schema.nodes.ordered_list) {
- updateOrderedList(i, testPos, delta, tx2, true);
- break;
- }
- } catch (e) {
- break;
- }
- }
- break;
- }
- if ((testPos.type === schema.nodes.list_item || testPos.type === schema.nodes.ordered_list)) {
- let start = i;
- let preve = i > 0 && tx2.doc.nodeAt(start - 1);
- if (preve && preve.type === schema.nodes.ordered_list) {
- start = start - 1;
- }
- let rangeStart = tx2.doc.nodeAt(start);
- if (rangeStart) {
- updateOrderedList(start, rangeStart, delta, tx2, false);
- }
- break;
- }
- }
- }
+ };
bind("Tab", (state: EditorState<S>, dispatch: (tx: Transaction<S>) => void) => {
@@ -148,8 +110,7 @@ export default function buildKeymap<S extends Schema<any>>(schema: S, mapKeys?:
var range = ref.$from.blockRange(ref.$to);
var marks = state.storedMarks || (state.selection.$to.parentOffset && state.selection.$from.marks());
if (!sinkListItem(schema.nodes.list_item)(state, (tx2: Transaction) => {
- var range = state.selection.$from.blockRange(state.selection.$to);
- updateBullets(tx2, range!.start - 1, 1);
+ updateBullets(tx2);
marks && tx2.ensureMarks([...marks]);
marks && tx2.setStoredMarks([...marks]);
dispatch(tx2);
@@ -157,7 +118,7 @@ export default function buildKeymap<S extends Schema<any>>(schema: S, mapKeys?:
let sxf = state.tr.setSelection(TextSelection.create(state.doc, range!.start, range!.end));
let newstate = state.applyTransaction(sxf);
if (!wrapInList(schema.nodes.ordered_list)(newstate.state, (tx2: Transaction) => {
- updateBullets(tx2, range!.start, 1);
+ updateBullets(tx2);
// when promoting to a list, assume list will format things so don't copy the stored marks.
marks && tx2.ensureMarks([...marks]);
marks && tx2.setStoredMarks([...marks]);
@@ -169,14 +130,10 @@ export default function buildKeymap<S extends Schema<any>>(schema: S, mapKeys?:
});
bind("Shift-Tab", (state: EditorState<S>, dispatch: (tx: Transaction<S>) => void) => {
- var range = state.selection.$from.blockRange(state.selection.$to);
var marks = state.storedMarks || (state.selection.$to.parentOffset && state.selection.$from.marks());
- let tr = state.tr;
-
- if (!liftListItem(schema.nodes.list_item)(tr, (tx2: Transaction) => {
- var range = tx2.selection.$from.blockRange(tx2.selection.$to);
- updateBullets(tx2, range!.start, -1);
+ if (!liftListItem(schema.nodes.list_item)(state.tr, (tx2: Transaction) => {
+ updateBullets(tx2);
marks && tx2.ensureMarks([...marks]);
marks && tx2.setStoredMarks([...marks]);
dispatch(tx2);