summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCheng-Han, Wu2016-03-15 11:04:45 +0800
committerCheng-Han, Wu2016-03-15 11:04:45 +0800
commit25dd400708bebf107fb8840c627032d42f52117e (patch)
tree7ef27dc0d3dbaf6ca23db8c5741c27989b4f9a93
parent88e6e8522fd577a7818482c33c4a84ebedc1b4ba (diff)
Improved overall textcomplete performance and more cases and UX handling
-rw-r--r--public/js/index.js70
-rwxr-xr-xpublic/vendor/jquery-textcomplete/jquery.textcomplete.js2
2 files changed, 49 insertions, 23 deletions
diff --git a/public/js/index.js b/public/js/index.js
index ed70bfc4..d780714d 100644
--- a/public/js/index.js
+++ b/public/js/index.js
@@ -2504,23 +2504,30 @@ function checkCursorMenuInner() {
dropdown[0].style.top = top + offsetTop + 'px';
}
+function checkInIndentCode() {
+ // if line starts with tab or four spaces is a code block
+ var line = editor.getLine(editor.getCursor().line);
+ var isIndentCode = ((line.substr(0, 4) === ' ') || (line.substr(0, 1) === '\t'));
+ return isIndentCode;
+}
+
var isInCode = false;
function checkInCode() {
- isInCode = checkAbove();
+ isInCode = checkAbove(matchInCode) || checkInIndentCode();
}
-function checkAbove() {
+function checkAbove(method) {
var cursor = editor.getCursor();
var text = [];
for (var i = 0; i < cursor.line; i++) //contain current line
text.push(editor.getLine(i));
text = text.join('\n') + '\n' + editor.getLine(cursor.line).slice(0, cursor.ch);
//console.log(text);
- return matchInCode(text);
+ return method(text);
}
-function checkBelow() {
+function checkBelow(method) {
var cursor = editor.getCursor();
var count = editor.lineCount();
var text = [];
@@ -2528,7 +2535,7 @@ function checkBelow() {
text.push(editor.getLine(i));
text = editor.getLine(cursor.line).slice(cursor.ch) + '\n' + text.join('\n');
//console.log(text);
- return matchInCode(text);
+ return method(text);
}
function matchInCode(text) {
@@ -2546,6 +2553,29 @@ function matchInCode(text) {
}
}
+var isInContainer = false;
+var isInContainerSyntax = false;
+
+function checkInContainer() {
+ isInContainer = checkAbove(matchInContainer) && !checkInIndentCode();
+}
+
+function checkInContainerSyntax() {
+ // if line starts with :::, it's in container syntax
+ var line = editor.getLine(editor.getCursor().line);
+ isInContainerSyntax = (line.substr(0, 3) === ':::');
+}
+
+function matchInContainer(text) {
+ var match;
+ match = text.match(/:{3,}/g);
+ if (match && match.length % 2) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
$(editor.getInputField())
.textcomplete([
{ // emoji strategy
@@ -2561,7 +2591,6 @@ $(editor.getInputField())
list.push(emoji);
});
callback(list);
- checkCursorMenu();
},
template: function (value) {
return '<img class="emoji" src="' + serverurl + '/vendor/emojify/images/' + value + '.png"></img> ' + value;
@@ -2571,9 +2600,10 @@ $(editor.getInputField())
},
index: 1,
context: function (text) {
- checkCursorMenu();
checkInCode();
- return !isInCode;
+ checkInContainer();
+ checkInContainerSyntax();
+ return !isInCode && !isInContainerSyntax;
}
},
{ // Code block language strategy
@@ -2581,6 +2611,8 @@ $(editor.getInputField())
charts: supportCharts,
match: /(^|\n)```(\w+)$/,
search: function (term, callback) {
+ var line = editor.getLine(editor.getCursor().line);
+ term = line.match(this.match)[2];
var list = [];
$.map(this.langs, function (lang) {
if (lang.indexOf(term) === 0 && lang !== term)
@@ -2591,11 +2623,10 @@ $(editor.getInputField())
list.push(chart);
});
callback(list);
- checkCursorMenu();
},
replace: function (lang) {
var ending = '';
- if (!checkBelow()) {
+ if (!checkBelow(matchInCode)) {
ending = '\n\n```';
}
if (this.langs.indexOf(lang) !== -1)
@@ -2614,7 +2645,6 @@ $(editor.getInputField())
editor.doc.cm.execCommand("goLineUp");
},
context: function (text) {
- checkCursorMenu();
return isInCode;
}
},
@@ -2660,13 +2690,11 @@ $(editor.getInputField())
callback($.map(supportHeaders, function (header) {
return header.search.indexOf(term) === 0 ? header.text : null;
}));
- checkCursorMenu();
},
replace: function (value) {
return '$1' + value;
},
context: function (text) {
- checkCursorMenu();
return !isInCode;
}
},
@@ -2683,13 +2711,11 @@ $(editor.getInputField())
list.push(referral.text);
})
callback(list);
- checkCursorMenu();
},
replace: function (value) {
return '$1' + value;
},
context: function (text) {
- checkCursorMenu();
return !isInCode;
}
},
@@ -2706,13 +2732,11 @@ $(editor.getInputField())
list.push(referral.text);
})
callback(list);
- checkCursorMenu();
},
replace: function (value) {
return '$1' + value;
},
context: function (text) {
- checkCursorMenu();
return !isInCode;
}
},
@@ -2722,13 +2746,11 @@ $(editor.getInputField())
callback($.map(supportReferrals, function (referral) {
return referral.search.indexOf(term) === 0 ? referral.text : null;
}));
- checkCursorMenu();
},
replace: function (value) {
return '$1' + value;
},
context: function (text) {
- checkCursorMenu();
return !isInCode;
}
},
@@ -2738,13 +2760,11 @@ $(editor.getInputField())
callback($.map(supportExternals, function (external) {
return external.search.indexOf(term) === 0 ? external.text : null;
}));
- checkCursorMenu();
},
replace: function (value) {
return '$1' + value;
},
context: function (text) {
- checkCursorMenu();
return !isInCode;
}
}
@@ -2752,11 +2772,16 @@ $(editor.getInputField())
appendTo: $('.cursor-menu')
})
.on({
+ 'textComplete:beforeSearch': function (e) {
+ //NA
+ },
+ 'textComplete:afterSearch': function (e) {
+ checkCursorMenu();
+ },
'textComplete:select': function (e, value, strategy) {
//NA
},
'textComplete:show': function (e) {
- checkCursorMenu();
$(this).data('autocompleting', true);
editor.setOption("extraKeys", {
"Up": function () {
@@ -2776,7 +2801,6 @@ $(editor.getInputField())
},
"Backspace": function () {
editor.doc.cm.execCommand("delCharBefore");
- checkCursorMenu();
}
});
},
diff --git a/public/vendor/jquery-textcomplete/jquery.textcomplete.js b/public/vendor/jquery-textcomplete/jquery.textcomplete.js
index 485214d5..e1d90d0a 100755
--- a/public/vendor/jquery-textcomplete/jquery.textcomplete.js
+++ b/public/vendor/jquery-textcomplete/jquery.textcomplete.js
@@ -202,7 +202,9 @@ if (typeof jQuery === 'undefined') {
// Ignore shift-key, ctrl-key and so on.
if (skipUnchangedTerm && this._term === term) { return; }
this._term = term;
+ this.fire('textComplete:beforeSearch');
this._search.apply(this, searchQuery);
+ this.fire('textComplete:afterSearch');
} else {
this._term = null;
this.dropdown.deactivate();