mirror of
https://github.com/marktext/marktext.git
synced 2025-05-03 11:51:26 +08:00

* rewrite notice module * optimization: show some notification when export html or pdf * optimization: style of open project button * little bug fix * style: uniform titlebar hight to remove some style error
148 lines
3.9 KiB
Vue
148 lines
3.9 KiB
Vue
<template>
|
|
<div
|
|
class="source-code"
|
|
ref="sourceCode"
|
|
>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import codeMirror, { setMode, setCursorAtLastLine } from '../../../editor/codeMirror'
|
|
import { wordCount as getWordCount } from '../../../editor/utils'
|
|
import { adjustCursor } from '../../util'
|
|
import bus from '../../bus'
|
|
|
|
export default {
|
|
props: {
|
|
theme: {
|
|
type: String,
|
|
required: true
|
|
},
|
|
markdown: String,
|
|
cursor: Object
|
|
},
|
|
|
|
data () {
|
|
return {
|
|
contentState: null,
|
|
editor: null
|
|
}
|
|
},
|
|
|
|
watch: {
|
|
theme: function (value, oldValue) {
|
|
const cm = this.$refs.sourceCode.querySelector('.CodeMirror')
|
|
if (value !== oldValue) {
|
|
if (value === 'dark') {
|
|
cm.classList.remove('cm-s-default')
|
|
cm.classList.add('cm-s-railscasts')
|
|
} else {
|
|
cm.classList.add('cm-s-default')
|
|
cm.classList.remove('cm-s-railscasts')
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
created () {
|
|
this.$nextTick(() => {
|
|
const { markdown = '', theme, cursor } = this
|
|
const container = this.$refs.sourceCode
|
|
const codeMirrorConfig = {
|
|
value: markdown,
|
|
lineNumbers: true,
|
|
autofocus: true,
|
|
lineWrapping: true,
|
|
styleActiveLine: true,
|
|
lineNumberFormatter (line) {
|
|
if (line % 10 === 0 || line === 1) {
|
|
return line
|
|
} else {
|
|
return ''
|
|
}
|
|
}
|
|
}
|
|
if (theme === 'dark') codeMirrorConfig.theme = 'railscasts'
|
|
const editor = this.editor = codeMirror(container, codeMirrorConfig)
|
|
bus.$on('file-loaded', this.setMarkdown)
|
|
bus.$on('dotu-select', this.handleSelectDoutu)
|
|
|
|
setMode(editor, 'markdown')
|
|
this.listenChange()
|
|
if (cursor) {
|
|
editor.setCursor(cursor)
|
|
} else {
|
|
setCursorAtLastLine(editor)
|
|
}
|
|
})
|
|
},
|
|
beforeDestroy () {
|
|
bus.$off('file-loaded', this.setMarkdown)
|
|
bus.$off('dotu-select', this.handleSelectDoutu)
|
|
const { markdown, cursor } = this
|
|
bus.$emit('file-changed', { markdown, cursor, renderCursor: true })
|
|
},
|
|
methods: {
|
|
handleSelectDoutu (url) {
|
|
const { editor } = this
|
|
if (editor) {
|
|
editor.replaceSelection(``)
|
|
}
|
|
},
|
|
listenChange () {
|
|
const { editor } = this
|
|
let timer = null
|
|
editor.on('cursorActivity', (cm, event) => {
|
|
let cursor = cm.getCursor()
|
|
const markdown = cm.getValue()
|
|
const wordCount = getWordCount(markdown)
|
|
const line = cm.getLine(cursor.line)
|
|
const preLine = cm.getLine(cursor.line - 1)
|
|
const nextLine = cm.getLine(cursor.line + 1)
|
|
cursor = adjustCursor(cursor, preLine, line, nextLine)
|
|
if (timer) clearTimeout(timer)
|
|
timer = setTimeout(() => {
|
|
this.$store.dispatch('LISTEN_FOR_CONTENT_CHANGE', { markdown, wordCount, cursor })
|
|
}, 1000)
|
|
})
|
|
},
|
|
setMarkdown (markdown) {
|
|
const { editor, cursor } = this
|
|
this.editor.setValue(markdown)
|
|
if (cursor) {
|
|
editor.setCursor(cursor)
|
|
} else {
|
|
setCursorAtLastLine(editor)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style>
|
|
.source-code {
|
|
height: calc(100vh - 25px);
|
|
box-sizing: border-box;
|
|
overflow: auto;
|
|
}
|
|
.source-code .CodeMirror {
|
|
margin: 50px auto;
|
|
max-width: 860px;
|
|
}
|
|
.source-code .CodeMirror-gutters {
|
|
border-right: none;
|
|
background-color: transparent;
|
|
}
|
|
.source-code .CodeMirror-activeline-background,
|
|
.source-code .CodeMirror-activeline-gutter {
|
|
background: #F2F6FC;
|
|
}
|
|
.dark {
|
|
background: var(--darkBgColor);
|
|
}
|
|
.dark.source-code .CodeMirror-activeline-background,
|
|
.dark.source-code .CodeMirror-activeline-gutter {
|
|
background: #333;
|
|
}
|
|
</style>
|