<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>JS Bin</title>
</head>
<body>
</body>
</html>
this.MathSON = (function () {
var unicodeToLatex = {
'±': 'pm'
};
var keyToCommand = {
numer: Fraction,
denom: Fraction,
sqrt: SquareRoot,
sup: SupSub,
sub: SupSub
};
function Fraction(cmd) { this.cmd = cmd; }
Fraction.prototype.toLatex = function () {
return [
'\\frac{',
this.cmd.numer.toLatex(),
'}{',
this.cmd.denom.toLatex(),
'}'
].join('');
};
function SquareRoot(cmd) { this.cmd = cmd; }
SquareRoot.prototype.toLatex = function () {
return [
'\\sqrt{',
this.cmd.sqrt.toLatex(),
'}'
].join('');
};
function SupSub(cmd) { this.cmd = cmd; }
SupSub.prototype.toLatex = function () {
return [
'^{',
this.cmd.sup.toLatex(),
'}'
].join('');
};
function MathSON(ops) {
if (!Array.isArray(ops)) throw 'Need Array, got ' + JSON.stringify(ops);
if (!(this instanceof MathSON)) return new MathSON(ops);
this.ops = ops;
}
MathSON.prototype.toLatex = function () {
return this.ops.map(function (op, i, ops) {
// for strings, translate Unicode chars to LaTeX, like ± to \pm
if (typeof op === 'string') {
return op.split('').map(function (ch) {
if (ch in unicodeToLatex) {
return '\\' + unicodeToLatex[ch] + ' ';
}
return ch;
}).join('');
}
// for objects,
if (typeof op === 'object' && op !== null) {
var Command = keyToCommand[Object.keys(op)[0]];
if (Command) {
var cmd = {};
Object.keys(op).forEach(function (key) {
if (/^[a-z]+$/i.test(key)) cmd[key] = MathSON(op[key]);
else if (key.charAt(0) === '$') cmd[key] = op[key];
else throw 'Unexpected key \'' + key + "'";
});
return new Command(cmd).toLatex();
}
}
throw 'Unexpected ' + JSON.stringify(op);
}).join('')
.replace(/ (?![a-z])/ig, '');
};
MathSON.toLatex = function (ops) {
return MathSON(ops).toLatex();
};
return MathSON;
}());
// tests
console.assert(MathSON([{numer: ['1'], denom: ['2']}]).toLatex() === '\\frac{1}{2}');
console.assert(MathSON.toLatex(['x=',
{ numer: ['-b±', { sqrt: ['b', { sup: ['2'] }, '-4ac'] }],
denom: ['2a'] }]) === "x=\\frac{-b\\pm\\sqrt{b^{2}-4ac}}{2a}");
Output
You can jump to the latest bin by adding /latest
to your URL
Keyboard Shortcuts
Shortcut | Action |
---|---|
ctrl + [num] | Toggle nth panel |
ctrl + 0 | Close focused panel |
ctrl + enter | Re-render output. If console visible: run JS in console |
Ctrl + l | Clear the console |
ctrl + / | Toggle comment on selected lines |
ctrl + ] | Indents selected lines |
ctrl + [ | Unindents selected lines |
tab | Code complete & Emmet expand |
ctrl + shift + L | Beautify code in active panel |
ctrl + s | Save & lock current Bin from further changes |
ctrl + shift + s | Open the share options |
ctrl + y | Archive Bin |
Complete list of JS Bin shortcuts |
JS Bin URLs
URL | Action |
---|---|
/ | Show the full rendered output. This content will update in real time as it's updated from the /edit url. |
/edit | Edit the current bin |
/watch | Follow a Code Casting session |
/embed | Create an embeddable version of the bin |
/latest | Load the very latest bin (/latest goes in place of the revision) |
/[username]/last | View the last edited bin for this user |
/[username]/last/edit | Edit the last edited bin for this user |
/[username]/last/watch | Follow the Code Casting session for the latest bin for this user |
/quiet | Remove analytics and edit button from rendered output |
.js | Load only the JavaScript for a bin |
.css | Load only the CSS for a bin |
Except for username prefixed urls, the url may start with http://jsbin.com/abc and the url fragments can be added to the url to view it differently. |