You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nodebb/src/meta/title.js

89 lines
2.5 KiB
JavaScript

'use strict';
var winston = require('winston'),
validator = require('validator'),
user = require('../user'),
translator = require('../../public/src/translator');
module.exports = function(Meta) {
Meta.title = {};
var tests = {
isCategory: /^category\/\d+\/?/,
isTopic: /^topic\/\d+\/?/,
isTag: /^tags\/[\s\S]+\/?/,
isUserPage: /^user\/[^\/]+(\/[\w]+)?/
};
Meta.title.build = function (urlFragment, language, locals, callback) {
var uri = '';
try {
uri = decodeURIComponent(urlFragment);
} catch(e) {
winston.error('Invalid url fragment : ' + urlFragment, e.stack);
return callback(null, Meta.config.browserTitle || 'NodeBB');
}
Meta.title.parseFragment(uri, language, locals, function(err, title) {
if (err) {
title = Meta.config.browserTitle || 'NodeBB';
} else {
title = (title ? title + ' | ' : '') + (Meta.config.browserTitle || 'NodeBB');
}
callback(null, title);
});
};
Meta.title.parseFragment = function (urlFragment, language, locals, callback) {
urlFragment = validator.escape(urlFragment);
var translated = ['', 'recent', 'unread', 'users', 'notifications'];
if (translated.indexOf(urlFragment) !== -1) {
if (!urlFragment.length) {
urlFragment = 'home';
}
translator.translate('[[pages:' + urlFragment + ']]', language, function(translated) {
callback(null, translated);
});
} else if (tests.isCategory.test(urlFragment)) {
var cid = urlFragment.match(/category\/(\d+)/)[1];
require('../categories').getCategoryField(cid, 'name', callback);
} else if (tests.isTopic.test(urlFragment)) {
var tid = urlFragment.match(/topic\/(\d+)/)[1];
require('../topics').getTopicField(tid, 'title', callback);
} else if (tests.isTag.test(urlFragment)) {
var tag = urlFragment.match(/tags\/([\s\S]+)/)[1];
translator.translate('[[pages:tags, ' + tag + ']]', language, function(translated) {
callback(null, translated);
});
} else if (tests.isUserPage.test(urlFragment)) {
var matches = urlFragment.match(/user\/([^\/]+)\/?([\w]+)?/),
userslug = matches[1],
subpage = matches[2];
user.getUsernameByUserslug(userslug, function(err, username) {
if (err) {
return callback(err);
}
if (locals.notFound) {
username = '[[error:no-user]]';
}
if (!subpage) {
return callback(null, username);
}
translator.translate('[[pages:user.' + subpage + ', ' + username + ']]', language, function(translated) {
callback(null, translated);
});
});
} else {
callback(null);
}
};
};