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.
This commit is contained in:
kotaindah55 2025-03-06 16:51:46 +02:00
parent f4851c55e7
commit f3cbac5226
2 changed files with 13 additions and 11 deletions

View file

@ -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

View file

@ -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;
}