diff --git a/packages/core/src/Tracker.ts b/packages/core/src/Tracker.ts new file mode 100644 index 00000000..e24ebd08 --- /dev/null +++ b/packages/core/src/Tracker.ts @@ -0,0 +1,42 @@ +import { Transaction } from 'prosemirror-state' + +export interface TrackerResult { + position: number, + deleted: boolean, +} + +export class Tracker { + + transaction: Transaction + + currentStep: number + + constructor(transaction: Transaction) { + this.transaction = transaction + this.currentStep = this.transaction.steps.length + } + + map(position: number): TrackerResult { + let deleted = false + + const mappedPosition = this.transaction.steps + .slice(this.currentStep) + .reduce((newPosition, step) => { + const mapResult = step + .getMap() + .mapResult(newPosition) + + if (mapResult.deleted) { + deleted = true + } + + return mapResult.pos + }, position) + + return { + position: mappedPosition, + deleted, + } + } + +} diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index e07c6bf4..aa0f4342 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -3,6 +3,7 @@ export * from './Extension' export * from './Node' export * from './Mark' export * from './NodeView' +export * from './Tracker' export * from './types' export { default as nodeInputRule } from './inputRules/nodeInputRule'