Yuki Takei 4 лет назад
Родитель
Сommit
0212426ea6

+ 2 - 3
src/client/js/components/PageEditor/CodeMirrorEditor.jsx

@@ -56,6 +56,7 @@ require('codemirror/addon/fold/brace-fold');
 require('codemirror/addon/display/placeholder');
 require('codemirror/mode/gfm/gfm');
 require('../../util/codemirror/autorefresh.ext');
+require('../../util/codemirror/gfm-growi.mode');
 
 
 const MARKDOWN_TABLE_ACTIVATED_CLASS = 'markdown-table-activated';
@@ -820,7 +821,7 @@ export default class CodeMirrorEditor extends AbstractEditor {
   }
 
   render() {
-    const mode = this.state.isGfmMode ? 'gfm' : undefined;
+    const mode = this.state.isGfmMode ? 'gfm-growi' : undefined;
     const additionalClasses = Array.from(this.state.additionalClassSet).join(' ');
 
     const placeholder = this.state.isGfmMode ? 'Input with Markdown..' : 'Input with Plane Text..';
@@ -857,8 +858,6 @@ export default class CodeMirrorEditor extends AbstractEditor {
             gutters: this.props.lineNumbers ? ['CodeMirror-linenumbers', 'CodeMirror-foldgutter'] : [],
             // match-highlighter, matchesonscrollbar, annotatescrollbar options
             highlightSelectionMatches: { annotateScrollbar: true },
-            // markdown mode options
-            highlightFormatting: true,
             // continuelist, indentlist
             extraKeys: {
               Enter: this.handleEnterKey,

+ 18 - 0
src/client/js/util/codemirror/gfm-growi.mode.js

@@ -0,0 +1,18 @@
+// https://discuss.codemirror.net/t/cm-header-margin-padding-height/75/5
+window.CodeMirror.defineMode('gfm-growi', (cmConfig, modeCfg) => {
+  // based on Markdown (GitHub-flavour) mode
+  // https://codemirror.net/doc/manual.html#option_mode
+  // https://codemirror.net/mode/index.html
+  modeCfg.name = 'gfm';
+  modeCfg.highlightFormatting = true;
+  const mode = window.CodeMirror.getMode(cmConfig, modeCfg);
+
+  const origToken = mode.token;
+  mode.token = function(stream, state) {
+    let classes = origToken(stream, state) || '';
+    classes = classes.replace(/(^| )(header\S*)/g, '$1line-cm-$2');
+    return /^\s*$/.test(classes) ? null : classes;
+  };
+
+  return mode;
+});