MathJax をブラウザ外で

ウェブページ上での数式表示のデファクトスタンダードになりそうな MathJax は、独自の TeX パーサを持っているらしい。

MathJax はブラウザのオブジェクトを色々利用しているため、そのままではブラウザと関係のない JavaScript エンジンで動作させられない。
そこで、適当な window オブジェクトを書いて・・・。

var sys = require("sys");
print = sys.print;

/* Emulate document structure. */

function _element()
{
	this.childNodes = [];
	this.appendChild = function (child) {
		this.childNodes.push(child);
	};
}

var _document = {
	getElementById: function () {
	}, 
	childNodes: function () {
	}, 
	createElement: function (name) {
		print("createElement: " + name + "\n");
		return new _element();
	}, 
	getElementsByTagName: function (name) {
		print("getElementsByTagName: " + name + "\n");
		if (name == "head")
		{
			return [new _element];
		}
		else if (name == "script")
		{
			return [];
		}
	}, 
};


function _navigator()
{
	this.vendor = "";
	this.vendorSub = "";
	this.platform = "";
	this.userAgent = "Mozilla/5.0";
}

function _window()
{
	this.document = _document;
	this.navigator = new _navigator();
	
	// mimic Firefox
	this.netscape = 1;
	this.mozPaintCount = 1;
	this.ATTRIBUTE_NODE = 1;
	
	this.MathJax = {};
}


window = new _window();
document = window.document;
navigator = window.navigator;
MathJax = window.MathJax;

var mj = require("./MathJax.js");

//require("./extensions/tex2jax.js");
//require("./extensions/MathEvents.js");
//require("./extensions/MathZoom.js");
//require("./extensions/MathMenu.js");
//require("./extensions/toMathML.js");
require("./extensions/TeX/noErrors.js");
require("./extensions/TeX/noUndefined.js");
require("./extensions/TeX/AMSmath.js");
require("./extensions/TeX/AMSsymbols.js");

require("./jax/input/TeX/config.js");
require("./jax/input/TeX/jax.js");

require("./jax/element/mml/jax.js");

変換させてみる。

s = "x^2_1";

var tex = MathJax.InputJax.TeX;
tex.Startup();

try
{
	var elements = tex.Parse(s).mml();
	print(elements);
}
catch (err)
{
	print(err);
}

print("\ndone");

process.exit();

結果。

msubsup(mi(x),mn(1),mn(2))

他のプログラムに組み込んでウィンドウに描写させようと思ったら、そっちの方が大変そう。