From 861b46d605930a392dab0fcd26639fb4bef1a494 Mon Sep 17 00:00:00 2001 From: Harrison Healey Date: Mon, 4 Jun 2018 10:25:34 -0400 Subject: [PATCH] MM-9547 Added CustomUrlSchemes option (#1718) * MM-9547 Added CustomUrlSchemes option * Switched mattermost-redux back to master --- app/components/markdown/index.js | 2 ++ app/components/markdown/markdown.js | 16 +++++++++++++++- app/utils/url.js | 6 ++++++ package-lock.json | 8 ++++---- package.json | 5 +++-- 5 files changed, 30 insertions(+), 7 deletions(-) diff --git a/app/components/markdown/index.js b/app/components/markdown/index.js index 0da00c0f1..6aaf67b21 100644 --- a/app/components/markdown/index.js +++ b/app/components/markdown/index.js @@ -3,12 +3,14 @@ import {connect} from 'react-redux'; +import {getAutolinkedUrlSchemes} from 'mattermost-redux/selectors/entities/general'; import {getTheme} from 'mattermost-redux/selectors/entities/preferences'; import Markdown from './markdown'; function mapStateToProps(state) { return { + autolinkedUrlSchemes: getAutolinkedUrlSchemes(state), theme: getTheme(state), }; } diff --git a/app/components/markdown/markdown.js b/app/components/markdown/markdown.js index f614a1d24..34eba5f22 100644 --- a/app/components/markdown/markdown.js +++ b/app/components/markdown/markdown.js @@ -17,6 +17,7 @@ import Emoji from 'app/components/emoji'; import FormattedText from 'app/components/formatted_text'; import CustomPropTypes from 'app/constants/custom_prop_types'; import {blendColors, concatStyles, makeStyleSheetFromTheme} from 'app/utils/theme'; +import {getScheme} from 'app/utils/url'; import MarkdownBlockQuote from './markdown_block_quote'; import MarkdownCodeBlock from './markdown_code_block'; @@ -32,6 +33,7 @@ import {addListItemIndices, pullOutImages} from './transform'; export default class Markdown extends PureComponent { static propTypes = { + autolinkedUrlSchemes: PropTypes.array.isRequired, baseTextStyle: CustomPropTypes.Style, blockStyles: PropTypes.object, isEdited: PropTypes.bool, @@ -54,10 +56,22 @@ export default class Markdown extends PureComponent { constructor(props) { super(props); - this.parser = new Parser(); + this.parser = this.createParser(); this.renderer = this.createRenderer(); } + createParser = () => { + return new Parser({ + urlFilter: this.urlFilter, + }); + } + + urlFilter = (url) => { + const scheme = getScheme(url); + + return !scheme || this.props.autolinkedUrlSchemes.indexOf(scheme) !== -1; + } + createRenderer = () => { return new Renderer({ renderers: { diff --git a/app/utils/url.js b/app/utils/url.js index ed2ef72b0..255b262f1 100644 --- a/app/utils/url.js +++ b/app/utils/url.js @@ -88,3 +88,9 @@ export function cleanUpUrlable(input) { cleaned = cleaned.replace(/-+$/, ''); return cleaned; } + +export function getScheme(url) { + const match = (/([a-z0-9+.-]+):/i).exec(url); + + return match && match[1]; +} diff --git a/package-lock.json b/package-lock.json index 91f3ee773..521700b0a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4932,8 +4932,8 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" }, "commonmark": { - "version": "github:mattermost/commonmark.js#21742b9d51070b6abba82d88590a0c51ee552a47", - "from": "commonmark@github:mattermost/commonmark.js#21742b9d51070b6abba82d88590a0c51ee552a47", + "version": "github:mattermost/commonmark.js#e5c34706cafa2924370772ff47937b833648a6de", + "from": "github:mattermost/commonmark.js#e5c34706cafa2924370772ff47937b833648a6de", "requires": { "entities": "~ 1.1.1", "mdurl": "~ 1.0.1", @@ -9878,8 +9878,8 @@ } }, "mattermost-redux": { - "version": "github:mattermost/mattermost-redux#1cc600992b9560a4d41cc622352cf440ae905ab1", - "from": "github:mattermost/mattermost-redux#1cc600992b9560a4d41cc622352cf440ae905ab1", + "version": "github:mattermost/mattermost-redux#74440af4513c2a77c3a17ecede72cb5c9cd59774", + "from": "github:mattermost/mattermost-redux#74440af4513c2a77c3a17ecede72cb5c9cd59774", "requires": { "deep-equal": "1.0.1", "eslint-plugin-header": "1.2.0", diff --git a/package.json b/package.json index ef08f562c..28f0b2511 100644 --- a/package.json +++ b/package.json @@ -8,14 +8,15 @@ "private": true, "dependencies": { "analytics-react-native": "1.2.0", - "commonmark": "github:mattermost/commonmark.js#21742b9d51070b6abba82d88590a0c51ee552a47", + "commonmark": "github:mattermost/commonmark.js#e5c34706cafa2924370772ff47937b833648a6de", "commonmark-react-renderer": "mattermost/commonmark-react-renderer#86fa63f898802953842526c2030f3b63c5d1ae7a", "deep-equal": "1.0.1", "fuse.js": "^3.2.0", "intl": "1.2.5", "jail-monkey": "1.0.0", "jsc-android": "216113.0.3", - "mattermost-redux": "github:mattermost/mattermost-redux#1cc600992b9560a4d41cc622352cf440ae905ab1", + "mattermost-redux": "github:mattermost/mattermost-redux#74440af4513c2a77c3a17ecede72cb5c9cd59774", + "mime-db": "1.33.0", "prop-types": "15.6.1", "react": "16.3.2", "react-intl": "2.4.0",