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,"&").replace(//g,">");
+ 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,"&").replace(//g,">");
- var topic = (o.topic||"").toString().replace(/&/g,"&").replace(//g,">");
- var payload = (o.msg||"").toString().replace(/&/g,"&").replace(//g,">");
+ 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 = ""+el.name+">";
- 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';
+ result += UglifyJS.minify(script, {fromString: true}).code;
+ result += '';
+ node_config_cache = result;
}
- result += '';
- return result;
+ return node_config_cache;
}
-var typeRegistry = module.exports = {
+module.exports = {
init:init,
load:load,
registerType: function(type,node) {
@@ -281,6 +311,13 @@ var typeRegistry = module.exports = {
get: function(type) {
return node_types[type];
},
- getNodeConfigs: getNodeConfigs
+ getNodeConfigs: getNodeConfigs,
+
+ loadNode: function(filename) {
+
+ },
+ removeNode: function(filename) {
+
+ }
}
diff --git a/red/server.js b/red/server.js
index fbb642ebd..f7a068ead 100644
--- a/red/server.js
+++ b/red/server.js
@@ -76,7 +76,7 @@ function start() {
util.log("------------------------------------------");
if (settings.verbose) {
for (var i=0;i