diff --git a/editor/templates/index.mst b/editor/templates/index.mst
new file mode 100644
index 000000000..103ffa76b
--- /dev/null
+++ b/editor/templates/index.mst
@@ -0,0 +1,182 @@
+
+
+
+
+
+
+
+
+{{ page.title }}
+
+
+
+
+
+
+{{#page.css}}
+
+{{/page.css}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/red/api/index.js b/red/api/index.js
index 222bc1436..30ad97f9a 100644
--- a/red/api/index.js
+++ b/red/api/index.js
@@ -24,6 +24,7 @@ var nodes = require("./nodes");
var flows = require("./flows");
var library = require("./library");
var info = require("./info");
+var theme = require("./theme");
var auth = require("./auth");
var needsPermission = auth.needsPermission;
@@ -41,9 +42,13 @@ function init(adminApp,storage) {
// Editor
if (!settings.disableEditor) {
+ ui.init(settings);
var editorApp = express();
editorApp.get("/",ui.ensureSlash,ui.editor);
editorApp.get("/icons/:icon",ui.icon);
+ if (settings.editorTheme) {
+ editorApp.use("/theme",theme.init(settings));
+ }
editorApp.use("/",ui.editorResources);
adminApp.use(editorApp);
}
diff --git a/red/api/info.js b/red/api/info.js
index a0b78cbb0..6cdd20b94 100644
--- a/red/api/info.js
+++ b/red/api/info.js
@@ -14,6 +14,7 @@
* limitations under the License.
**/
var settings = require('../settings');
+var theme = require("./theme");
var util = require('util');
@@ -23,7 +24,12 @@ module.exports = {
httpNodeRoot: settings.httpNodeRoot,
version: settings.version,
user: req.user
- };
+ }
+
+ var themeSettings = theme.settings();
+ if (themeSettings) {
+ safeSettings.editorTheme = themeSettings;
+ }
if (util.isArray(settings.paletteCategories)) {
safeSettings.paletteCategories = settings.paletteCategories;
diff --git a/red/api/theme.js b/red/api/theme.js
new file mode 100644
index 000000000..872792c0a
--- /dev/null
+++ b/red/api/theme.js
@@ -0,0 +1,113 @@
+/**
+ * Copyright 2015 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.
+ **/
+
+var express = require("express");
+var util = require("util");
+var path = require("path");
+var fs = require("fs");
+
+var themeContext = {
+ page: {
+ title: "Node-RED",
+ favicon: "favicon.ico"
+ //css: [""]
+ },
+ header: {
+ title: "Node-RED",
+ image: "red/images/node-red.png"
+ }
+};
+
+var themeSettings = null;
+
+function serveFile(app,baseUrl,file) {
+ try {
+ var stats = fs.statSync(file);
+ var url = baseUrl+path.basename(file);
+ //console.log(url,"->",file);
+ app.get(url,function(req, res) {
+ res.sendfile(file);
+ });
+ return url;
+ } catch(err) {
+ //TODO: log filenotfound
+ return null;
+ }
+}
+
+module.exports = {
+ init: function(settings) {
+ var i;
+ var url;
+ if (settings.editorTheme) {
+ var theme = settings.editorTheme;
+ themeSettings = {};
+
+ var themeApp = express();
+
+ if (theme.page) {
+ if (theme.page.css) {
+ var styles = theme.page.css;
+ if (!util.isArray(styles)) {
+ styles = [styles];
+ }
+ themeContext.page.css = [];
+
+ for (i=0;i