From 6c36778cac7765c7083ad433ead5f4ee15b0ec3f Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 2 Nov 2016 23:20:48 +0000 Subject: [PATCH] Move debug message utils into core --- Gruntfile.js | 1 + editor/js/ui/utils.js | 271 ++++++++++++++++++ .../debug/style.css => editor/sass/debug.scss | 16 ++ editor/sass/style.scss | 1 + nodes/core/core/58-debug.html | 9 +- nodes/core/core/lib/debug/debug-utils.js | 271 ++---------------- nodes/core/core/lib/debug/view.html | 4 +- 7 files changed, 311 insertions(+), 262 deletions(-) create mode 100644 editor/js/ui/utils.js rename nodes/core/core/lib/debug/style.css => editor/sass/debug.scss (86%) diff --git a/Gruntfile.js b/Gruntfile.js index 05890225d..abe69aadd 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -116,6 +116,7 @@ module.exports = function(grunt) { "editor/js/ui/common/searchBox.js", "editor/js/ui/common/tabs.js", "editor/js/ui/common/typedInput.js", + "editor/js/ui/utils.js", "editor/js/ui/deploy.js", "editor/js/ui/keyboard.js", "editor/js/ui/workspaces.js", diff --git a/editor/js/ui/utils.js b/editor/js/ui/utils.js new file mode 100644 index 000000000..18eac2973 --- /dev/null +++ b/editor/js/ui/utils.js @@ -0,0 +1,271 @@ +/** + * Copyright 2016 IBM Corp. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +RED.utils = (function() { + + function formatString(str) { + return str.replace(/\r?\n/g,"↵").replace(/\t/g,"→"); + } + + function buildMessageSummaryValue(value) { + var result; + if (Array.isArray(value)) { + result = $('').html('array['+value.length+']'); + } else if (value === null) { + result = $('null'); + } else if (typeof value === 'object') { + if (value.hasOwnProperty('type') && value.type === 'Buffer' && value.hasOwnProperty('data')) { + result = $('').html('buffer['+value.data.length+']'); + } else if (value.hasOwnProperty('type') && value.type === 'array' && value.hasOwnProperty('data')) { + result = $('').html('array['+value.length+']'); + } else { + result = $('object'); + } + } else if (typeof value === 'string') { + subvalue = value; + if (subvalue.length > 30) { + subvalue = subvalue.substring(0,30)+"…"; + } + result = $('').html('"'+formatString(subvalue)+'"'); + } else { + result = $('').text(""+value); + } + return result; + } + function makeExpandable(el,onexpand) { + el.addClass("debug-message-expandable"); + el.click(function(e) { + var parent = $(this).parent(); + if (parent.hasClass('collapsed')) { + if (onexpand && !parent.hasClass('built')) { + onexpand(); + parent.addClass('built'); + } + parent.removeClass('collapsed'); + } else { + parent.addClass('collapsed'); + } + e.preventDefault(); + }); + } + + function buildMessageElement(obj,key,typeHint,hideKey) { + var i; + var e; + var entryObj; + var header; + var headerHead; + var value,subvalue; + var element = $(''); + if (!key) { + element.addClass("debug-message-top-level"); + } + + header = $('').appendTo(element); + + if (key && !hideKey) { + $('').text(key).appendTo(header); + $(': ').appendTo(header); + } + entryObj = $('').appendTo(header); + + var isArray = Array.isArray(obj); + var isArrayObject = false; + if (obj && typeof obj === 'object' && obj.hasOwnProperty('type') && obj.hasOwnProperty('data')) { + isArray = true; + isArrayObject = true; + } + + if (obj === null || obj === undefined) { + $(''+obj+'').appendTo(entryObj); + } else if (typeof obj === 'string') { + element.addClass('collapsed'); + $(' ').prependTo(header); + $('').html('"'+formatString(obj)+'"').appendTo(entryObj); + makeExpandable(header, function() { + $('').html(typeHint||'string').appendTo(header); + var row = $('').appendTo(element); + $('
').html(obj).appendTo(row);
+            });
+
+
+        } else if (typeof obj === 'number') {
+            e = $('').text(""+obj).appendTo(entryObj);
+            e.click(function(evt) {
+                var format = $(this).data('format');
+                if (format === 'hex') {
+                    $(this).text(""+obj).data('format','dec');
+                } else {
+                    $(this).text("0x"+(obj).toString(16)).data('format','hex');
+                }
+                evt.preventDefault();
+            });
+        } else if (isArray) {
+            element.addClass('collapsed');
+
+            var originalLength = obj.length;
+            if (typeHint) {
+                var m = /\[(\d+)\]/.exec(typeHint);
+                if (m) {
+                    originalLength = parseInt(m[1]);
+                }
+            }
+            var data = obj;
+            var type = 'array';
+            if (isArrayObject) {
+                data = obj.data;
+                if (originalLength === undefined) {
+                    originalLength = data.length;
+                }
+                type = obj.type.toLowerCase();
+            } else if (/buffer/.test(typeHint)) {
+                type = 'buffer';
+            }
+            var fullLength = data.length;
+
+            if (originalLength > 0) {
+                $(' ').prependTo(header);
+                var arrayRows = $('
').appendTo(element); + element.addClass('debug-message-buffer-raw'); + makeExpandable(header,function() { + if (!key) { + headerHead = $('').html(typeHint||(type+'['+originalLength+']')).appendTo(header); + } + if (type === 'buffer') { + var stringRow = $('
').appendTo(element); + var sr = $('').appendTo(stringRow); + var stringEncoding = ""; + try { + stringEncoding = String.fromCharCode.apply(null, new Uint16Array(data)) + } catch(err) { + console.log(err); + } + $('
').html(stringEncoding).appendTo(sr);
+                        var bufferOpts = $('').appendTo(headerHead);
+                        $('').addClass('selected').html('raw').appendTo(bufferOpts).click(function(e) {
+                            if ($(this).text() === 'raw') {
+                                $(this).text('string');
+                                element.addClass('debug-message-buffer-string').removeClass('debug-message-buffer-raw');
+                            } else {
+                                $(this).text('raw');
+                                element.removeClass('debug-message-buffer-string').addClass('debug-message-buffer-raw');
+                            }
+                            e.preventDefault();
+                            e.stopPropagation();
+                        })
+                    }
+                    var row;
+                    if (fullLength <= 10) {
+                        for (i=0;i