diff --git a/browser/components/CodeEditor.js b/browser/components/CodeEditor.js index af546fbf..d5f9164f 100644 --- a/browser/components/CodeEditor.js +++ b/browser/components/CodeEditor.js @@ -25,9 +25,9 @@ import TurndownService from 'turndown' import {languageMaps} from '../lib/CMLanguageList' import snippetManager from '../lib/SnippetManager' import {generateInEditor, tocExistsInEditor} from 'browser/lib/markdown-toc-generator' -import Jsonlint from 'jsonlint-mod' import markdownlint from 'markdownlint' -import ConfigManager, {DEFAULT_CONFIG} from '../main/lib/ConfigManager' +import Jsonlint from 'jsonlint-mod' +import { DEFAULT_CONFIG } from '../main/lib/ConfigManager' CodeMirror.modeURL = '../node_modules/codemirror/mode/%N/%N.js' @@ -40,47 +40,6 @@ function translateHotkey (hotkey) { return hotkey.replace(/\s*\+\s*/g, '-').replace(/Command/g, 'Cmd').replace(/Control/g, 'Ctrl') } -const validatorOfMarkdown = (text, updateLinting) => { - const config = ConfigManager.get() - let markdownlintRules = config.editor.customMarkdownLintConfig - try { - Jsonlint.parse(markdownlintRules) - } catch (error) { - markdownlintRules = DEFAULT_CONFIG.editor.customMarkdownLintConfig - } - - const lintOptions = { - 'strings': { - 'content': text - }, - 'config': JSON.parse(markdownlintRules) - } - - return markdownlint(lintOptions, (err, result) => { - if (!err) { - const foundIssues = [] - result.content.map(item => { - let ruleNames = '' - item.ruleNames.map((ruleName, index) => { - ruleNames += ruleName - if (index === item.ruleNames.length - 1) { - ruleNames += ': ' - } else { - ruleNames += '/' - } - }) - foundIssues.push({ - from: CodeMirror.Pos(item.lineNumber, 0), - to: CodeMirror.Pos(item.lineNumber, 1), - message: ruleNames + item.ruleDescription, - severity: 'warning' - }) - }) - updateLinting(foundIssues) - } - }) -} - export default class CodeEditor extends React.Component { constructor (props) { super(props) @@ -127,6 +86,8 @@ export default class CodeEditor extends React.Component { this.searchHandler = (e, msg) => this.handleSearch(msg) this.searchState = null this.scrollToLineHandeler = this.scrollToLine.bind(this) + this.setCodeEditorLintConfig = this.setCodeEditorLintConfig.bind(this) + this.validatorOfMarkdown = this.validatorOfMarkdown.bind(this) this.formatTable = () => this.handleFormatTable() @@ -300,7 +261,6 @@ export default class CodeEditor extends React.Component { snippetManager.init() this.updateDefaultKeyMap() - const checkMarkdownNoteIsOpening = this.props.mode === 'Boost Flavored Markdown' this.value = this.props.value this.editor = CodeMirror(this.refs.root, { rulers: buildCMRulers(rulers, enableRulers), @@ -317,10 +277,7 @@ export default class CodeEditor extends React.Component { inputStyle: 'textarea', dragDrop: false, foldGutter: true, - lint: checkMarkdownNoteIsOpening ? { - 'getAnnotations': validatorOfMarkdown, - 'async': true - } : false, + lint: this.setCodeEditorLintConfig(), gutters: ['CodeMirror-linenumbers', 'CodeMirror-foldgutter', 'CodeMirror-lint-markers'], autoCloseBrackets: { pairs: this.props.matchingPairs, @@ -557,7 +514,8 @@ export default class CodeEditor extends React.Component { let needRefresh = false const { rulers, - enableRulers + enableRulers, + customMarkdownLintConfig } = this.props if (prevProps.mode !== this.props.mode) { this.setMode(this.props.mode) @@ -575,6 +533,11 @@ export default class CodeEditor extends React.Component { if (prevProps.keyMap !== this.props.keyMap) { needRefresh = true } + if (!needRefresh && prevProps.customMarkdownLintConfig !== customMarkdownLintConfig) { + this.setCodeEditorLintConfig() + + needRefresh = true + } if ( prevProps.enableRulers !== enableRulers || @@ -655,6 +618,57 @@ export default class CodeEditor extends React.Component { } } + setCodeEditorLintConfig () { + const { mode } = this.props + const checkMarkdownNoteIsOpening = mode === 'Boost Flavored Markdown' + + return checkMarkdownNoteIsOpening ? { + 'getAnnotations': this.validatorOfMarkdown, + 'async': true + } : false + } + + validatorOfMarkdown (text, updateLinting) { + const { customMarkdownLintConfig } = this.props + let lintConfigJson + try { + Jsonlint.parse(customMarkdownLintConfig) + lintConfigJson = JSON.parse(customMarkdownLintConfig) + } catch (err) { + throw err + } + const lintOptions = { + 'strings': { + 'content': text + }, + 'config': lintConfigJson + } + + return markdownlint(lintOptions, (err, result) => { + if (!err) { + const foundIssues = [] + result.content.map(item => { + let ruleNames = '' + item.ruleNames.map((ruleName, index) => { + ruleNames += ruleName + if (index === item.ruleNames.length - 1) { + ruleNames += ': ' + } else { + ruleNames += '/' + } + }) + foundIssues.push({ + from: CodeMirror.Pos(item.lineNumber, 0), + to: CodeMirror.Pos(item.lineNumber, 1), + message: ruleNames + item.ruleDescription, + severity: 'warning' + }) + }) + updateLinting(foundIssues) + } + }) + } + setMode (mode) { let syntax = CodeMirror.findModeByName(convertModeName(mode || 'text')) if (syntax == null) syntax = CodeMirror.findModeByName('Plain Text') @@ -1160,7 +1174,8 @@ CodeEditor.propTypes = { onChange: PropTypes.func, readOnly: PropTypes.bool, autoDetect: PropTypes.bool, - spellCheck: PropTypes.bool + spellCheck: PropTypes.bool, + customMarkdownLintConfig: PropTypes.string } CodeEditor.defaultProps = { @@ -1172,5 +1187,6 @@ CodeEditor.defaultProps = { indentSize: 4, indentType: 'space', autoDetect: false, - spellCheck: false + spellCheck: false, + customMarkdownLintConfig: DEFAULT_CONFIG.editor.customMarkdownLintConfig } diff --git a/browser/components/MarkdownEditor.js b/browser/components/MarkdownEditor.js index 593f7d99..022553fb 100644 --- a/browser/components/MarkdownEditor.js +++ b/browser/components/MarkdownEditor.js @@ -319,6 +319,7 @@ class MarkdownEditor extends React.Component { enableSmartPaste={config.editor.enableSmartPaste} hotkey={config.hotkey} switchPreview={config.editor.switchPreview} + customMarkdownLintConfig={config.editor.customMarkdownLintConfig} />
this.handleMouseDown(e)} >