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;