diff --git a/media/main.js b/media/main.js index fd9379d..16a8817 100644 --- a/media/main.js +++ b/media/main.js @@ -5,18 +5,35 @@ const oldState = vscode.getState(); + let highlight_queue = []; + // Handle messages sent from the extension to the webview window.addEventListener('message', event => { const message = event.data; // The json data that the extension sent switch (message.type) { case 'highlight': - // console.log('Got', message.html, 'for', message.indx); - window.inbox[message.indx].goal_text_highlighted = message.html; - break; case 'highlight_elided': - // console.log('Got', message.html, 'for', message.indx); - window.inbox[message.indx].goal_text_highlighted_elided = message.html; - break; + // Batch highlighting requests; since the highlight information + // is passed through a MessagePort, we can't take advantage of Vue's + // automatic batching, because the messages won't be processed in the same + // tick + highlight_queue.push(message) + break; + case 'flush_highlight': { + let msg; + while (typeof (msg = highlight_queue.shift()) !== 'undefined') { + switch (msg.type) { + case 'highlight': + window.inbox[msg.indx].goal_text_highlighted = msg.html; + break; + case 'highlight_elided': + window.inbox[msg.indx].goal_text_highlighted_elided = msg.html; + break; + default: + break; + } + } + } case 'highlight_inline': $('#' + message.id).html(message.html); break; @@ -1701,6 +1718,7 @@ class="has-tooltip-arrow has-tooltip-bottom" data-tooltip="${attempt_loc_file} ( index: i, value: window.inbox[i].goal_text }); + else window.inbox[i].goal_text_highlighted = '
' + window.inbox[i].goal_text + '
'; @@ -1710,12 +1728,19 @@ class="has-tooltip-arrow has-tooltip-bottom" data-tooltip="${attempt_loc_file} ( index: i, value: window.inbox[i].goal_text_elided }); + else window.inbox[i].goal_text_highlighted_elided = '
' + window.inbox[i].goal_text_elided + '
'; // ///////////////////////////////////////////////////////////////////////////// } + if (window.enable_highlighting) + vscode.postMessage({ + command: 'flush_highlight' + }); + + // ///////////////////////////////////////////////////////////////////////////// $('#message-feed').removeClass('is-hidden'); diff --git a/src/provider.ts b/src/provider.ts index 5b894d0..7e02dd4 100644 --- a/src/provider.ts +++ b/src/provider.ts @@ -70,10 +70,10 @@ export class TraceProvider implements vscode.WebviewViewProvider { this._watcher_target = this._target_dir + "traced.tmp.json"; this._watcher_target_elaborated = this._target_dir + "traced.json"; - shiki.getHighlighter({theme: 'css-variables'}).then(highlighter => { - this._highlighter = highlighter; - this._highlighter.loadLanguage(elpi_lang); - }); + shiki.getHighlighter({theme: 'css-variables', langs: [elpi_lang]}) + .then(highlighter => { + this._highlighter = highlighter; + }); if (os.platform().toString().toLowerCase() == "win32") this._cat = "type"; @@ -105,10 +105,10 @@ export class TraceProvider implements vscode.WebviewViewProvider { { const code = message.value; const indx = message.index; - let html = undefined; - - if (this._highlighter) - html = this._highlighter.codeToHtml(code, { lang: 'elpi' }); + const html = + this._highlighter + ? this._highlighter.codeToHtml(code, { lang: 'elpi' }) + : code; if (this._view) this._view.webview.postMessage({ @@ -123,36 +123,44 @@ export class TraceProvider implements vscode.WebviewViewProvider { { const code = message.value; const indx = message.index; - let html = undefined; - - if (this._highlighter) - html = this._highlighter.codeToHtml(code, { lang: 'elpi' }); - + const html = + this._highlighter + ? this._highlighter.codeToHtml(code, { lang: 'elpi' }) + : code; + if (this._view) this._view.webview.postMessage({ type: 'highlight_elided', html: html, indx: indx }); - + + break; + } + case 'flush_highlight': + { + if (this._view) + this._view.webview.postMessage({ + type: 'flush_highlight' + }) break; } case 'highlight_inline': { const code = message.value; const id = message.id; - let html = undefined; - - if (this._highlighter) - html = this._highlighter.codeToHtml(code, { lang: 'elpi' }); - + const html = + this._highlighter + ? this._highlighter.codeToHtml(code, { lang: 'elpi' }) + : code; + if (this._view) this._view.webview.postMessage({ type: 'highlight_inline', html: html, id: id }); - + break; } case 'notify':