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.