blob: 1b92672151922fc2e2c350a8d15886e336f7a2fd [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/**
* @fileoverview Bridge to MathJax functions from the ChromeVox content script.
*
*/
if (typeof(goog) != 'undefined' && goog.provide) {
goog.provide('cvox.MathJax');
}
if (typeof(goog) != 'undefined' && goog.require) {
goog.require('cvox.Api');
goog.require('cvox.MathJaxExternalUtil');
}
(function() {
/**
* The channel between the page and content script.
* @type {MessageChannel}
*/
var channel_ = new MessageChannel();
/**
* @constructor
*/
cvox.MathJax = function() {
};
/**
* Initializes message channel in Chromevox.
*/
cvox.MathJax.initMessage = function() {
channel_.port1.onmessage = function(evt) {
cvox.MathJax.execMessage(evt.data);
};
window.postMessage('cvox.MathJaxPortSetup', '*', [channel_.port2]);
};
/**
* Post a message to Chromevox.
* @param {string} cmd The command to be executed in Chromevox.
* @param {string} callbackId A string representing the callback id.
* @param {Object<string, *>} args Dictionary of arguments.
*/
cvox.MathJax.postMessage = function(cmd, callbackId, args) {
channel_.port1.postMessage({'cmd': cmd, 'id': callbackId, 'args': args});
};
/**
* Executes a command for an incoming message.
* @param {{cmd: string, id: string, args: string}} msg A
* serializable message.
*/
cvox.MathJax.execMessage = function(msg) {
var args = msg.args;
switch (msg.cmd) {
case 'Active':
cvox.MathJax.isActive(msg.id);
break;
case 'AllJax':
cvox.MathJax.getAllJax(msg.id);
break;
case 'AsciiMathToMml':
cvox.MathJax.asciiMathToMml(msg.id, args.alt, args.id);
break;
case 'InjectScripts':
cvox.MathJax.injectScripts();
break;
case 'ConfWikipedia':
cvox.MathJax.configMediaWiki();
break;
case 'RegSig':
cvox.MathJax.registerSignal(msg.id, args.sig);
break;
case 'TexToMml':
cvox.MathJax.texToMml(msg.id, args.alt, args.id);
break;
}
};
/**
* Compute the MathML representation for all currently available MathJax
* nodes.
* @param {string} callbackId A string representing the callback id.
*/
cvox.MathJax.getAllJax = function(callbackId) {
cvox.MathJaxExternalUtil.getAllJax(
cvox.MathJax.getMathmlCallback_(callbackId));
};
/**
* Registers a callback for a particular Mathjax signal.
* @param {string} callbackId A string representing the callback id.
* @param {string} signal The Mathjax signal on which to fire the callback.
*/
cvox.MathJax.registerSignal = function(callbackId, signal) {
cvox.MathJaxExternalUtil.registerSignal(
cvox.MathJax.getMathmlCallback_(callbackId), signal);
};
/**
* Constructs a callback that posts a string with the MathML representation of
* a MathJax element to ChromeVox.
* @param {string} callbackId A string representing the callback id.
* @return {function(Node, string)} A function taking a Mathml node and an id
* string.
* @private
*/
cvox.MathJax.getMathmlCallback_ = function(callbackId) {
return function(mml, id) {
cvox.MathJax.postMessage('NodeMml', callbackId,
{'mathml': mml, 'elementId': id});
};
};
/**
* Inject a minimalistic MathJax script into a page for LaTeX translation.
*/
cvox.MathJax.injectScripts = function() {
cvox.MathJaxExternalUtil.injectConfigScript();
cvox.MathJaxExternalUtil.injectLoadScript();
};
/**
* Loads configurations for MediaWiki pages (e.g., Wikipedia).
*/
cvox.MathJax.configMediaWiki = function() {
cvox.MathJaxExternalUtil.configMediaWiki();
};
/**
* Translates a LaTeX expressions into a MathML element.
* @param {string} callbackId A string representing the callback id.
* @param {string} tex The LaTeX expression.
* @param {string} cvoxId A string representing the cvox id for the node.
*/
cvox.MathJax.texToMml = function(callbackId, tex, cvoxId) {
cvox.MathJaxExternalUtil.texToMml(
function(mml) {
cvox.MathJax.getMathmlCallback_(callbackId)(mml, cvoxId);
},
tex);
};
/**
* Translates an AsciiMath expression into a MathML element.
* @param {string} callbackId A string representing the callback id.
* @param {string} asciiMath The AsciiMath expression.
* @param {string} cvoxId A string representing the cvox id for the node.
*/
cvox.MathJax.asciiMathToMml = function(callbackId, asciiMath, cvoxId) {
cvox.MathJaxExternalUtil.asciiMathToMml(
function(mml) {
cvox.MathJax.getMathmlCallback_(callbackId)(mml, cvoxId);
},
asciiMath);
};
/**
* Check if MathJax is injected in the page.
* @param {string} callbackId A string representing the callback id.
*/
cvox.MathJax.isActive = function(callbackId) {
cvox.MathJax.postMessage(
'Active', callbackId,
{'status': cvox.MathJaxExternalUtil.isActive()});
};
// Initializing the bridge.
cvox.MathJax.initMessage();
})();