ソースを参照

JSON格式化支持开关配置;获取JSON的方式做优化

zxlie 8 年 前
コミット
9475b55715

+ 1 - 1
chrome/manifest.json

@@ -1,6 +1,6 @@
 {
     "name": "WEB前端助手(FeHelper)",
-    "version": "9.6",
+    "version": "9.8",
     "manifest_version": 2,
 
     "default_locale": "zh_CN",

+ 1 - 1
chrome/online.manifest.json

@@ -1,6 +1,6 @@
 {
     "name": "WEB前端助手(FeHelper)",
-    "version": "9.6",
+    "version": "9.8",
     "manifest_version": 2,
 
     "default_locale": "zh_CN",

+ 1 - 1
chrome/static/js/fe-option.js

@@ -5,7 +5,7 @@
 baidu.feOption = (function () {
 
     // 页面json格式化强制开启
-    var pageJsonMustFormat = true;
+    var pageJsonMustFormat = false;
 
     /**
      * 将这些配置项保存到background-page,这样才能对每个页面生效

+ 61 - 45
chrome/static/js/jsonformat/contentscript-jsonformat.js

@@ -26,43 +26,65 @@ baidu.csJsonFormat = (function () {
 
     /**
      * 从页面提取JSON文本
-     * @return {*}
+     * @returns {string}
      * @private
      */
     var _getJsonText = function () {
-        var pre = $('body>pre:eq(0)')[0] || {textContent: ""};
-        var source = $.trim(pre.textContent);
-        if (!source) {
-            source = $.trim(document.body.textContent || '')
-        }
-        if (!source) {
-            return false;
-        }
 
-        // 如果body的内容还包含HTML标签,肯定不是合法的json了
-        // 如果是合法的json,也只可能有一个text节点
-        var nodes = document.body.childNodes;
-        var newSource = '';
-        for (var i = 0, len = nodes.length; i < len; i++) {
-            if (nodes[i].nodeType == Node.TEXT_NODE) {
-                newSource += nodes[i].textContent;
-            } else if (nodes[i].nodeType == Node.ELEMENT_NODE) {
-                var tagName = nodes[i].tagName.toLowerCase();
-                var html = $.trim(nodes[i].textContent);
-                // 如果是pre标签,则看内容是不是和source一样,一样则continue
-                if (tagName === 'pre' && html === source) {
-                    continue;
-                } else if ((nodes[i].offsetWidth === 0 || nodes[i].offsetHeight === 0 || !html) && ['script','link'].indexOf(tagName) == -1) {
-                    // 如果用户安装迅雷或者其他的插件,也回破坏页面结构,需要兼容一下
-                    continue;
+        var arr = [];
+        var sData = '';
+
+        [].slice.call(document.getElementsByTagName('*')).filter(function (el) {
+            return (el.offsetHeight + el.offsetWidth) > 0;
+        }).forEach(function (elm) {
+            var sT = '';
+            [].slice.call(elm.childNodes).forEach(function (el) {
+                if (el.nodeType === document.TEXT_NODE) {
+                    sT += el.data;
                 } else {
-                    return false;
+                    arr.push(sT);
+                    sT = '';
                 }
-            } else {
-                return false;
+            });
+            sT && arr.push(sT);
+        });
+
+        arr = arr.filter(function (s) {
+            return s.trim();
+        });
+
+        sData = arr[0] || '';
+        arr.forEach(function (item) {
+            try {
+
+                var isJson = false;
+                if (sData) {
+                    if (sData.match(/^\s*[\[\{]/)) {
+                        var oJson = JSON.parse(sData);
+                        if (typeof oJson === 'object') {
+                            isJson = true;
+                        }
+                    } else {
+                        var sTempData = sData.slice(sData.indexOf('(') + 1, sData.lastIndexOf(')'));
+                        if (typeof JSON.parse(sTempData) === 'object') {
+                            isJson = true;
+                            sData = sTempData;
+                        }
+                    }
+
+                }
+            } catch (err) {
             }
-        }
-        return $.trim(newSource || '') || source;
+
+            if (item.length > sData.length) {
+                sData = sData || item;
+            }
+
+            if (!isJson) {
+                sData = '';
+            }
+        });
+        return sData;
     };
 
     /**
@@ -92,7 +114,7 @@ baidu.csJsonFormat = (function () {
      * chrome 下复制到剪贴板
      * @param text
      */
-    var _copyToClipboard = function(text) {
+    var _copyToClipboard = function (text) {
         const input = document.createElement('textarea');
         input.style.position = 'fixed';
         input.style.opacity = 0;
@@ -110,7 +132,7 @@ baidu.csJsonFormat = (function () {
      * @param el
      * @private
      */
-    var _addOptForItem = function(el){
+    var _addOptForItem = function (el) {
 
         // 复制json片段
         var fnCopy = function (ec) {
@@ -152,7 +174,7 @@ baidu.csJsonFormat = (function () {
      * 事件绑定
      * @private
      */
-    var _bindEvent = function(){
+    var _bindEvent = function () {
 
         // 点击区块高亮
         $('#jfContent').delegate('.kvov', 'click', function (e) {
@@ -201,10 +223,10 @@ baidu.csJsonFormat = (function () {
                 funcName = matches[1];
                 newSource = matches[2];
                 jsonObj = new Function("return " + newSource)();
-            }else{
-                reg = /^([\{\[])/ ;
-                if(!reg.test(source)){
-                    return ;
+            } else {
+                reg = /^([\{\[])/;
+                if (!reg.test(source)) {
+                    return;
                 }
             }
 
@@ -236,13 +258,6 @@ baidu.csJsonFormat = (function () {
                 if (newSource.length * 2 < (_uniDecode(source)).length) {
                     return;
                 }
-                // 直接replace掉所有\w之外的字符,再和原内容比较
-                var r_ns = newSource.replace(/[^\w]/gm, '').length;
-                var r_os = _uniDecode(source).replace(/[^\w]/gm, '').length;
-                // 允许内容产生1/20的误差
-                if (Math.abs(r_ns - r_os) > (r_ns + r_os) / 20) {
-                    return;
-                }
             } catch (ex) {
                 // 通过JSON反解不出来的,一定有问题
                 return;
@@ -264,6 +279,7 @@ baidu.csJsonFormat = (function () {
     };
 
     var _init = function () {
+
         $(function () {
             if (!/^filesystem\:/.test(location.href)) {
                 if (baidu.feOption.pageJsonMustFormat) {
@@ -273,7 +289,7 @@ baidu.csJsonFormat = (function () {
                         type: MSG_TYPE.GET_OPTIONS,
                         items: ['JSON_PAGE_FORMAT']
                     }, function (opts) {
-                        if (opts.JSON_PAGE_FORMAT !== 'false') {
+                        if (opts.JSON_PAGE_FORMAT != 'false') {
                             _format();
                         }
                     });

+ 33 - 3
chrome/static/js/jsonformat/json-format-ent.js

@@ -337,13 +337,37 @@ var JsonFormatEntrance = (function () {
         _downloadJsonFile(JSON.parse(jsonStr));
     };
 
+
     /**
-     * 下载数据
+     * 直接下载,能解决中文乱码
      * @param json
      * @private
      */
-    var _downloadJsonFile = function (json) {
+    var _downloadJsonFile = function(json){
+
+        // 下载链接
+        var localUrl = location.href ;
+        var content = JSON.stringify(json, null, 4);
+        content = [ '/* ',localUrl,' */','\n',content].join('');
+        var blob = new Blob([ content ], {type:'application/octet-stream'});
+
+        var aLink = $('<a id="btnDownload" target="_blank" title="保存到本地">下载JSON数据</a>').prependTo('#optionBar');
+        aLink.attr('download', +new Date() + '.json');
+        aLink.attr('href',URL.createObjectURL(blob));
+
+        var evt = document.createEvent("HTMLEvents");
+        evt.initEvent("click", false, false);
+        aLink[0].dispatchEvent(evt);
+    };
+
+    /**
+     * 下载数据:在新版本Chrome下会导致中文乱码
+     * @param json
+     * @private
+     */
+    var _downloadJsonFile2 = function (json) {
         try {
+
             window.webkitRequestFileSystem(window.TEMPORARY, 10 * 1024 * 1024, function (fs) {
                 var dir = (+new Date).toString(36);
                 var name = +new Date() + '.json';
@@ -356,7 +380,13 @@ var JsonFormatEntrance = (function () {
                                 $('#optionBar').prepend('<a href="' + fileEntry.toURL() + '" id="btnDownload" target="_blank" ' +
                                     'title="在新页面Ctrl+S保存到本地">下载JSON数据</a>');
                             };
-                            var blob = new Blob([JSON.stringify(json, null, 4) ], {type:'application/octet-stream'});
+
+                            // 下载链接
+                            var localUrl = location.href ;
+                            var content = JSON.stringify(json, null, 4);
+                            content = [ '/* ',localUrl,' */','\n',content].join('');
+                            var blob = new Blob([ content ], {type:'application/octet-stream'});
+
                             fileWriter.write(blob);
                         });
                     });

ファイルの差分が大きいため隠しています
+ 0 - 0
chrome/template/fehelper_options.html


この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません