2015-04-13 01:11:11 +02:00
|
|
|
/**
|
2017-01-11 16:24:33 +01:00
|
|
|
* Copyright JS Foundation and other contributors, http://js.foundation
|
2015-04-13 01:11:11 +02:00
|
|
|
*
|
|
|
|
* 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");
|
2015-04-13 23:15:15 +02:00
|
|
|
var clone = require("clone");
|
2015-04-13 01:11:11 +02:00
|
|
|
|
2015-04-13 23:15:15 +02:00
|
|
|
var defaultContext = {
|
2015-04-13 01:11:11 +02:00
|
|
|
page: {
|
|
|
|
title: "Node-RED",
|
2016-02-08 15:20:07 +01:00
|
|
|
favicon: "favicon.ico",
|
|
|
|
tabicon: "red/images/node-red-icon-black.svg"
|
2015-04-13 01:11:11 +02:00
|
|
|
},
|
|
|
|
header: {
|
|
|
|
title: "Node-RED",
|
|
|
|
image: "red/images/node-red.png"
|
2015-05-11 21:24:15 +02:00
|
|
|
},
|
|
|
|
asset: {
|
2016-11-02 23:53:18 +01:00
|
|
|
red: (process.env.NODE_ENV == "development")? "red/red.js":"red/red.min.js",
|
|
|
|
main: (process.env.NODE_ENV == "development")? "red/main.js":"red/main.min.js",
|
|
|
|
|
2015-04-13 17:48:38 +02:00
|
|
|
}
|
2015-04-13 01:11:11 +02:00
|
|
|
};
|
|
|
|
|
2016-01-08 14:36:49 +01:00
|
|
|
var theme = null;
|
2015-04-13 23:15:15 +02:00
|
|
|
var themeContext = clone(defaultContext);
|
2015-04-13 01:11:11 +02:00
|
|
|
var themeSettings = null;
|
2016-10-12 23:30:32 +02:00
|
|
|
var runtime = null;
|
2015-04-13 01:11:11 +02:00
|
|
|
|
2017-04-12 11:09:03 +02:00
|
|
|
var themeApp;
|
|
|
|
|
2015-04-13 01:11:11 +02:00
|
|
|
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) {
|
2015-07-15 23:43:24 +02:00
|
|
|
res.sendFile(file);
|
2015-04-13 01:11:11 +02:00
|
|
|
});
|
2015-04-13 11:37:30 +02:00
|
|
|
return "theme"+url;
|
2015-04-13 01:11:11 +02:00
|
|
|
} catch(err) {
|
|
|
|
//TODO: log filenotfound
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-04-10 16:46:44 +02:00
|
|
|
function serveFilesFromTheme(themeValue, themeApp, directory) {
|
|
|
|
var result = [];
|
|
|
|
if (themeValue) {
|
|
|
|
var array = themeValue;
|
|
|
|
if (!util.isArray(array)) {
|
|
|
|
array = [array];
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i=0;i<array.length;i++) {
|
|
|
|
url = serveFile(themeApp,directory,array[i]);
|
|
|
|
if (url) {
|
|
|
|
result.push(url);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return result
|
|
|
|
}
|
|
|
|
|
2015-04-13 01:11:11 +02:00
|
|
|
module.exports = {
|
2015-11-11 23:11:02 +01:00
|
|
|
init: function(runtime) {
|
|
|
|
var settings = runtime.settings;
|
2015-04-13 23:15:15 +02:00
|
|
|
themeContext = clone(defaultContext);
|
2016-01-08 14:36:49 +01:00
|
|
|
if (runtime.version) {
|
|
|
|
themeContext.version = runtime.version();
|
|
|
|
}
|
2015-04-13 23:15:15 +02:00
|
|
|
themeSettings = null;
|
2017-04-12 11:09:03 +02:00
|
|
|
theme = settings.editorTheme || {};
|
2016-01-08 14:36:49 +01:00
|
|
|
},
|
2015-07-15 23:43:24 +02:00
|
|
|
|
2016-01-08 14:36:49 +01:00
|
|
|
app: function() {
|
2016-01-08 14:41:33 +01:00
|
|
|
var i;
|
|
|
|
var url;
|
2016-01-08 14:36:49 +01:00
|
|
|
themeSettings = {};
|
2015-07-15 23:43:24 +02:00
|
|
|
|
2017-04-12 11:09:03 +02:00
|
|
|
themeApp = express();
|
2015-07-15 23:43:24 +02:00
|
|
|
|
2016-01-08 14:36:49 +01:00
|
|
|
if (theme.page) {
|
2015-07-15 23:43:24 +02:00
|
|
|
|
2017-04-10 16:46:44 +02:00
|
|
|
themeContext.page.css = serveFilesFromTheme(
|
2017-04-12 11:09:03 +02:00
|
|
|
themeContext.page.css,
|
|
|
|
themeApp,
|
2017-04-10 16:46:44 +02:00
|
|
|
"/css/")
|
|
|
|
themeContext.page.scripts = serveFilesFromTheme(
|
2017-04-12 11:09:03 +02:00
|
|
|
themeContext.page.scripts,
|
|
|
|
themeApp,
|
2017-04-10 16:46:44 +02:00
|
|
|
"/scripts/")
|
2015-07-15 23:43:24 +02:00
|
|
|
|
2016-01-08 14:36:49 +01:00
|
|
|
if (theme.page.favicon) {
|
|
|
|
url = serveFile(themeApp,"/favicon/",theme.page.favicon)
|
|
|
|
if (url) {
|
|
|
|
themeContext.page.favicon = url;
|
|
|
|
}
|
2015-04-13 01:11:11 +02:00
|
|
|
}
|
2016-08-10 21:15:17 +02:00
|
|
|
|
2016-02-08 15:20:07 +01:00
|
|
|
if (theme.page.tabicon) {
|
|
|
|
url = serveFile(themeApp,"/tabicon/",theme.page.tabicon)
|
|
|
|
if (url) {
|
|
|
|
themeContext.page.tabicon = url;
|
|
|
|
}
|
|
|
|
}
|
2015-07-15 23:43:24 +02:00
|
|
|
|
2016-01-08 14:36:49 +01:00
|
|
|
themeContext.page.title = theme.page.title || themeContext.page.title;
|
|
|
|
}
|
2015-07-15 23:43:24 +02:00
|
|
|
|
2016-01-08 14:36:49 +01:00
|
|
|
if (theme.header) {
|
2015-07-15 23:43:24 +02:00
|
|
|
|
2016-01-08 14:36:49 +01:00
|
|
|
themeContext.header.title = theme.header.title || themeContext.header.title;
|
2015-07-15 23:43:24 +02:00
|
|
|
|
2016-01-08 14:36:49 +01:00
|
|
|
if (theme.header.hasOwnProperty("url")) {
|
|
|
|
themeContext.header.url = theme.header.url;
|
2015-04-13 01:11:11 +02:00
|
|
|
}
|
2015-07-15 23:43:24 +02:00
|
|
|
|
2016-01-08 14:36:49 +01:00
|
|
|
if (theme.header.hasOwnProperty("image")) {
|
|
|
|
if (theme.header.image) {
|
|
|
|
url = serveFile(themeApp,"/header/",theme.header.image);
|
|
|
|
if (url) {
|
|
|
|
themeContext.header.image = url;
|
2015-04-13 10:48:49 +02:00
|
|
|
}
|
2016-01-08 14:36:49 +01:00
|
|
|
} else {
|
|
|
|
themeContext.header.image = null;
|
2015-04-13 10:48:49 +02:00
|
|
|
}
|
|
|
|
}
|
2016-01-08 14:36:49 +01:00
|
|
|
}
|
2015-07-15 23:43:24 +02:00
|
|
|
|
2016-01-08 14:36:49 +01:00
|
|
|
if (theme.deployButton) {
|
|
|
|
if (theme.deployButton.type == "simple") {
|
|
|
|
themeSettings.deployButton = {
|
|
|
|
type: "simple"
|
|
|
|
}
|
|
|
|
if (theme.deployButton.label) {
|
|
|
|
themeSettings.deployButton.label = theme.deployButton.label;
|
|
|
|
}
|
|
|
|
if (theme.deployButton.icon) {
|
|
|
|
url = serveFile(themeApp,"/deploy/",theme.deployButton.icon);
|
2015-04-13 11:37:30 +02:00
|
|
|
if (url) {
|
2016-01-08 14:36:49 +01:00
|
|
|
themeSettings.deployButton.icon = url;
|
2015-04-13 11:37:30 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2016-01-08 14:36:49 +01:00
|
|
|
}
|
2015-07-15 23:43:24 +02:00
|
|
|
|
2016-01-08 14:36:49 +01:00
|
|
|
if (theme.hasOwnProperty("userMenu")) {
|
|
|
|
themeSettings.userMenu = theme.userMenu;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (theme.login) {
|
|
|
|
if (theme.login.image) {
|
|
|
|
url = serveFile(themeApp,"/login/",theme.login.image);
|
|
|
|
if (url) {
|
|
|
|
themeContext.login = {
|
|
|
|
image: url
|
|
|
|
}
|
|
|
|
}
|
2015-04-13 14:55:17 +02:00
|
|
|
}
|
2016-01-08 14:36:49 +01:00
|
|
|
}
|
2015-07-15 23:43:24 +02:00
|
|
|
|
2016-01-08 14:36:49 +01:00
|
|
|
if (theme.hasOwnProperty("menu")) {
|
|
|
|
themeSettings.menu = theme.menu;
|
2015-04-13 01:11:11 +02:00
|
|
|
}
|
2016-01-08 14:36:49 +01:00
|
|
|
|
2016-08-10 21:15:17 +02:00
|
|
|
if (theme.hasOwnProperty("palette")) {
|
|
|
|
themeSettings.palette = theme.palette;
|
|
|
|
}
|
2016-01-08 14:36:49 +01:00
|
|
|
return themeApp;
|
2015-04-13 01:11:11 +02:00
|
|
|
},
|
|
|
|
context: function() {
|
|
|
|
return themeContext;
|
|
|
|
},
|
|
|
|
settings: function() {
|
|
|
|
return themeSettings;
|
2017-04-12 11:09:03 +02:00
|
|
|
},
|
|
|
|
serveFile: function(baseUrl,file) {
|
|
|
|
return serveFile(themeApp,baseUrl,file);
|
2015-04-13 01:11:11 +02:00
|
|
|
}
|
|
|
|
}
|