diff --git a/package.json b/package.json
index f35c875dc3..7fff110bd6 100644
--- a/package.json
+++ b/package.json
@@ -42,7 +42,8 @@
"nodebb-widget-essentials": "~0.0",
"nodebb-theme-vanilla": "~0.0.14",
"nodebb-theme-cerulean": "~0.0.13",
- "nodebb-theme-lavender": "~0.0.21"
+ "nodebb-theme-lavender": "~0.0.21",
+ "less": "^1.6.3"
},
"optionalDependencies": {
"redis": "0.8.3",
diff --git a/public/templates/header.tpl b/public/templates/header.tpl
index 5e4c0e2d4a..4a5aa70794 100644
--- a/public/templates/header.tpl
+++ b/public/templates/header.tpl
@@ -6,7 +6,7 @@
name="{metaTags.name}" property="{metaTags.property}" content="{metaTags.content}" />
-
+
link="{linkTags.link}" rel="{linkTags.rel}" type="{linkTags.type}" href="{linkTags.href}" />
diff --git a/src/meta.js b/src/meta.js
index 419f293648..e494c4fccc 100644
--- a/src/meta.js
+++ b/src/meta.js
@@ -337,6 +337,10 @@ var fs = require('fs'),
}
};
+ Meta.css = {
+ cache: undefined
+ };
+
Meta.restart = function() {
if (process.send) {
process.send('nodebb:restart');
diff --git a/src/plugins.js b/src/plugins.js
index 8da34ebfe2..5dad12632a 100644
--- a/src/plugins.js
+++ b/src/plugins.js
@@ -16,6 +16,7 @@ var fs = require('fs'),
Plugins.loadedHooks = {};
Plugins.staticDirs = {};
Plugins.cssFiles = [];
+ Plugins.lessFiles = [];
Plugins.initialized = false;
@@ -221,6 +222,20 @@ var fs = require('fs'),
} else {
next();
}
+ },
+ function(next) {
+ // LESS files for plugins
+ if (pluginData.less && pluginData.less instanceof Array) {
+ if (global.env === 'development') {
+ winston.info('[plugins] Found ' + pluginData.less.length + ' LESS file(s) for plugin ' + pluginData.id);
+ }
+
+ Plugins.lessFiles = Plugins.lessFiles.concat(pluginData.less.map(function(file) {
+ return path.join(pluginData.id, file);
+ }));
+ }
+
+ next();
}
], function(err) {
if (!err) {
diff --git a/src/routes/theme.js b/src/routes/theme.js
new file mode 100644
index 0000000000..e8a9052029
--- /dev/null
+++ b/src/routes/theme.js
@@ -0,0 +1,52 @@
+var path = require('path'),
+ nconf = require('nconf'),
+ less = require('less'),
+
+ meta = require('../meta'),
+ db = require('../database'),
+ plugins = require('../plugins');
+
+(function (Meta) {
+ Meta.createRoutes = function(app) {
+ app.get('/stylesheet.css', function(req, res) {
+ if (meta.css.cache) {
+ res.type('text/css').send(200, meta.css.cache);
+ return;
+ }
+
+ db.getObjectFields('config', ['theme:type', 'theme:id'], function(err, themeData) {
+ var themeId = (themeData['theme:id'] || 'nodebb-theme-vanilla'),
+ baseThemePath = path.join(nconf.get('themes_path'), themeId),
+ paths = [baseThemePath, path.join(__dirname, '../../node_modules')],
+ source = '@import "./theme";',
+ x, numLESS;
+
+ // Add the imports for each LESS file
+ for(x=0,numLESS=plugins.lessFiles.length;x