diff --git a/src/HtmlUtils.js b/src/HtmlUtils.js
index 7dd68e5c61..a58ea25c8a 100644
--- a/src/HtmlUtils.js
+++ b/src/HtmlUtils.js
@@ -23,7 +23,6 @@ import ReplyThread from "./components/views/elements/ReplyThread";
import React from 'react';
import sanitizeHtml from 'sanitize-html';
-import highlight from 'highlight.js';
import * as linkify from 'linkifyjs';
import linkifyMatrix from './linkify-matrix';
import _linkifyElement from 'linkifyjs/element';
@@ -467,11 +466,12 @@ export function bodyToHtml(content, highlights, opts={}) {
/**
* Linkifies the given string. This is a wrapper around 'linkifyjs/string'.
*
- * @param {string} str
- * @returns {string}
+ * @param {string} str string to linkify
+ * @param {object} [options] Options for linkifyString. Default: linkifyMatrix.options
+ * @returns {string} Linkified string
*/
-export function linkifyString(str) {
- return _linkifyString(str);
+export function linkifyString(str, options = linkifyMatrix.options) {
+ return _linkifyString(str, options);
}
/**
@@ -489,10 +489,11 @@ export function linkifyElement(element, options = linkifyMatrix.options) {
* Linkify the given string and sanitize the HTML afterwards.
*
* @param {string} dirtyHtml The HTML string to sanitize and linkify
+ * @param {object} [options] Options for linkifyString. Default: linkifyMatrix.options
* @returns {string}
*/
-export function linkifyAndSanitizeHtml(dirtyHtml) {
- return sanitizeHtml(linkifyString(dirtyHtml), sanitizeHtmlParams);
+export function linkifyAndSanitizeHtml(dirtyHtml, options = linkifyMatrix.options) {
+ return sanitizeHtml(linkifyString(dirtyHtml, options), sanitizeHtmlParams);
}
/**
diff --git a/src/linkify-matrix.js b/src/linkify-matrix.js
index 8870b2d431..2d2b9c62a5 100644
--- a/src/linkify-matrix.js
+++ b/src/linkify-matrix.js
@@ -16,7 +16,7 @@ limitations under the License.
*/
import {baseUrl} from "./utils/permalinks/SpecPermalinkConstructor";
-import {tryTransformPermalinkToLocalHref} from "./utils/permalinks/Permalinks";
+import {tryTransformEntityToPermalink, tryTransformPermalinkToLocalHref} from "./utils/permalinks/Permalinks";
function matrixLinkify(linkify) {
// Text tokens
@@ -221,7 +221,7 @@ matrixLinkify.options = {
case 'userid':
case 'groupid':
default: {
- return tryTransformPermalinkToLocalHref(href);
+ return tryTransformEntityToPermalink(href);
}
}
},
diff --git a/src/utils/permalinks/Permalinks.js b/src/utils/permalinks/Permalinks.js
index 1174e59da6..466d1ed57d 100644
--- a/src/utils/permalinks/Permalinks.js
+++ b/src/utils/permalinks/Permalinks.js
@@ -290,6 +290,25 @@ export function isPermalinkHost(host: string): boolean {
return getPermalinkConstructor().isPermalinkHost(host);
}
+/**
+ * Transforms an entity (permalink, room alias, user ID, etc) into a local URL
+ * if possible. If the given entity is not found to be valid enough to be converted
+ * then a null value will be returned.
+ * @param {string} entity The entity to transform.
+ * @returns {string|null} The transformed permalink or null if unable.
+ */
+export function tryTransformEntityToPermalink(entity: string): string {
+ if (!entity) return null;
+
+ // Check to see if it is a bare entity for starters
+ if (entity[0] === '#' || entity[0] === '!') return makeRoomPermalink(entity);
+ if (entity[0] === '@') return makeUserPermalink(entity);
+ if (entity[0] === '+') return makeGroupPermalink(entity);
+
+ // Then try and merge it into a permalink
+ return tryTransformPermalinkToLocalHref(entity);
+}
+
/**
* Transforms a permalink (or possible permalink) into a local URL if possible. If
* the given permalink is found to not be a permalink, it'll be returned unaltered.