Merge pull request #606 from mathquill/fix.sin-squared
Fix sin^2(x), and sin^2 x as cursor moves through #visual
diff --git a/src/commands/math/basicSymbols.js b/src/commands/math/basicSymbols.js
index 979ae9d..2cad131 100644
--- a/src/commands/math/basicSymbols.js
+++ b/src/commands/math/basicSymbols.js
@@ -123,11 +123,18 @@
last.ctrlSeq += (isBuiltIn ? ' ' : '}');
if (TwoWordOpNames.hasOwnProperty(word)) last[L][L][L].jQ.addClass('mq-last');
if (!shouldOmitPadding(first[L])) first.jQ.addClass('mq-first');
- if (!shouldOmitPadding(last[R]) && !(last[R] instanceof Bracket)) {
- // also omit space between operator name and paren like in sin(x)
- last.jQ.addClass('mq-last');
+ if (!shouldOmitPadding(last[R])) {
if (last[R] instanceof SupSub) {
- last.jQ.addClass('mq-followed-by-supsub');
+ var supsub = last[R]; // XXX monkey-patching, but what's the right thing here?
+ // Have operatorname-specific code in SupSub? A CSS-like language to style the
+ // math tree, but which ignores cursor and selection (which CSS can't)?
+ var respace = supsub.siblingCreated = supsub.siblingDeleted = function() {
+ supsub.jQ.toggleClass('mq-after-operator-name', !(supsub[R] instanceof Bracket));
+ };
+ respace();
+ }
+ else {
+ last.jQ.toggleClass('mq-last', !(last[R] instanceof Bracket));
}
}
diff --git a/src/css/math.less b/src/css/math.less
index 8260cd7..fd828b0 100644
--- a/src/css/math.less
+++ b/src/css/math.less
@@ -216,16 +216,8 @@
var.mq-operator-name.mq-first {
padding-left: .2em;
}
- var.mq-operator-name.mq-last {
+ var.mq-operator-name.mq-last, .mq-supsub.mq-after-operator-name {
padding-right: .2em;
-
- &.mq-followed-by-supsub {
- padding-right: 0;
-
- + .mq-supsub {
- padding-right: .2em;
- }
- }
}
////
diff --git a/test/unit/css.test.js b/test/unit/css.test.js
index b108046..639cdf9 100644
--- a/test/unit/css.test.js
+++ b/test/unit/css.test.js
@@ -81,4 +81,29 @@
$(mq.el()).remove();
});
+
+ test('operator name spacing e.g. sin x', function() {
+ var mq = MathQuill.MathField($('<span></span>').appendTo(mock)[0]);
+
+ mq.typedText('sin');
+ var n = jQuery('#mock var.mq-operator-name:last');
+ assert.equal(n.text(), 'n');
+ assert.ok(!n.is('.mq-last'));
+
+ mq.typedText('x');
+ assert.ok(n.is('.mq-last'));
+
+ mq.keystroke('Left').typedText('(');
+ assert.ok(!n.is('.mq-last'));
+
+ mq.keystroke('Backspace').typedText('^');
+ assert.ok(!n.is('.mq-last'));
+ var supsub = jQuery('#mock .mq-supsub');
+ assert.ok(supsub.is('.mq-after-operator-name'));
+
+ mq.typedText('2').keystroke('Tab').typedText('(');
+ assert.ok(!supsub.is('.mq-after-operator-name'));
+
+ $(mq.el()).empty();
+ });
});
diff --git a/test/visual.html b/test/visual.html
index 1126837..1c6f44f 100644
--- a/test/visual.html
+++ b/test/visual.html
@@ -187,7 +187,7 @@
<tr><td><span class="mathquill-static-math">^{\frac{as}{ }df}</span><td><span>^{\frac{as}{ }df}</span>
<tr><td><span class="mathquill-static-math">e^{i\pi}+1=0</span><td><span>e^{i\pi}+1=0</span>
<tr><td><span class="mathquill-static-math">\sqrt[n]{1}</span><td><span>\sqrt[n]{1}</span>
-<tr><td><span class="mathquill-static-math">\sin^2 x</span></td><td><span>\sin^2 x</span>
+<tr><td><span class="mathquill-static-math">\sin ^2x+\sin ^2\left(x\right)+\sin ^2(x)</span></td><td><span>\sin ^2x+\sin ^2\left(x\right)+\sin ^2(x)</span>
<tr><td><span class="mathquill-static-math">12a\sin b</span></td><td><span>12a\sin b</span>
<tr><td><span class="mathquill-static-math">1a^2 \sin b</span></td><td><span>1a^2 \sin b</span>
<tr><td><span class="mathquill-static-math">a + \sin b</span></td><td><span>a + \sin b</span>