From e07a523c3bbe25633244a32bceaa57145bdf4298 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Mon, 28 Jul 2014 16:37:39 +0100 Subject: [PATCH] Fix node html compression and refactor registry --- nodes/core/core/20-inject.html | 2 +- nodes/core/core/58-debug.html | 6 +- red/nodes/registry.js | 249 +++++++++++++++++++-------------- red/server.js | 2 +- 4 files changed, 148 insertions(+), 111 deletions(-) diff --git a/nodes/core/core/20-inject.html b/nodes/core/core/20-inject.html index 1cf74d50f..3576f8b29 100644 --- a/nodes/core/core/20-inject.html +++ b/nodes/core/core/20-inject.html @@ -400,7 +400,7 @@ }, button: { onclick: function() { - var label = (this.name||this.payload).replace(/&/g,"&amp;").replace(//g,"&gt;"); + var label = (this.name||this.payload).replace(/&/g,"&").replace(//g,">"); d3.xhr("inject/"+this.id).post(function(err,resp) { if (err) { if (err.status == 404) { diff --git a/nodes/core/core/58-debug.html b/nodes/core/core/58-debug.html index 82b2e80b7..ba3a0e498 100644 --- a/nodes/core/core/58-debug.html +++ b/nodes/core/core/58-debug.html @@ -150,9 +150,9 @@ } }; - var name = (o.name?o.name:o.id).toString().replace(/&/g,"&amp;").replace(//g,"&gt;"); - var topic = (o.topic||"").toString().replace(/&/g,"&amp;").replace(//g,"&gt;"); - var payload = (o.msg||"").toString().replace(/&/g,"&amp;").replace(//g,"&gt;"); + var name = (o.name?o.name:o.id).toString().replace(/&/g,"&").replace(//g,">"); + var topic = (o.topic||"").toString().replace(/&/g,"&").replace(//g,">"); + var payload = (o.msg||"").toString().replace(/&/g,"&").replace(//g,">"); msg.className = 'debug-message'+(o.level?(' debug-message-level-'+o.level):'') msg.innerHTML = ''+getTimestamp()+''+ '['+name+']'+ diff --git a/red/nodes/registry.js b/red/nodes/registry.js index 305e89502..c738fca19 100644 --- a/red/nodes/registry.js +++ b/red/nodes/registry.js @@ -29,7 +29,9 @@ var settings; var node_types = {}; var node_configs = []; -var node_scripts = []; + +//TODO: clear this cache whenever a node type is added/removed +var node_config_cache = null; /** * Synchronously walks the directory looking for node files. @@ -63,7 +65,7 @@ function getNodeFiles(dir) { * Scans the node_modules path for nodes * @return a list of node modules: {dir,package} */ -function scanTreeForNodesModules() { +function scanTreeForNodesModules(moduleName) { var dir = __dirname+"/../../nodes"; var results = []; var up = path.resolve(path.join(dir,"..")); @@ -72,16 +74,18 @@ function scanTreeForNodesModules() { try { var files = fs.readdirSync(pm); files.forEach(function(fn) { - var pkgfn = path.join(pm,fn,"package.json"); - try { - var pkg = require(pkgfn); - if (pkg['node-red']) { - var moduleDir = path.join(pm,fn); - results.push({dir:moduleDir,package:pkg}); - } - } catch(err) { - if (err.code != "MODULE_NOT_FOUND") { - // TODO: handle unexpected error + if (!moduleName || fn == moduleName) { + var pkgfn = path.join(pm,fn,"package.json"); + try { + var pkg = require(pkgfn); + if (pkg['node-red']) { + var moduleDir = path.join(pm,fn); + results.push({dir:moduleDir,package:pkg}); + } + } catch(err) { + if (err.code != "MODULE_NOT_FOUND") { + // TODO: handle unexpected error + } } } }); @@ -94,53 +98,6 @@ function scanTreeForNodesModules() { return results; } -/** - * Loads the specified node into the registry. - * @param nodeDir the directory containing the node - * @param nodeFn the node file - * @param nodeLabel the name of the node (npm nodes only) - * @return a promise that resolves to either {fn,path,err} - */ -function loadNode(nodeDir, nodeFn, nodeLabel) { - if (settings.nodesExcludes) { - for (var i=0;i"; + if (el.attribs) { + for (var j in el.attribs) { + if (el.attribs.hasOwnProperty(j)) { + openTag += " "+j+'="'+el.attribs[j]+'"'; + } + } + } + openTag += ">"; + template += openTag+$(el).text()+closeTag; + } + }); + + nodeInfo.template = templateFilename; + nodeInfo.config = template; + nodeInfo.script = script; + return nodeInfo; +} + function init(_settings) { Node = require("./Node"); settings = _settings; @@ -197,9 +253,7 @@ function load() { // Load all of the nodes in the order they were discovered var loadPromises = []; nodeFiles.forEach(function(file) { - var dir = path.dirname(file); - var fn = path.basename(file); - loadPromises.push(loadNode(dir,fn)); + loadPromises.push(loadNode(file)); }); moduleFiles.forEach(function(file) { @@ -213,64 +267,40 @@ function load() { // Store the error to pass up errors.push(result.value); } else { - // Load the node template - var templateFilename = result.value.path.replace(/\.js$/,".html"); - loadTemplate(templateFilename); + node_configs.push(result.value); } }); + // Trigger a load of the configs to get it precached + getNodeConfigs(); + resolve(errors); }); }); } -/** - * Registers a node's html configuration. - */ -function registerConfig(config) { - $ = cheerio.load(config); - var template = ""; - $("*").each(function(i,el) { - if (el.type == "script" && el.attribs.type == "text/javascript") { - var content = el.children[0].data; - el.children[0].data = UglifyJS.minify(content, {fromString: true}).code; - node_scripts.push($(this).text()); - } else if (el.name == "script" || el.name == "style") { - var openTag = "<"+el.name; - var closeTag = ""; - if (el.attribs) { - for (var j in el.attribs) { - if (el.attribs.hasOwnProperty(j)) { - openTag += " "+j+'="'+el.attribs[j]+'"'; - } - } - } - openTag += ">"; - - template += openTag+$(el).text()+closeTag; - } - }); - node_configs.push(template); -} - /** * Gets all of the node template configs * @return all of the node templates in a single string */ function getNodeConfigs() { - var result = ""; - for (var i=0;i