Skip to content
This repository was archived by the owner on Jun 7, 2023. It is now read-only.

Commit 4b7d15a

Browse files
committed
Improve: Queue MathJax renders until its ready.
* The call to queue returns a promise so that you can wait on it if you need to.
1 parent e9a0838 commit 4b7d15a

File tree

3 files changed

+58
-54
lines changed

3 files changed

+58
-54
lines changed

runestone/common/js/runestonebase.js

Lines changed: 55 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,11 @@ export default class RunestoneBase {
7676

7777
}
7878
this.mjelements = [];
79+
let self = this;
80+
this.mjReady = new Promise(function(resolve, reject) {
81+
self.mjresolver = resolve;
82+
});
83+
this.aQueue = new AutoQueue();
7984
this.jsonHeaders = new Headers({
8085
"Content-type": "application/json; charset=utf-8",
8186
Accept: "application/json",
@@ -134,8 +139,7 @@ export default class RunestoneBase {
134139
async postLogMessage(eventInfo) {
135140
var post_return;
136141
let request = new Request(
137-
`${eBookConfig.new_server_prefix}/logger/bookevent`,
138-
{
142+
`${eBookConfig.new_server_prefix}/logger/bookevent`, {
139143
method: "POST",
140144
headers: this.jsonHeaders,
141145
body: JSON.stringify(eventInfo),
@@ -198,8 +202,7 @@ export default class RunestoneBase {
198202
eBookConfig.logLevel > 0
199203
) {
200204
let request = new Request(
201-
`${eBookConfig.new_server_prefix}/logger/runlog`,
202-
{
205+
`${eBookConfig.new_server_prefix}/logger/runlog`, {
203206
method: "POST",
204207
headers: this.jsonHeaders,
205208
body: JSON.stringify(eventInfo),
@@ -248,7 +251,7 @@ export default class RunestoneBase {
248251
) {
249252
// Check if the server has stored answer
250253
let self = this;
251-
this.checkServerComplete = new Promise(function (resolve, reject) {
254+
this.checkServerComplete = new Promise(function(resolve, reject) {
252255
self.csresolver = resolve;
253256
});
254257
if (
@@ -280,8 +283,7 @@ export default class RunestoneBase {
280283
this.assessmentTaken
281284
) {
282285
let request = new Request(
283-
`${eBookConfig.new_server_prefix}/assessment/results`,
284-
{
286+
`${eBookConfig.new_server_prefix}/assessment/results`, {
285287
method: "POST",
286288
body: JSON.stringify(data),
287289
headers: this.jsonHeaders,
@@ -456,13 +458,14 @@ export default class RunestoneBase {
456458
// should wait until defaultPageReady is defined
457459
// If defaultPageReady is not defined then just enqueue the components.
458460
// Once defaultPageReady is defined
459-
if (MathJax.startup && MathJax.startup.defaultPageReady) {
460-
return MathJax.startup.defaultPageReady().then(
461-
async function() {
462-
console.log(`MathJax Ready -- promising a typesetting run for ${component.id}`)
463-
return await MathJax.typesetPromise([component])
464-
}
465-
);
461+
if (MathJax.typesetPromise) {
462+
return this.mjresolver(this.aQueue.enqueue(component))
463+
} else {
464+
console.log(`Waiting on MathJax!! ${MathJax.typesetPromise}`);
465+
console.log(`Runestone Math: ${runestoneMathReady}`)
466+
setTimeout(() => this.queueMathJax(component), 200);
467+
console.log(`Returning mjready promise: ${this.mjReady}`)
468+
return this.mjReady;
466469
}
467470
}
468471
}
@@ -476,49 +479,54 @@ export default class RunestoneBase {
476479
// once mathjax becomes ready then we can drain the queue and continue as usual.
477480

478481
class Queue {
479-
constructor() { this._items = []; }
480-
enqueue(item) { this._items.push(item); }
481-
dequeue() { return this._items.shift(); }
482-
get size() { return this._items.length; }
482+
constructor() { this._items = []; }
483+
enqueue(item) { this._items.push(item); }
484+
dequeue() { return this._items.shift(); }
485+
get size() { return this._items.length; }
483486
}
484487

485488
class AutoQueue extends Queue {
486-
constructor() {
487-
super();
488-
this._pendingPromise = false;
489-
}
489+
constructor() {
490+
super();
491+
this._pendingPromise = false;
492+
}
493+
494+
enqueue(component) {
495+
return new Promise((resolve, reject) => {
496+
super.enqueue({ component, resolve, reject });
497+
this.dequeue();
498+
});
499+
}
490500

491-
enqueue(action) {
492-
return new Promise((resolve, reject) => {
493-
super.enqueue({ action, resolve, reject });
494-
this.dequeue();
495-
});
496-
}
501+
async dequeue() {
502+
if (this._pendingPromise) return false;
497503

498-
async dequeue() {
499-
if (this._pendingPromise) return false;
504+
let item = super.dequeue();
500505

501-
let item = super.dequeue();
506+
if (!item) return false;
502507

503-
if (!item) return false;
508+
try {
509+
this._pendingPromise = true;
504510

505-
try {
506-
this._pendingPromise = true;
511+
let payload = await MathJax.startup.defaultPageReady().then(
512+
async function() {
513+
console.log(`MathJax Ready -- dequeing a typesetting run for ${item.component.id}`)
514+
return await MathJax.typesetPromise([item.component])
515+
}
516+
);
507517

508-
let payload = await item.action(this);
518+
this._pendingPromise = false; item.resolve(payload);
519+
}
520+
catch (e) {
521+
this._pendingPromise = false;
522+
item.reject(e);
523+
} finally {
524+
this.dequeue();
525+
}
509526

510-
this._pendingPromise = false;
511-
item.resolve(payload);
512-
} catch (e) {
513-
this._pendingPromise = false;
514-
item.reject(e);
515-
} finally {
516-
this.dequeue();
527+
return true;
528+
}
517529
}
518530

519-
return true;
520-
}
521-
}
522-
523531

524-
window.RunestoneBase = RunestoneBase;
532+
window.RunestoneBase = RunestoneBase;

runestone/dragndrop/js/dragndrop.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,9 +104,8 @@ export default class DragNDrop extends RunestoneBase {
104104
this.createButtons();
105105
this.checkServer("dragNdrop", true);
106106
self = this;
107-
if (typeof runestoneMathready !== "undefined") {
108-
runestoneMathReady.then(() => self.queueMathJax(self.containerDiv));
109-
}
107+
self.queueMathJax(self.containerDiv);
108+
110109
}
111110
finishSettingUp() {
112111
this.appendReplacementSpans();

runestone/mchoice/js/mchoice.js

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,10 @@ export default class MultipleChoice extends RunestoneBase {
4949
this.createMCForm();
5050
this.addCaption("runestone");
5151
this.checkServer("mChoice", true);
52-
let self = this;
5352
// https://docs.mathjax.org/en/latest/options/startup/startup.html
5453
// https://docs.mathjax.org/en/latest/web/configuration.html#startup-action
5554
// runestoneMathReady is defined in the preamble for all PTX authored books
56-
if (typeof runestoneMathready !== "undefined") {
57-
runestoneMathReady.then(() => self.queueMathJax(self.containerDiv));
58-
}
55+
this.queueMathJax(self.containerDiv);
5956
if (typeof Prism !== "undefined") {
6057
Prism.highlightAllUnder(this.containerDiv);
6158
}

0 commit comments

Comments
 (0)