zulip/static/js/hash_util.js

137 lines
4.0 KiB
JavaScript

var hash_util = (function () {
var exports = {};
// Some browsers zealously URI-decode the contents of
// window.location.hash. So we hide our URI-encoding
// by replacing % with . (like MediaWiki).
exports.encodeHashComponent = function (str) {
return encodeURIComponent(str)
.replace(/\./g, '%2E')
.replace(/%/g, '.');
};
exports.encode_operand = function (operator, operand) {
if (operator === 'group-pm-with' || operator === 'pm-with' || operator === 'sender') {
var slug = people.emails_to_slug(operand);
if (slug) {
return slug;
}
}
if (operator === 'stream') {
return exports.encode_stream_name(operand);
}
return exports.encodeHashComponent(operand);
};
exports.encode_stream_name = function (operand) {
// stream_data prefixes the stream id, but it does not do the
// URI encoding piece
operand = stream_data.name_to_slug(operand);
return exports.encodeHashComponent(operand);
};
exports.decodeHashComponent = function (str) {
return decodeURIComponent(str.replace(/\./g, '%'));
};
exports.decode_operand = function (operator, operand) {
if (operator === 'group-pm-with' || operator === 'pm-with' || operator === 'sender') {
var emails = people.slug_to_emails(operand);
if (emails) {
return emails;
}
}
operand = exports.decodeHashComponent(operand);
if (operator === 'stream') {
return stream_data.slug_to_name(operand);
}
return operand;
};
exports.by_stream_uri = function (stream) {
return "#narrow/stream/" + exports.encode_stream_name(stream);
};
exports.by_stream_subject_uri = function (stream, subject) {
return "#narrow/stream/" + exports.encode_stream_name(stream) +
"/subject/" + exports.encodeHashComponent(subject);
};
// Encodes an operator list into the
// corresponding hash: the # component
// of the narrow URL
exports.operators_to_hash = function (operators) {
var hash = '#';
if (operators !== undefined) {
hash = '#narrow';
_.each(operators, function (elem) {
// Support legacy tuples.
var operator = elem.operator;
var operand = elem.operand;
var sign = elem.negated ? '-' : '';
hash += '/' + sign + exports.encodeHashComponent(operator)
+ '/' + exports.encode_operand(operator, operand);
});
}
return hash;
};
exports.by_sender_uri = function (reply_to) {
return exports.operators_to_hash([
{operator: 'sender', operand: reply_to},
]);
};
exports.pm_with_uri = function (reply_to) {
return exports.operators_to_hash([
{operator: 'pm-with', operand: reply_to},
]);
};
exports.huddle_with_uri = function (user_ids_string) {
// This method is convenient for callers
// that have already converted emails to a comma-delimited
// list of user_ids. We should be careful to keep this
// consistent with hash_util.decode_operand.
return "#narrow/pm-with/" + user_ids_string + '-group';
};
exports.by_conversation_and_time_uri = function (message) {
var absolute_url = window.location.protocol + "//" +
window.location.host + "/" + window.location.pathname.split('/')[1];
if (message.type === "stream") {
return absolute_url + "#narrow/stream/" +
exports.encode_stream_name(message.stream) +
"/subject/" + exports.encodeHashComponent(message.subject) +
"/near/" + exports.encodeHashComponent(message.id);
}
// Include your own email in this URI if it's not there already
var all_emails = message.reply_to;
if (all_emails.indexOf(people.my_current_email()) === -1) {
all_emails += "," + people.my_current_email();
}
return absolute_url + "#narrow/pm-with/" +
exports.encodeHashComponent(all_emails) +
"/near/" + exports.encodeHashComponent(message.id);
};
return exports;
}());
if (typeof module !== 'undefined') {
module.exports = hash_util;
}
window.hash_util = hash_util;