Skip welcome & menu and move to editor
Welcome to JS Bin
Load cached copy from
 
<!DOCTYPE html>
<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

Dismiss x
public
Bin info
laughinghanpro
0viewers