Просмотр исходного кода

improve strategy of Emoji AutoComplete searching

Yuki Takei 8 лет назад
Родитель
Сommit
95bcd5640b
1 измененных файлов с 17 добавлено и 30 удалено
  1. 17 30
      resource/js/components/PageEditor/Editor.js

+ 17 - 30
resource/js/components/PageEditor/Editor.js

@@ -147,58 +147,45 @@ export default class Editor extends React.Component {
   searchEmojiShortnames(term) {
     const maxLength = 12;
 
-    var results = [];
-    var results2 = [];
-    var results3 = [];
-    var results4 = [];
+    let results1 = [], results2 = [], results3 = [], results4 = [];
+    const countLen1 = () => { results1.length; }
+    const countLen2 = () => { countLen1() + results2.length; }
+    const countLen3 = () => { countLen2() + results3.length; }
+    const countLen4 = () => { countLen3() + results4.length; }
     // TODO performance tune
     // when total length of all results is less than `maxLength`
     for (let unicode in emojiStrategy) {
       const data = emojiStrategy[unicode];
 
+      if (maxLength <= countLen1()) { break; }
       // prefix match to shortname
-      if (maxLength <= results.length) {
-        break;
-      }
       else if (data.shortname.indexOf(`:${term}`) > -1) {
-        results.push(data.shortname);
+        results1.push(data.shortname);
         continue;
       }
+      else if (maxLength <= countLen2()) { continue; }
       // partial match to shortname
-      if (maxLength <= results.length) {
-        continue;
-      }
       else if (data.shortname.indexOf(term) > -1) {
         results2.push(data.shortname);
         continue;
       }
-      // partial match to aliases
-      if (maxLength <= results.length + results2.length) {
-        continue;
-      }
-      else if ((data.aliases != null) && (data.aliases.indexOf(term) > -1)) {
+      else if (maxLength <= countLen3()) { continue; }
+      // partial match to elements of aliases
+      else if ((data.aliases != null) && data.aliases.find(elem => elem.indexOf(term) > -1)) {
         results3.push(data.shortname);
         continue;
       }
-      // partial match to keywords
-      if (maxLength <= results.length + results2.length + results3.length) {
-        continue;
-      }
-      else if ((data.keywords != null) && (data.keywords.indexOf(term) > -1)) {
+      else if (maxLength <= countLen4()) { continue; }
+      // partial match to elements of keywords
+      else if ((data.keywords != null) && data.keywords.find(elem => elem.indexOf(term) > -1)) {
         results4.push(data.shortname);
       }
     };
 
-    if (term.length >= 3) {
-        results.sort(function(a,b) { return (a.length > b.length); });
-        results2.sort(function(a,b) { return (a.length > b.length); });
-        results3.sort(function(a,b) { return (a.length > b.length); });
-        results4.sort();
-    }
-    var newResults = results.concat(results2).concat(results3).concat(results4);
-    newResults = newResults.slice(0, maxLength);
+    let results = results1.concat(results2).concat(results3).concat(results4);
+    results = results.slice(0, maxLength);
 
-    return newResults;
+    return results;
   }
 
   /**