diff --git a/src/commands.js b/src/commands.js index 11d91c7c2..3d3d05ddf 100755 --- a/src/commands.js +++ b/src/commands.js @@ -175,11 +175,11 @@ LatexCmds.nthroot = NthRoot; // Round/Square/Curly/Angle Brackets (aka Parens/Brackets/Braces) function Bracket(open, close, cmd, end, replacedFragment) { - MathCommand.call(this, '\\left'+cmd, + MathCommand.call(this, cmd, [''+open+''+close+''], [open, close], replacedFragment); - this.end = '\\right'+end; + this.end = end; } _ = Bracket.prototype = new MathCommand; _.initBlocks = function(replacedFragment) { @@ -202,7 +202,10 @@ LatexCmds.lbrace = CharCmds['{'] = proto(Bracket, function(replacedFragment) { Bracket.call(this, '{', '}', '\\{', '\\}', replacedFragment); }); LatexCmds.langle = LatexCmds.lang = proto(Bracket, function(replacedFragment) { - Bracket.call(this,'⟨','⟩','\\langle ','\\rangle ',replacedFragment); + Bracket.call(this,'⟨','⟩','\\langle ','\\rangle ', replacedFragment); +}); +LatexCmds.lbrack = LatexCmds.lbracket = CharCmds['['] = proto(Bracket, function(replacedFragment) { + Bracket.call(this, '[', ']', '\\[', '\\]', replacedFragment); }); // Closing bracket matching opening bracket above @@ -223,7 +226,10 @@ LatexCmds.rbrace = CharCmds['}'] = proto(CloseBracket, function(replacedFragment CloseBracket.call(this, '{','}','\\{','\\}',replacedFragment); }); LatexCmds.rangle = LatexCmds.rang = proto(CloseBracket, function(replacedFragment) { - CloseBracket.call(this,'⟨','⟩','\\langle ','\\rangle ',replacedFragment); + CloseBracket.call(this,'⟨','⟩','\\langle ','\\rangle ', replacedFragment); +}); +LatexCmds.rbrack = LatexCmds.rbracket = CharCmds[']'] = proto(CloseBracket, function(replacedFragment) { + CloseBracket.call(this, '[', ']', '\\[', '\\]', replacedFragment); }); function Paren(open, close, replacedFragment) { @@ -234,9 +240,6 @@ Paren.prototype = Bracket.prototype; LatexCmds.lparen = CharCmds['('] = proto(Paren, function(replacedFragment) { Paren.call(this, '(', ')', replacedFragment); }); -LatexCmds.lbrack = LatexCmds.lbracket = CharCmds['['] = proto(Paren, function(replacedFragment) { - Paren.call(this, '[', ']', replacedFragment); -}); function CloseParen(open, close, replacedFragment) { CloseBracket.call(this, open, close, open, close, replacedFragment); @@ -246,9 +249,6 @@ CloseParen.prototype = CloseBracket.prototype; LatexCmds.rparen = CharCmds[')'] = proto(CloseParen, function(replacedFragment) { CloseParen.call(this, '(', ')', replacedFragment); }); -LatexCmds.rbrack = LatexCmds.rbracket = CharCmds[']'] = proto(CloseParen, function(replacedFragment) { - CloseParen.call(this, '[', ']', replacedFragment); -}); function Pipes(replacedFragment) { Paren.call(this, '|', '|', replacedFragment); diff --git a/src/cursor.js b/src/cursor.js index 23bb50faa..90a38f40b 100644 --- a/src/cursor.js +++ b/src/cursor.js @@ -190,7 +190,7 @@ _.seek = function(target, pageX, pageY) { }; _.writeLatex = function(latex) { this.deleteSelection(); - latex = ( latex && latex.match(/\\text\{([^{]|\\\{)*\}|\\[a-z]*|[^\s]/ig) ) || 0; + latex = ( latex && latex.match(/\\text\{([^{}]|\\\[{}])*\}|\\[\{\}\[\]]|[\(\)]|\\[a-z]*|[^\s]/ig) ) || 0; (function writeLatexBlock(cursor) { while (latex.length) { var token = latex.shift(); //pop first item @@ -202,10 +202,24 @@ _.writeLatex = function(latex) { cursor.insertNew(cmd).insertAfter(cmd); continue; //skip recursing through children } - else if (token === '\\left' || token === '\\right') { //REMOVEME HACK for parens - token = latex.shift(); - if (token === '\\') - token = latex.shift(); + else if (token === '|') { //treat pipe as VanillaSymbol, unless it's a right pipe, i.e it has + //a previous pipe sibling w/ at least one other intermediate element + var prevPipe = cursor.prev && cursor.prev.prev; + while (prevPipe && (prevPipe.cmd != '|' || !prevPipe.isEmpty())) + prevPipe = prevPipe.prev; + if (prevPipe) { + prevPipe.remove(); + cursor.selectFrom(prevPipe.next); + cursor.show().insertCh(token).insertAfter(cursor.parent.parent); + continue; + } + else { + cmd = new VanillaSymbol(token); + cursor.insertNew(cmd); + } + } + else if ($.inArray(token, ['\\lbrace', '\\{', '\\rbrace', '\\}', '\\langle', '\\lang', '\\rangle', '\\rang', '\\lparen', '(', '\\rparen', ')', '\\lbrack', '\\lbracket', '\\[', '\\rbrack', '\\rbracket', '\\]', '\\lpipe', '\\rpipe']) >= 0) { + token = token.replace(/^\\/, ''); cursor.insertCh(token); cmd = cursor.prev || cursor.parent.parent;