Fix issue with large buffers where block delimiters wouldn't be "atomic" when first starting Heynote, before the first edit (#81)

* Increase timeout for parsing the syntax tree when it's done for the first time

* Return the already parsed blocks in the blockState facet from Editor.getBlocks() instead of parsing the syntax tree again.
Make the block extension's getBlocks() method private.
This commit is contained in:
Jonatan Heyman 2023-12-27 12:55:24 +01:00 committed by GitHub
parent 1d2f1645f9
commit eda4981e59
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 5 additions and 7 deletions

View File

@ -13,9 +13,9 @@ import { emptyBlockSelected } from "./select-all.js";
// tracks the size of the first delimiter // tracks the size of the first delimiter
let firstBlockDelimiterSize let firstBlockDelimiterSize
export function getBlocks(state) { function getBlocks(state, timeout=50) {
const blocks = []; const blocks = [];
const tree = ensureSyntaxTree(state, state.doc.length) const tree = ensureSyntaxTree(state, state.doc.length, timeout)
if (tree) { if (tree) {
tree.iterate({ tree.iterate({
enter: (type) => { enter: (type) => {
@ -57,16 +57,14 @@ export function getBlocks(state) {
export const blockState = StateField.define({ export const blockState = StateField.define({
create(state) { create(state) {
return getBlocks(state); return getBlocks(state, 1000);
}, },
update(blocks, transaction) { update(blocks, transaction) {
// if blocks are empty it likely means we didn't get a parsed syntax tree, and then we want to update // if blocks are empty it likely means we didn't get a parsed syntax tree, and then we want to update
// the blocks on all updates (and not just document changes) // the blocks on all updates (and not just document changes)
if (transaction.docChanged || blocks.length === 0) { if (transaction.docChanged || blocks.length === 0) {
//console.log("updating block state", transaction)
return getBlocks(transaction.state); return getBlocks(transaction.state);
} }
//return widgets.map(transaction.changes);
return blocks return blocks
}, },
}) })

View File

@ -8,7 +8,7 @@ import { heynoteDark } from "./theme/dark.js"
import { heynoteBase } from "./theme/base.js" import { heynoteBase } from "./theme/base.js"
import { customSetup } from "./setup.js" import { customSetup } from "./setup.js"
import { heynoteLang } from "./lang-heynote/heynote.js" import { heynoteLang } from "./lang-heynote/heynote.js"
import { noteBlockExtension, blockLineNumbers, getBlocks } from "./block/block.js" import { noteBlockExtension, blockLineNumbers, blockState } from "./block/block.js"
import { heynoteEvent, SET_CONTENT } from "./annotation.js"; import { heynoteEvent, SET_CONTENT } from "./annotation.js";
import { changeCurrentBlockLanguage, triggerCurrenciesLoaded } from "./block/commands.js" import { changeCurrentBlockLanguage, triggerCurrenciesLoaded } from "./block/commands.js"
import { formatBlockContent } from "./block/format-code.js" import { formatBlockContent } from "./block/format-code.js"
@ -128,7 +128,7 @@ export class HeynoteEditor {
} }
getBlocks() { getBlocks() {
return getBlocks(this.view.state) return this.view.state.facet(blockState)
} }
focus() { focus() {