diff --git a/src/HtmlUtils.js b/src/HtmlUtils.js index 6db2b08fd1..1412112260 100644 --- a/src/HtmlUtils.js +++ b/src/HtmlUtils.js @@ -19,6 +19,7 @@ limitations under the License. var React = require('react'); var sanitizeHtml = require('sanitize-html'); var highlight = require('highlight.js'); +var linkifyMatrix = require('./linkify-matrix'); var sanitizeHtmlParams = { allowedTags: [ @@ -44,8 +45,17 @@ var sanitizeHtmlParams = { allowedSchemesByTag: {}, transformTags: { // custom to matrix - // add blank targets to all hyperlinks - 'a': sanitizeHtml.simpleTransform('a', { target: '_blank'} ) + // add blank targets to all hyperlinks except vector URLs + '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'} }; + } + }, }, }; diff --git a/src/linkify-matrix.js b/src/linkify-matrix.js index 7fb043f800..51e4af044f 100644 --- a/src/linkify-matrix.js +++ b/src/linkify-matrix.js @@ -98,6 +98,8 @@ function matrixLinkify(linkify) { matrixLinkify.onUserClick = function(e, userId) { e.preventDefault(); }; matrixLinkify.onAliasClick = function(e, roomAlias) { e.preventDefault(); }; +matrixLinkify.VECTOR_URL_PATTERN = /(https?:\/\/)?(www\.)?vector\.im\/(beta|staging|develop)?\/(#.*)/; + matrixLinkify.options = { events: function (href, type) { switch (type) { @@ -118,14 +120,33 @@ matrixLinkify.options = { formatHref: function (href, type) { switch (type) { - case 'roomalias': - return '#/room/' + href; - case 'userid': - return '#'; - default: - return href; + case 'roomalias': + return '#/room/' + href; + case 'userid': + return '#'; + case 'url': + // 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;