Browse Source

Merge branch 'feature/search2' into develop

oldj 10 years ago
parent
commit
2fa217dc75
6 changed files with 99 additions and 45 deletions
  1. 1 0
      README.md
  2. 1 1
      app/SH3/MacGap/SwitchHosts!-Info.plist
  3. 0 0
      app/SH3/public/js/main.js
  4. 50 40
      app/src/cm_hl.js
  5. 44 3
      app/src/main.js
  6. 3 1
      app/src/ui.js

+ 1 - 0
README.md

@@ -32,6 +32,7 @@ SwitchHosts! 的数据文件在 `~/.SwitchHosts` 目录下,其中 `~/.SwitchHo
 
 ### v3.1
 
+ - 2016-01-15 搜索时增加模糊搜索支持(eg. `go*le` matches `google`)及正则支持(eg. `/go.*le` matches `google`)
  - 2016-01-10 远程方案可以设置自动更新时间。
  - 2015-12-26 实现 Tray 菜单切换、Dock 图标隐藏、方案导入导出等功能。
  - 2015-12-20 从 Electron 切换至 MacGap 。

+ 1 - 1
app/SH3/MacGap/SwitchHosts!-Info.plist

@@ -21,7 +21,7 @@
 	<key>CFBundleSignature</key>
 	<string>????</string>
 	<key>CFBundleVersion</key>
-	<string>2951</string>
+	<string>3022</string>
 	<key>LSApplicationCategoryType</key>
 	<string>public.app-category.developer-tools</string>
 	<key>LSMinimumSystemVersion</key>

File diff suppressed because it is too large
+ 0 - 0
app/SH3/public/js/main.js


+ 50 - 40
app/src/cm_hl.js

@@ -1,49 +1,59 @@
 // CodeMirror, copyright (c) by Marijn Haverbeke and others
 // Distributed under an MIT license: http://codemirror.net/LICENSE
 
-(function (mod) {
-    mod(require("codemirror"));
-})(function (CodeMirror) {
-    "use strict";
-
-    CodeMirror.defineMode('host', function () {
-        function tokenBase(stream) {
-            if (stream.eatSpace()) return null;
-
-            var sol = stream.sol();
-            var ch = stream.next();
-
-            if (ch === '#') {
-                stream.skipToEnd();
-                return 'comment';
-            }
-            if (!stream.string.match(/^\s*([\d\.]+|[\da-f:\.%lo]+)\s+\w/i)) {
-                return 'error';
+exports.init = function (app) {
+
+    (function (mod) {
+        mod(require('codemirror'));
+    })(function (CodeMirror) {
+        'use strict';
+
+        CodeMirror.defineMode('host', function () {
+            function tokenBase(stream) {
+                if (stream.eatSpace()) return null;
+
+                var sol = stream.sol();
+                var ch = stream.next();
+
+                var s = stream.string;
+                var kw = app.search_keyword;
+                var r = app.search_regexp;
+                if ((kw && s.indexOf(kw) > -1) || (r && s.match(r))) {
+                    return 'hl';
+                }
+
+                if (ch === '#') {
+                    stream.skipToEnd();
+                    return 'comment';
+                }
+                if (!s.match(/^\s*([\d\.]+|[\da-f:\.%lo]+)\s+\w/i)) {
+                    return 'error';
+                }
+
+                if (sol && ch.match(/[\w\.:%]/)) {
+                    stream.eatWhile(/[\w\.:%]/);
+                    return 'ip';
+                }
+
+                return null;
             }
 
-            if (sol && ch.match(/[\w\.:%]/)) {
-                stream.eatWhile(/[\w\.:%]/);
-                return 'ip';
+            function tokenize(stream, state) {
+                return (state.tokens[0] || tokenBase)(stream, state);
             }
 
-            return null;
-        }
-
-        function tokenize(stream, state) {
-            return (state.tokens[0] || tokenBase)(stream, state);
-        }
-
-        return {
-            startState: function () {
-                return {tokens: []};
-            },
-            token: function (stream, state) {
-                return tokenize(stream, state);
-            },
-            lineComment: '#'
-        };
-    });
+            return {
+                startState: function () {
+                    return {tokens: []};
+                },
+                token: function (stream, state) {
+                    return tokenize(stream, state);
+                },
+                lineComment: '#'
+            };
+        });
 
-    //CodeMirror.defineMIME('text/x-host', 'host');
+        //CodeMirror.defineMIME('text/x-host', 'host');
 
-});
+    });
+};

+ 44 - 3
app/src/main.js

@@ -70,6 +70,37 @@ var app = new Vue({
             if (host.on) {
                 this.caculateHosts(host);
             }
+        },
+        'search_keyword': function () {
+            this.log('refresh3');
+            var kw = this.search_keyword;
+            this.search_regexp = null;
+
+            // 模糊搜索
+            var r;
+            var m;
+            var flag = [];
+            if ((m = kw.match(/^\/([^\/]+)\/?(\w*)$/))) {
+                if (m[2].indexOf('i') > -1) {
+                    flag.push('i');
+                }
+                if (m[2].indexOf('g') > -1) {
+                    flag.push('g');
+                }
+                try {
+                    r = new RegExp(m[1], flag.join(''));
+                } catch (e) {}
+            } else if (kw.indexOf('*') > -1) {
+                try {
+                    r = new RegExp(kw.replace(/\*/g, '.*'), 'ig');
+                } catch (e) {}
+            }
+            this.search_regexp = r;
+            this.log('kw: ' + kw);
+            this.log('r: ' + r);
+
+            //this.codemirror.refresh();
+            this.onCurrentHostChange();
         }
     },
     methods: {
@@ -365,10 +396,20 @@ var app = new Vue({
         },
 
         mySearch: function (item) {
-            if (!this.search_keyword) return true;
+            var kw = this.search_keyword;
+            var r = this.search_regexp;
+            if (!kw) return true;
+
+            if (item.title.indexOf(kw) > -1 || item.content.indexOf(kw) > -1) {
+                return true;
+            }
+
+            // 模糊搜索
+            if (r && r.test(item.content)) {
+                return true;
+            }
 
-            return item.title.indexOf(this.search_keyword) > -1 ||
-                item.content.indexOf(this.search_keyword) > -1;
+            return false;
         },
 
         checkRefresh: function () {

+ 3 - 1
app/src/ui.js

@@ -7,7 +7,7 @@
 
 var CodeMirror = require('codemirror');
 require('codemirror/mode/shell/shell');
-require('./cm_hl');
+//require('codemirror/addon/mode/overlay');
 
 var my_codemirror;
 
@@ -21,6 +21,8 @@ function resize() {
 
 function init(app) {
 
+    require('./cm_hl').init(app);
+
     $(document).ready(function () {
         var el_textarea = $('#host-code');
         //el_textarea.css('height', window.innerHeight - 8);

Some files were not shown because too many files changed in this diff