/* -*- Mode: Javascript; indent-tabs-mode:nil; js-indent-level: 2 -*- */ /* vim: set ts=2 et sw=2 tw=80: */ /************************************************************* * * MathJax/extensions/fast-preview.js * * Implements a fast preview using the PreviewHTML output jax * and then a slower update to the more accurate HTML-CSS output * (or whatever the user has selected). * * --------------------------------------------------------------------- * * Copyright (c) 2014-2017 The MathJax Consortium * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ (function (HUB,HTML,BROWSER) { var SETTINGS = HUB.config.menuSettings; var JAX = MathJax.OutputJax; var msieColorBug = BROWSER.isMSIE && (document.documentMode||0) < 8; var FastPreview = MathJax.Extension["fast-preview"] = { version: "2.7.2", enabled: true, // // Configuration for the chunking of the main output // after the previews have been created, and other configuration. // config: HUB.CombineConfig("fast-preview",{ Chunks: {EqnChunk: 10000, EqnChunkFactor: 1, EqnChunkDelay: 0}, color: "inherit!important", updateTime: 30, updateDelay: 6, messageStyle: "none", disabled: BROWSER.isMSIE && !BROWSER.versionAtLeast("8.0") }), // // Ajust the chunking of the output jax // Config: function () { if (HUB.config["CHTML-preview"]) MathJax.Hub.Config({"fast-preview": HUB.config["CHTML-preview"]}); var update, delay, style, done, saved; var config = this.config; if (!config.disabled && SETTINGS.FastPreview == null) HUB.Config({menuSettings:{FastPreview:true}}); if (SETTINGS.FastPreview) { MathJax.Ajax.Styles({".MathJax_Preview .MJXf-math":{color:config.color}}); HUB.Config({"HTML-CSS": config.Chunks, CommonHTML: config.Chunks, SVG: config.Chunks}); } HUB.Register.MessageHook("Begin Math Output",function () { if (!done && FastPreview.Active()) { update = HUB.processUpdateTime; delay = HUB.processUpdateDelay; style = HUB.config.messageStyle; HUB.processUpdateTime = config.updateTime; HUB.processUpdateDelay = config.updateDelay; HUB.Config({messageStyle: config.messageStyle}); MathJax.Message.Clear(0,0); saved = true; } }); HUB.Register.MessageHook("End Math Output",function () { if (!done && saved) { HUB.processUpdateTime = update; HUB.processUpdateDelay = delay; HUB.Config({messageStyle: style}); done = true; } }); }, // // Allow page to override user settings (for things like editor previews) // Disable: function () {this.enabled = false}, Enable: function () {this.enabled = true}, Active: function () { return SETTINGS.FastPreview && this.enabled && !(JAX[SETTINGS.renderer]||{}).noFastPreview; }, // // Insert a preview span, if there isn't one already, // and call the PreviewHTML output jax to create the preview // Preview: function (data) { if (!this.Active() || !data.script.parentNode) return; var preview = data.script.MathJax.preview || data.script.previousSibling; if (!preview || preview.className !== MathJax.Hub.config.preRemoveClass) { preview = HTML.Element("span",{className:MathJax.Hub.config.preRemoveClass}); data.script.parentNode.insertBefore(preview,data.script); data.script.MathJax.preview = preview; } preview.innerHTML = ""; preview.style.color = (msieColorBug ? "black" : "inherit"); return this.postFilter(preview,data); }, postFilter: function (preview,data) { // // Load the PreviewHTML jax if it is not already loaded // if (!data.math.root.toPreviewHTML) { var queue = MathJax.Callback.Queue(); queue.Push( ["Require",MathJax.Ajax,"[MathJax]/jax/output/PreviewHTML/config.js"], ["Require",MathJax.Ajax,"[MathJax]/jax/output/PreviewHTML/jax.js"] ); HUB.RestartAfter(queue.Push({})); } data.math.root.toPreviewHTML(preview); }, // // Hook into the input jax postFilter to create the previews as // the input jax are processed. // Register: function (name) { HUB.Register.StartupHook(name+" Jax Require",function () { var jax = MathJax.InputJax[name]; jax.postfilterHooks.Add(["Preview",MathJax.Extension["fast-preview"]],50); }); } } // // Hook into each input jax // FastPreview.Register("TeX"); FastPreview.Register("MathML"); FastPreview.Register("AsciiMath"); HUB.Register.StartupHook("End Config",["Config",FastPreview]); HUB.Startup.signal.Post("fast-preview Ready"); })(MathJax.Hub,MathJax.HTML,MathJax.Hub.Browser); MathJax.Ajax.loadComplete("[MathJax]/extensions/fast-preview.js");