| /**************************************** | |
| * Input box to type backslash commands | |
| ***************************************/ | |
| var LatexCommandInput = | |
| CharCmds['\\'] = P(MathCommand, function(_, super_) { | |
| _.ctrlSeq = '\\'; | |
| _.replaces = function(replacedFragment) { | |
| this._replacedFragment = replacedFragment.disown(); | |
| this.isEmpty = function() { return false; }; | |
| }; | |
| _.htmlTemplate = '<span class="mq-latex-command-input mq-non-leaf">\\<span>&0</span></span>'; | |
| _.textTemplate = ['\\']; | |
| _.createBlocks = function() { | |
| super_.createBlocks.call(this); | |
| this.ends[L].focus = function() { | |
| this.parent.jQ.addClass('mq-hasCursor'); | |
| if (this.isEmpty()) | |
| this.parent.jQ.removeClass('mq-empty'); | |
| return this; | |
| }; | |
| this.ends[L].blur = function() { | |
| this.parent.jQ.removeClass('mq-hasCursor'); | |
| if (this.isEmpty()) | |
| this.parent.jQ.addClass('mq-empty'); | |
| return this; | |
| }; | |
| this.ends[L].write = function(cursor, ch) { | |
| cursor.show().deleteSelection(); | |
| if (ch.match(/[a-z]/i)) VanillaSymbol(ch).createLeftOf(cursor); | |
| else { | |
| this.parent.renderCommand(cursor); | |
| if (ch !== '\\' || !this.isEmpty()) this.parent.parent.write(cursor, ch); | |
| } | |
| }; | |
| this.ends[L].keystroke = function(key, e, ctrlr) { | |
| if (key === 'Tab' || key === 'Enter' || key === 'Spacebar') { | |
| this.parent.renderCommand(ctrlr.cursor); | |
| e.preventDefault(); | |
| return; | |
| } | |
| return super_.keystroke.apply(this, arguments); | |
| }; | |
| }; | |
| _.createLeftOf = function(cursor) { | |
| super_.createLeftOf.call(this, cursor); | |
| if (this._replacedFragment) { | |
| var el = this.jQ[0]; | |
| this.jQ = | |
| this._replacedFragment.jQ.addClass('mq-blur').bind( | |
| 'mousedown mousemove', //FIXME: is monkey-patching the mousedown and mousemove handlers the right way to do this? | |
| function(e) { | |
| $(e.target = el).trigger(e); | |
| return false; | |
| } | |
| ).insertBefore(this.jQ).add(this.jQ); | |
| } | |
| }; | |
| _.latex = function() { | |
| return '\\' + this.ends[L].latex() + ' '; | |
| }; | |
| _.renderCommand = function(cursor) { | |
| this.jQ = this.jQ.last(); | |
| this.remove(); | |
| if (this[R]) { | |
| cursor.insLeftOf(this[R]); | |
| } else { | |
| cursor.insAtRightEnd(this.parent); | |
| } | |
| var latex = this.ends[L].latex(); | |
| if (!latex) latex = ' '; | |
| var cmd = LatexCmds[latex]; | |
| if (cmd) { | |
| cmd = cmd(latex); | |
| if (this._replacedFragment) cmd.replaces(this._replacedFragment); | |
| cmd.createLeftOf(cursor); | |
| } | |
| else { | |
| cmd = TextBlock(); | |
| cmd.replaces(latex); | |
| cmd.createLeftOf(cursor); | |
| cursor.insRightOf(cmd); | |
| if (this._replacedFragment) | |
| this._replacedFragment.remove(); | |
| } | |
| }; | |
| }); | |