|
|
@@ -1,6 +1,8 @@
|
|
|
import React from 'react';
|
|
|
import PropTypes from 'prop-types';
|
|
|
|
|
|
+import Modal from 'react-bootstrap/es/Modal';
|
|
|
+
|
|
|
import AbstractEditor from './AbstractEditor';
|
|
|
|
|
|
import urljoin from 'url-join';
|
|
|
@@ -59,7 +61,8 @@ export default class CodeMirrorEditor extends AbstractEditor {
|
|
|
isGfmMode: this.props.isGfmMode,
|
|
|
isEnabledEmojiAutoComplete: false,
|
|
|
isLoadingKeymap: false,
|
|
|
- isCheatsheatShown: this.props.isGfmMode && this.props.value.length === 0,
|
|
|
+ isSimpleCheatsheetShown: this.props.isGfmMode && this.props.value.length === 0,
|
|
|
+ isCheatsheetModalShown: false,
|
|
|
additionalClassSet: new Set(),
|
|
|
};
|
|
|
|
|
|
@@ -82,6 +85,7 @@ export default class CodeMirrorEditor extends AbstractEditor {
|
|
|
this.changeHandler = this.changeHandler.bind(this);
|
|
|
|
|
|
this.renderLoadingKeymapOverlay = this.renderLoadingKeymapOverlay.bind(this);
|
|
|
+ this.renderCheatsheetModalButton = this.renderCheatsheetModalButton.bind(this);
|
|
|
}
|
|
|
|
|
|
init() {
|
|
|
@@ -418,9 +422,9 @@ export default class CodeMirrorEditor extends AbstractEditor {
|
|
|
this.props.onChange(value);
|
|
|
}
|
|
|
|
|
|
- // update isCheatsheatShown
|
|
|
- const isCheatsheatShown = this.state.isGfmMode && value.length === 0;
|
|
|
- this.setState({isCheatsheatShown});
|
|
|
+ // update isSimpleCheatsheetShown
|
|
|
+ const isSimpleCheatsheetShown = this.state.isGfmMode && value.length === 0;
|
|
|
+ this.setState({isSimpleCheatsheetShown});
|
|
|
|
|
|
// Emoji AutoComplete
|
|
|
if (this.state.isEnabledEmojiAutoComplete) {
|
|
|
@@ -465,37 +469,38 @@ export default class CodeMirrorEditor extends AbstractEditor {
|
|
|
: '';
|
|
|
}
|
|
|
|
|
|
- renderCheatSheetOverlay() {
|
|
|
+ renderSimpleCheatsheet() {
|
|
|
return (
|
|
|
- <div className="overlay overlay-gfm-cheatsheet mt-1 p-3 pt-3">
|
|
|
- <div className="panel panel-default mb-0">
|
|
|
- <div className="panel-heading"><i className="icon-fw icon-question"/>Markdown Help</div>
|
|
|
- <div className="panel-body small">
|
|
|
- <div className="row">
|
|
|
- <div className="col-xs-6">
|
|
|
- <p>
|
|
|
- # 見出し1<br />
|
|
|
- ## 見出し2<br />
|
|
|
- ### 見出し3
|
|
|
- </p>
|
|
|
- <p><i>*斜体*</i> <b>**強調**</b></p>
|
|
|
- <p>
|
|
|
- - リスト1<br />
|
|
|
- - リスト2
|
|
|
- </p>
|
|
|
- </div>
|
|
|
- <div className="col-xs-6">
|
|
|
- <p>
|
|
|
- [リンク](http://..)<br />
|
|
|
- [/ページ名/子ページ名]
|
|
|
- </p>
|
|
|
- <p>
|
|
|
- ```javascript:index.js<br />
|
|
|
- writeCode();<br />
|
|
|
- ```
|
|
|
- </p>
|
|
|
- <p>行末にスペース2つ[ ][ ]<br />で改行</p>
|
|
|
- </div>
|
|
|
+ <div className="panel panel-default gfm-cheatsheet mb-0">
|
|
|
+ <div className="panel-heading"><i className="icon-fw icon-question"/>Markdown Help</div>
|
|
|
+ <div className="panel-body small p-b-0">
|
|
|
+ <div className="row">
|
|
|
+ <div className="col-xs-6">
|
|
|
+ <p>
|
|
|
+ # 見出し1<br />
|
|
|
+ ## 見出し2
|
|
|
+ </p>
|
|
|
+ <p><i>*斜体*</i> <b>**強調**</b></p>
|
|
|
+ <p>
|
|
|
+ [リンク](http://..)<br />
|
|
|
+ [/ページ名/子ページ名]
|
|
|
+ </p>
|
|
|
+ <p>
|
|
|
+ ```javascript:index.js<br />
|
|
|
+ writeCode();<br />
|
|
|
+ ```
|
|
|
+ </p>
|
|
|
+ </div>
|
|
|
+ <div className="col-xs-6">
|
|
|
+ <p>
|
|
|
+ - リスト 1<br />
|
|
|
+ - リスト 1_1<br />
|
|
|
+ - リスト 2<br />
|
|
|
+ 1. 番号付きリスト 1
|
|
|
+ 1. 番号付きリスト 2
|
|
|
+ </p>
|
|
|
+ <hr />
|
|
|
+ <p>行末にスペース2つ[ ][ ]<br />で改行</p>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
@@ -503,6 +508,122 @@ export default class CodeMirrorEditor extends AbstractEditor {
|
|
|
);
|
|
|
}
|
|
|
|
|
|
+ renderCheatsheetModalBody() {
|
|
|
+ return (
|
|
|
+ <div className="row small">
|
|
|
+ <div className="col-sm-6">
|
|
|
+ <h4>Header</h4>
|
|
|
+ <ul className="hljs">
|
|
|
+ <li><code># </code>見出し1</li>
|
|
|
+ <li><code>## </code>見出し2</li>
|
|
|
+ <li><code>### </code>見出し3</li>
|
|
|
+ </ul>
|
|
|
+ <h4>Block</h4>
|
|
|
+ <p className="mb-1"><code>[空白行]</code>を挟むことで段落になります</p>
|
|
|
+ <ul className="hljs">
|
|
|
+ <li>text</li>
|
|
|
+ <li></li>
|
|
|
+ <li>text</li>
|
|
|
+ </ul>
|
|
|
+ <h4>Line breaks</h4>
|
|
|
+ <p className="mb-1">段落中、<code>[space][space]</code>(スペース2つ) で改行されます</p>
|
|
|
+ <ul className="hljs">
|
|
|
+ <li>text<code> </code><code> </code></li>
|
|
|
+ <li>text</li>
|
|
|
+ </ul>
|
|
|
+ <h4>Typography</h4>
|
|
|
+ <ul className="hljs">
|
|
|
+ <li><i>*イタリック*</i></li>
|
|
|
+ <li><b>**ボールド**</b></li>
|
|
|
+ <li><i><b>***イタリックボールド***</b></i></li>
|
|
|
+ <li>~~取り消し線~~ => <s>striked text</s></li>
|
|
|
+ </ul>
|
|
|
+ <h4>Link</h4>
|
|
|
+ <ul className="hljs">
|
|
|
+ <li>[Google](https://www.google.co.jp/)</li>
|
|
|
+ <li>[/Page1/ChildPage1]</li>
|
|
|
+ </ul>
|
|
|
+ <h4>コードハイライト</h4>
|
|
|
+ <ul className="hljs">
|
|
|
+ <li>```javascript:index.js</li>
|
|
|
+ <li>writeCode();</li>
|
|
|
+ <li>```</li>
|
|
|
+ </ul>
|
|
|
+ </div>
|
|
|
+ <div className="col-sm-6">
|
|
|
+ <h4>リスト</h4>
|
|
|
+ <ul className="hljs">
|
|
|
+ <li>- リスト 1</li>
|
|
|
+ <li> - リスト 1_1</li>
|
|
|
+ <li>- リスト 2</li>
|
|
|
+ </ul>
|
|
|
+ <ul className="hljs">
|
|
|
+ <li>1. 番号付きリスト 1</li>
|
|
|
+ <li>1. 番号付きリスト 2</li>
|
|
|
+ </ul>
|
|
|
+ <ul className="hljs">
|
|
|
+ <li>- [ ] タスク(チェックなし)</li>
|
|
|
+ <li>- [x] タスク(チェック付き)</li>
|
|
|
+ </ul>
|
|
|
+ <h4>引用</h4>
|
|
|
+ <ul className="hljs">
|
|
|
+ <li>> 複数行の引用文を</li>
|
|
|
+ <li>> 書くことができます</li>
|
|
|
+ </ul>
|
|
|
+ <ul className="hljs">
|
|
|
+ <li>>> 多重引用</li>
|
|
|
+ <li>>>> 多重引用</li>
|
|
|
+ <li>>>>> 多重引用</li>
|
|
|
+ </ul>
|
|
|
+ <h4>Table</h4>
|
|
|
+ <ul className="hljs text-center">
|
|
|
+ <li>| 左寄せ | 中央寄せ | 右寄せ |</li>
|
|
|
+ <li>|:-----------|:----------:|-----------:|</li>
|
|
|
+ <li>|column 1 | column 2 | column 3|</li>
|
|
|
+ <li>|column 1 | column 2 | column 3|</li>
|
|
|
+ </ul>
|
|
|
+ <h4>Images</h4>
|
|
|
+ <p className="mb-1"><code> </code> で<span className="text-info"><img></span>タグを挿入できます</p>
|
|
|
+ <ul className="hljs">
|
|
|
+ <li></li>
|
|
|
+ </ul>
|
|
|
+
|
|
|
+ <hr />
|
|
|
+ <a href="/Sandbox" className="btn btn-info btn-block" target="_blank">
|
|
|
+ <i className="icon-share-alt"/> Sandbox を開く
|
|
|
+ </a>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ renderCheatsheetModalButton() {
|
|
|
+ const showCheatsheetModal = () => {
|
|
|
+ this.setState({isCheatsheetModalShown: true});
|
|
|
+ };
|
|
|
+
|
|
|
+ const hideCheatsheetModal = () => {
|
|
|
+ this.setState({isCheatsheetModalShown: false});
|
|
|
+ };
|
|
|
+
|
|
|
+ return (
|
|
|
+ <React.Fragment>
|
|
|
+ <Modal className="modal-gfm-cheatsheet" show={this.state.isCheatsheetModalShown} onHide={() => { hideCheatsheetModal() }}>
|
|
|
+ <Modal.Header closeButton>
|
|
|
+ <Modal.Title><i className="icon-fw icon-question"/>Markdown Help</Modal.Title>
|
|
|
+ </Modal.Header>
|
|
|
+ <Modal.Body className="pt-1">
|
|
|
+ { this.renderCheatsheetModalBody() }
|
|
|
+ </Modal.Body>
|
|
|
+ </Modal>
|
|
|
+
|
|
|
+ <a className="gfm-cheatsheet-modal-link text-muted small" onClick={() => { showCheatsheetModal() }}>
|
|
|
+ <i className="icon-question" /> Markdown
|
|
|
+ </a>
|
|
|
+ </React.Fragment>
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
render() {
|
|
|
const mode = this.state.isGfmMode ? 'gfm' : undefined;
|
|
|
const defaultEditorOptions = {
|
|
|
@@ -573,7 +694,11 @@ export default class CodeMirrorEditor extends AbstractEditor {
|
|
|
/>
|
|
|
|
|
|
{ this.renderLoadingKeymapOverlay() }
|
|
|
- { this.state.isCheatsheatShown && this.renderCheatSheetOverlay() }
|
|
|
+
|
|
|
+ <div className="overlay overlay-gfm-cheatsheet mt-1 p-3 pt-3">
|
|
|
+ { this.state.isSimpleCheatsheetShown && this.renderSimpleCheatsheet() }
|
|
|
+ { !this.state.isSimpleCheatsheetShown && this.renderCheatsheetModalButton() }
|
|
|
+ </div>
|
|
|
|
|
|
</React.Fragment>;
|
|
|
}
|