mirror of
https://github.com/BoostIo/Boostnote
synced 2025-12-13 01:36:22 +00:00
Fix: Improved for the app not to need to reload
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
@@ -319,6 +319,7 @@ class MarkdownEditor extends React.Component {
|
||||
enableSmartPaste={config.editor.enableSmartPaste}
|
||||
hotkey={config.hotkey}
|
||||
switchPreview={config.editor.switchPreview}
|
||||
customMarkdownLintConfig={config.editor.customMarkdownLintConfig}
|
||||
/>
|
||||
<MarkdownPreview styleName={this.state.status === 'PREVIEW'
|
||||
? 'preview'
|
||||
|
||||
@@ -179,6 +179,7 @@ class MarkdownSplitEditor extends React.Component {
|
||||
enableSmartPaste={config.editor.enableSmartPaste}
|
||||
hotkey={config.hotkey}
|
||||
switchPreview={config.editor.switchPreview}
|
||||
customMarkdownLintConfig={config.editor.customMarkdownLintConfig}
|
||||
/>
|
||||
<div styleName='slider' style={{left: this.state.codeEditorWidthInPercent + '%'}} onMouseDown={e => this.handleMouseDown(e)} >
|
||||
<div styleName='slider-hitbox' />
|
||||
|
||||
Reference in New Issue
Block a user