2013-05-11 20:44:25 +04:00
|
|
|
|
// # Ghost Module
|
|
|
|
|
// Defines core methods required to build the frontend
|
|
|
|
|
|
2013-05-16 14:29:02 +04:00
|
|
|
|
/*global module, require, __dirname */
|
2013-05-11 20:44:25 +04:00
|
|
|
|
(function () {
|
|
|
|
|
"use strict";
|
|
|
|
|
|
|
|
|
|
// ## Setup Prerequisites
|
|
|
|
|
var config = require('./../config'),
|
|
|
|
|
express = require('express'),
|
|
|
|
|
path = require('path'),
|
|
|
|
|
hbs = require('express-hbs'),
|
|
|
|
|
_ = require('underscore'),
|
|
|
|
|
Polyglot = require('node-polyglot'),
|
2013-05-17 01:16:09 +04:00
|
|
|
|
|
2013-05-11 20:44:25 +04:00
|
|
|
|
JsonDataProvider = require('./shared/models/dataProvider.json'),
|
|
|
|
|
jsonDataProvider = new JsonDataProvider(),
|
2013-05-17 01:16:09 +04:00
|
|
|
|
BookshelfDataProvider = require('./shared/models/dataProvider.bookshelf'),
|
|
|
|
|
bookshelfDataProvider = new BookshelfDataProvider(),
|
2013-05-11 20:44:25 +04:00
|
|
|
|
Ghost,
|
|
|
|
|
instance,
|
|
|
|
|
filterCallbacks = {},
|
|
|
|
|
|
|
|
|
|
statuses;
|
|
|
|
|
|
|
|
|
|
// ## Article Statuses
|
|
|
|
|
/**
|
|
|
|
|
* A list of atricle status types
|
|
|
|
|
* @type {Object}
|
|
|
|
|
*/
|
|
|
|
|
statuses = {
|
|
|
|
|
'draft': 'draft',
|
|
|
|
|
'complete': 'complete',
|
|
|
|
|
'approved': 'approved',
|
|
|
|
|
'scheduled': 'scheduled',
|
|
|
|
|
'published': 'published'
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// ## Module Methods
|
|
|
|
|
/**
|
|
|
|
|
* @method Ghost
|
|
|
|
|
* @returns {*}
|
|
|
|
|
* @constructor
|
|
|
|
|
*/
|
|
|
|
|
Ghost = function () {
|
|
|
|
|
var app,
|
|
|
|
|
globals,
|
|
|
|
|
polyglot;
|
|
|
|
|
|
|
|
|
|
if (!instance) {
|
|
|
|
|
instance = this;
|
|
|
|
|
|
|
|
|
|
// Temporary loading of settings
|
|
|
|
|
jsonDataProvider.globals.findAll(function (error, data) {
|
|
|
|
|
globals = data;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
app = express();
|
|
|
|
|
|
|
|
|
|
polyglot = new Polyglot();
|
|
|
|
|
|
|
|
|
|
// functionality
|
|
|
|
|
// load Plugins...
|
|
|
|
|
// var f = new FancyFirstChar(ghost).init();
|
|
|
|
|
|
|
|
|
|
_.extend(instance, {
|
|
|
|
|
app: function () { return app; },
|
|
|
|
|
config: function () { return config; },
|
|
|
|
|
globals: function () { return globals; }, // there's no management here to be sure this has loaded
|
2013-05-17 01:16:09 +04:00
|
|
|
|
dataProvider: function () { return bookshelfDataProvider; },
|
2013-05-11 20:44:25 +04:00
|
|
|
|
statuses: function () { return statuses; },
|
|
|
|
|
polyglot: function () { return polyglot; },
|
|
|
|
|
paths: function () {
|
|
|
|
|
return {
|
2013-05-27 23:27:41 +04:00
|
|
|
|
'activeTheme': __dirname + '/../content/' + config.themeDir + '/' + config.activeTheme + '/',
|
|
|
|
|
'adminViews': __dirname + '/admin/views/',
|
|
|
|
|
'frontendViews': __dirname + '/frontend/views/',
|
|
|
|
|
'lang': __dirname + '/lang/'
|
2013-05-11 20:44:25 +04:00
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return instance;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @param {string} name
|
|
|
|
|
* @param {Function} fn
|
|
|
|
|
* @return {method} hbs.registerHelper
|
|
|
|
|
*/
|
|
|
|
|
Ghost.prototype.registerThemeHelper = function (name, fn) {
|
|
|
|
|
hbs.registerHelper(name, fn);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @param {string} name
|
|
|
|
|
* @param {Function} fn
|
|
|
|
|
* @return {*}
|
|
|
|
|
*/
|
2013-05-25 20:48:15 +04:00
|
|
|
|
Ghost.prototype.registerTheme = function (name, fn) {
|
|
|
|
|
return this;
|
|
|
|
|
};
|
2013-05-11 20:44:25 +04:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @param {string} name
|
|
|
|
|
* @param {Function} fn
|
|
|
|
|
* @return {*}
|
|
|
|
|
*/
|
2013-05-25 20:48:15 +04:00
|
|
|
|
Ghost.prototype.registerPlugin = function (name, fn) {
|
|
|
|
|
return this;
|
|
|
|
|
};
|
2013-05-11 20:44:25 +04:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @param {string} name
|
|
|
|
|
* @param {Function} fn
|
|
|
|
|
*/
|
|
|
|
|
Ghost.prototype.registerFilter = function (name, fn) {
|
|
|
|
|
if (!filterCallbacks.hasOwnProperty(name)) {
|
|
|
|
|
filterCallbacks[name] = [];
|
|
|
|
|
}
|
|
|
|
|
console.log('registering filter for ', name);
|
|
|
|
|
filterCallbacks[name].push(fn);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @param {string} name [description]
|
|
|
|
|
* @param {*} args
|
|
|
|
|
* @param {Function} callback
|
|
|
|
|
* @return {method} callback
|
|
|
|
|
*/
|
|
|
|
|
Ghost.prototype.doFilter = function (name, args, callback) {
|
|
|
|
|
var fn;
|
|
|
|
|
|
|
|
|
|
if (filterCallbacks.hasOwnProperty(name)) {
|
|
|
|
|
for (fn in filterCallbacks[name]) {
|
|
|
|
|
if (filterCallbacks[name].hasOwnProperty(fn)) {
|
|
|
|
|
console.log('doing filter for ', name);
|
|
|
|
|
args = filterCallbacks[name][fn](args);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2013-05-27 23:27:41 +04:00
|
|
|
|
|
2013-05-11 20:44:25 +04:00
|
|
|
|
callback(args);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Initialise Theme
|
|
|
|
|
*
|
|
|
|
|
* @todo Tod (?) Old comment
|
|
|
|
|
* @param {Object} app
|
|
|
|
|
*/
|
|
|
|
|
Ghost.prototype.initTheme = function (app) {
|
|
|
|
|
var self = this;
|
|
|
|
|
return function initTheme(req, res, next) {
|
|
|
|
|
app.set('view engine', 'hbs');
|
|
|
|
|
|
|
|
|
|
if (/(^\/ghost$|^\/ghost\/)/.test(req.url) === false) {
|
|
|
|
|
app.engine('hbs', hbs.express3(
|
|
|
|
|
{partialsDir: self.paths().activeTheme + 'partials'}
|
|
|
|
|
));
|
|
|
|
|
app.set('views', self.paths().activeTheme);
|
|
|
|
|
} else {
|
2013-05-12 17:40:59 +04:00
|
|
|
|
app.engine('hbs', hbs.express3({partialsDir: self.paths().adminViews + 'partials'}));
|
2013-05-11 20:44:25 +04:00
|
|
|
|
app.set('views', self.paths().adminViews);
|
|
|
|
|
app.use('/core/admin/assets', express['static'](path.join(__dirname, '/admin/assets')));
|
|
|
|
|
}
|
|
|
|
|
app.use(express['static'](self.paths().activeTheme));
|
|
|
|
|
app.use('/content/images', express['static'](path.join(__dirname, '/../content/images')));
|
|
|
|
|
|
|
|
|
|
next();
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
module.exports = Ghost;
|
|
|
|
|
}());
|