diff --git a/src/RichText.js b/src/RichText.js
index 073d873945..aebd6f5765 100644
--- a/src/RichText.js
+++ b/src/RichText.js
@@ -20,6 +20,8 @@ const MARKDOWN_REGEX = {
LINK: /(?:\[([^\]]+)\]\(([^\)]+)\))|\<(\w+:\/\/[^\>]+)\>/g,
ITALIC: /([\*_])([\w\s]+?)\1/g,
BOLD: /([\*_])\1([\w\s]+?)\1\1/g,
+ HR: /(\n|^)((-|\*|_) *){3,}(\n|$)/g,
+ CODE: /`[^`]*`/g,
};
const USERNAME_REGEX = /@\S+:\S+/g;
@@ -119,7 +121,7 @@ export function getScopedRTDecorators(scope: any): CompositeDecorator {
}
export function getScopedMDDecorators(scope: any): CompositeDecorator {
- let markdownDecorators = ['BOLD', 'ITALIC'].map(
+ let markdownDecorators = ['HR', 'BOLD', 'ITALIC', 'CODE'].map(
(style) => ({
strategy: (contentBlock, callback) => {
return findWithRegex(MARKDOWN_REGEX[style], contentBlock, callback);
diff --git a/src/UserSettingsStore.js b/src/UserSettingsStore.js
index f4eb4f0d83..3e0c7127c1 100644
--- a/src/UserSettingsStore.js
+++ b/src/UserSettingsStore.js
@@ -130,9 +130,9 @@ module.exports = {
return event ? event.getContent() : {};
},
- getSyncedSetting: function(type) {
+ getSyncedSetting: function(type, defaultValue = null) {
var settings = this.getSyncedSettings();
- return settings[type];
+ return settings.hasOwnProperty(type) ? settings[type] : null;
},
setSyncedSetting: function(type, value) {
diff --git a/src/components/views/rooms/MessageComposer.js b/src/components/views/rooms/MessageComposer.js
index dbc970511a..971024eb57 100644
--- a/src/components/views/rooms/MessageComposer.js
+++ b/src/components/views/rooms/MessageComposer.js
@@ -21,6 +21,7 @@ var Modal = require('../../../Modal');
var sdk = require('../../../index');
var dis = require('../../../dispatcher');
import Autocomplete from './Autocomplete';
+import classNames from 'classnames';
import UserSettingsStore from '../../../UserSettingsStore';
@@ -48,9 +49,10 @@ export default class MessageComposer extends React.Component {
inputState: {
style: [],
blockType: null,
- isRichtextEnabled: true,
+ isRichtextEnabled: UserSettingsStore.getSyncedSetting('MessageComposerInput.isRichTextEnabled', true),
+ wordCount: 0,
},
- showFormatting: false,
+ showFormatting: UserSettingsStore.getSyncedSetting('MessageComposer.showFormatting', false),
};
}
@@ -168,17 +170,20 @@ export default class MessageComposer extends React.Component {
}
}
- onFormatButtonClicked(name: "bold" | "italic" | "strike" | "quote" | "bullet" | "numbullet", event) {
+ onFormatButtonClicked(name: "bold" | "italic" | "strike" | "code" | "underline" | "quote" | "bullet" | "numbullet", event) {
event.preventDefault();
this.messageComposerInput.onFormatButtonClicked(name, event);
}
onToggleFormattingClicked() {
+ UserSettingsStore.setSyncedSetting('MessageComposer.showFormatting', !this.state.showFormatting);
this.setState({showFormatting: !this.state.showFormatting});
+ this.messageComposerInput.focus();
}
onToggleMarkdownClicked() {
this.messageComposerInput.enableRichtext(!this.state.inputState.isRichtextEnabled);
+ this.messageComposerInput.focus();
}
render() {
@@ -238,7 +243,8 @@ export default class MessageComposer extends React.Component {
title="Show Text Formatting Toolbar"
src="img/button-text-formatting.svg"
onClick={this.onToggleFormattingClicked}
- style={{visibility: this.state.showFormatting ? 'hidden' : 'visible'}}
+ style={{visibility: this.state.showFormatting ||
+ !UserSettingsStore.isFeatureEnabled('rich_text_editor') ? 'hidden' : 'visible'}}
key="controls_formatting" />
);
@@ -281,12 +287,21 @@ export default class MessageComposer extends React.Component {
const {style, blockType} = this.state.inputState;
- const formatButtons = ["bold", "italic", "strike", "quote", "bullet", "numbullet"].map(
+ const formatButtons = ["bold", "italic", "strike", "underline", "code", "quote", "bullet", "numbullet"].map(
name => {
const active = style.includes(name) || blockType === name;
const suffix = active ? '-o-n' : '';
const onFormatButtonClicked = this.onFormatButtonClicked.bind(this, name);
- return ;
+ const disabled = !this.state.inputState.isRichtextEnabled && ['strike', 'underline'].includes(name);
+ const className = classNames("mx_MessageComposer_format_button", {
+ mx_MessageComposer_format_button_disabled: disabled,
+ });
+ return
;
},
);
@@ -299,18 +314,21 @@ export default class MessageComposer extends React.Component {
{UserSettingsStore.isFeatureEnabled('rich_text_editor') ?
-