linkify vector.im URLs directly into the app, both from HTML and non-HTML messages

This commit is contained in:
Matthew Hodgson 2016-03-20 03:05:07 +00:00
parent 68a391e24b
commit 1aed9ccbf4
2 changed files with 40 additions and 9 deletions

View file

@ -19,6 +19,7 @@ limitations under the License.
var React = require('react'); var React = require('react');
var sanitizeHtml = require('sanitize-html'); var sanitizeHtml = require('sanitize-html');
var highlight = require('highlight.js'); var highlight = require('highlight.js');
var linkifyMatrix = require('./linkify-matrix');
var sanitizeHtmlParams = { var sanitizeHtmlParams = {
allowedTags: [ allowedTags: [
@ -44,8 +45,17 @@ var sanitizeHtmlParams = {
allowedSchemesByTag: {}, allowedSchemesByTag: {},
transformTags: { // custom to matrix transformTags: { // custom to matrix
// add blank targets to all hyperlinks // add blank targets to all hyperlinks except vector URLs
'a': sanitizeHtml.simpleTransform('a', { target: '_blank'} ) 'a': function(tagName, attribs) {
// XXX: use matrix.to instead and deduplicate regexp with linkify-matrix.js
var m = attribs.href.match(linkifyMatrix.VECTOR_URL_PATTERN);
if (m) {
return { tagName: 'a', attribs: { href: m[4] } };
}
else {
return { tagName: 'a', attribs: { href: attribs.href, target: '_blank'} };
}
},
}, },
}; };

View file

@ -98,6 +98,8 @@ function matrixLinkify(linkify) {
matrixLinkify.onUserClick = function(e, userId) { e.preventDefault(); }; matrixLinkify.onUserClick = function(e, userId) { e.preventDefault(); };
matrixLinkify.onAliasClick = function(e, roomAlias) { e.preventDefault(); }; matrixLinkify.onAliasClick = function(e, roomAlias) { e.preventDefault(); };
matrixLinkify.VECTOR_URL_PATTERN = /(https?:\/\/)?(www\.)?vector\.im\/(beta|staging|develop)?\/(#.*)/;
matrixLinkify.options = { matrixLinkify.options = {
events: function (href, type) { events: function (href, type) {
switch (type) { switch (type) {
@ -118,14 +120,33 @@ matrixLinkify.options = {
formatHref: function (href, type) { formatHref: function (href, type) {
switch (type) { switch (type) {
case 'roomalias': case 'roomalias':
return '#/room/' + href; return '#/room/' + href;
case 'userid': case 'userid':
return '#'; return '#';
default: case 'url':
return href; // intercept vector links directly into the app
// FIXME: use matrix.to asap, as this is fragile as sin
var m = href.match(matrixLinkify.VECTOR_URL_PATTERN);
return m ? m[4] : href;
default:
return href;
} }
} },
target: function(href, type) {
if (type === 'url') {
if (href.match(matrixLinkify.VECTOR_URL_PATTERN)) {
return null;
}
else {
return '_blank';
}
}
else {
return '_blank';
}
},
}; };
module.exports = matrixLinkify; module.exports = matrixLinkify;