Merge pull request #604 from mathquill/fix.autocmds-eating-op-names
Fix auto-commands eating letters from operator names
diff --git a/src/commands/math/basicSymbols.js b/src/commands/math/basicSymbols.js
index 2cad131..a8578ae 100644
--- a/src/commands/math/basicSymbols.js
+++ b/src/commands/math/basicSymbols.js
@@ -59,26 +59,27 @@
var Letter = P(Variable, function(_, super_) {
_.init = function(ch) { return super_.init.call(this, this.letter = ch); };
_.createLeftOf = function(cursor) {
+ super_.createLeftOf.apply(this, arguments);
var autoCmds = cursor.options.autoCommands, maxLength = autoCmds._maxLength;
if (maxLength > 0) {
// want longest possible autocommand, so join together longest
// sequence of letters
- var str = this.letter, l = cursor[L], i = 1;
- while (l instanceof Letter && i < maxLength) {
+ var str = '', l = this, i = 0;
+ // FIXME: l.ctrlSeq === l.letter checks if first or last in an operator name
+ while (l instanceof Letter && l.ctrlSeq === l.letter && i < maxLength) {
str = l.letter + str, l = l[L], i += 1;
}
// check for an autocommand, going thru substrings longest to shortest
while (str.length) {
if (autoCmds.hasOwnProperty(str)) {
- for (var i = 2, l = cursor[L]; i < str.length; i += 1, l = l[L]);
- Fragment(l, cursor[L]).remove();
+ for (var i = 1, l = this; i < str.length; i += 1, l = l[L]);
+ Fragment(l, this).remove();
cursor[L] = l[L];
return LatexCmds[str](str).createLeftOf(cursor);
}
str = str.slice(1);
}
}
- super_.createLeftOf.apply(this, arguments);
};
_.italicize = function(bool) {
this.isItalic = bool;
diff --git a/test/unit/typing.test.js b/test/unit/typing.test.js
index 3ba3b31..25628ef 100644
--- a/test/unit/typing.test.js
+++ b/test/unit/typing.test.js
@@ -813,6 +813,7 @@
suite('autoCommands', function() {
setup(function() {
MQ.config({
+ autoOperatorNames: 'sin pp',
autoCommands: 'pi tau phi theta Gamma sum prod sqrt nthroot'
});
});
@@ -880,6 +881,13 @@
assertLatex('\\sin\\pi');
});
+ test('has lower "precedence" than operator names', function() {
+ mq.typedText('ppi');
+ assertLatex('\\operatorname{pp}i');
+ mq.keystroke('Left Left').typedText('i');
+ assertLatex('\\pi pi');
+ });
+
test('command contains non-letters', function() {
assert.throws(function() { MQ.config({ autoCommands: 'e1' }); });
});