mirror of
https://github.com/TryGhost/Ghost.git
synced 2024-11-29 15:12:58 +03:00
10fc320cc8
no issue - In Ghost, 'context' means the page or section of a blog we're currently within when rendering a theme, e.g. 'post' or 'tag' or 'home'. - In handlebars 'context' refers to the blob of JSON that is tied to a template. - These two uses of the word 'context' have gotten very confusing, so I've removed all usage of 'context' within the Ghost handlebars helpers, EXCEPT where they actually refer to the current context (e.g. the is helper)
71 lines
2.2 KiB
JavaScript
71 lines
2.2 KiB
JavaScript
// ### Navigation Helper
|
|
// `{{navigation}}`
|
|
// Outputs navigation menu of static urls
|
|
|
|
var _ = require('lodash'),
|
|
hbs = require('express-hbs'),
|
|
i18n = require('../i18n'),
|
|
|
|
errors = require('../errors'),
|
|
template = require('./template'),
|
|
navigation;
|
|
|
|
navigation = function (options) {
|
|
/*jshint unused:false*/
|
|
var navigationData = options.data.blog.navigation,
|
|
currentUrl = options.data.root.relativeUrl,
|
|
self = this,
|
|
output,
|
|
data;
|
|
|
|
if (!_.isObject(navigationData) || _.isFunction(navigationData)) {
|
|
return errors.logAndThrowError(i18n.t('warnings.helpers.navigation.invalidData'));
|
|
}
|
|
|
|
if (navigationData.filter(function (e) {
|
|
return (_.isUndefined(e.label) || _.isUndefined(e.url));
|
|
}).length > 0) {
|
|
return errors.logAndThrowError(i18n.t('warnings.helpers.navigation.valuesMustBeDefined'));
|
|
}
|
|
|
|
// check for non-null string values
|
|
if (navigationData.filter(function (e) {
|
|
return ((!_.isNull(e.label) && !_.isString(e.label)) ||
|
|
(!_.isNull(e.url) && !_.isString(e.url)));
|
|
}).length > 0) {
|
|
return errors.logAndThrowError(i18n.t('warnings.helpers.navigation.valuesMustBeString'));
|
|
}
|
|
|
|
function _slugify(label) {
|
|
return label.toLowerCase().replace(/[^\w ]+/g, '').replace(/ +/g, '-');
|
|
}
|
|
|
|
// strips trailing slashes and compares urls
|
|
function _isCurrentUrl(href, currentUrl) {
|
|
var strippedHref = href.replace(/\/+$/, ''),
|
|
strippedCurrentUrl = currentUrl.replace(/\/+$/, '');
|
|
return strippedHref === strippedCurrentUrl;
|
|
}
|
|
|
|
// {{navigation}} should no-op if no data passed in
|
|
if (navigationData.length === 0) {
|
|
return new hbs.SafeString('');
|
|
}
|
|
|
|
output = navigationData.map(function (e) {
|
|
var out = {};
|
|
out.current = _isCurrentUrl(e.url, currentUrl);
|
|
out.label = e.label;
|
|
out.slug = _slugify(e.label);
|
|
out.url = hbs.handlebars.Utils.escapeExpression(e.url);
|
|
out.secure = self.secure;
|
|
return out;
|
|
});
|
|
|
|
data = _.merge({}, {navigation: output});
|
|
|
|
return template.execute('navigation', data, options);
|
|
};
|
|
|
|
module.exports = navigation;
|