From f3cbac5226ee8ae699647c41293440e41b6fccc3 Mon Sep 17 00:00:00 2001 From: kotaindah55 Date: Thu, 6 Mar 2025 16:51:46 +0200 Subject: [PATCH] fix: fenced div opening was displayed while it should be hidden Mistake happens when taking docChanged as a parameter. It wasn't always notify there is currently parsing activity. --- src/editor-mode/observer/SelectionObserver.ts | 14 +++++++------- .../state-fields/selectionObserverField.ts | 10 ++++++---- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/editor-mode/observer/SelectionObserver.ts b/src/editor-mode/observer/SelectionObserver.ts index 568d1d4..8530e93 100644 --- a/src/editor-mode/observer/SelectionObserver.ts +++ b/src/editor-mode/observer/SelectionObserver.ts @@ -58,7 +58,7 @@ export class SelectionObserver { * All the methods below should be run inside this. Don't try to run * them separately. */ - startObserve(selection: EditorSelection, docChanged: boolean): void { + startObserve(selection: EditorSelection, isParsing: boolean): void { this.selection = selection; this.checkIndexCache(); this.isObserving = true; @@ -68,18 +68,18 @@ export class SelectionObserver { // At the moment, changed and filter region are only applied to block- // level tokens. if (level == TokenLevel.INLINE) { continue } - this.mapChangedRegion(level, oldSelectedRegion, docChanged); + this.mapChangedRegion(level, oldSelectedRegion, isParsing); this.createFilter(level); } } - restartObserver(selection: EditorSelection, docChanged: boolean): void { + restartObserver(selection: EditorSelection, isParsing: boolean): void { this.selection = selection; this.checkIndexCache(); this.isObserving = true; for (let level = TokenLevel.BLOCK as TokenLevel; level <= TokenLevel.INLINE; level++) { let oldSelectedRegion: Region = []; this.locateSelectedTokens(level); - this.mapChangedRegion(level, oldSelectedRegion, docChanged, true); + this.mapChangedRegion(level, oldSelectedRegion, isParsing, true); this.createFilter(level); } } @@ -225,7 +225,7 @@ export class SelectionObserver { * by a document change. Hence, `mapChangedRegion` comes to map the * token indexes region that should be redrawn. */ - mapChangedRegion(level: TokenLevel, oldSelectedRegion: Region, docChanged: boolean, restart?: boolean): Region { + mapChangedRegion(level: TokenLevel, oldSelectedRegion: Region, isParsing: boolean, restart?: boolean): Region { let reparsedRange = this.parser.reparsedRanges[level], reparsedLength = reparsedRange.changedTo - reparsedRange.initTo, mappedRegion: Region = [], @@ -237,8 +237,8 @@ export class SelectionObserver { : []; } // Don't map the previous selected region when there is actually no - // reparsed tokens. - if (!docChanged || reparsedRange.from == reparsedRange.initTo && !reparsedLength) { + // parsing activity. + if (!isParsing || reparsedRange.from == reparsedRange.initTo && !reparsedLength) { return this.changedRegions[level] = joinRegions(oldSelectedRegion, this.selectedRegions[level]); } // Use either reparsed range or selected region directly when there is no diff --git a/src/editor-mode/state-fields/selectionObserverField.ts b/src/editor-mode/state-fields/selectionObserverField.ts index ea70202..fd01bd5 100644 --- a/src/editor-mode/state-fields/selectionObserverField.ts +++ b/src/editor-mode/state-fields/selectionObserverField.ts @@ -9,10 +9,12 @@ export const selectionObserverField = StateField.define({ return observer; }, update(observer, transaction) { - // Start observer only when the parser was run or the selection was moved. - let selectionMoved = !(transaction.selection && transaction.startState.selection.eq(transaction.selection)); - if (observer.parser.isReparsing || observer.parser.isInitializing || selectionMoved) { - observer.startObserve(transaction.newSelection, transaction.docChanged); + // Start observer only when the parser has run or the selection has been moved. + let selectionMoved = !(transaction.selection && transaction.startState.selection.eq(transaction.selection)), + isParsing = observer.parser.isReparsing || observer.parser.isInitializing; + transaction.isUserEvent("select"); + if (isParsing || selectionMoved) { + observer.startObserve(transaction.newSelection, isParsing); } else { observer.isObserving = false; }