md-wechat/src/store/index.js
2020-10-13 00:07:14 +08:00

162 lines
5.3 KiB
JavaScript

import Vue from 'vue'
import Vuex from 'vuex'
import config from '../assets/scripts/config';
import WxRenderer from '../assets/scripts/renderers/wx-renderer'
import marked from 'marked'
import CodeMirror from 'codemirror/lib/codemirror'
import DEFAULT_CONTENT from '../assets/scripts/default-content'
import DEFAULT_CSS_CONTENT from '../assets/scripts/themes/default-theme-css'
import {
setColor,
formatDoc
} from '../assets/scripts/util'
Vue.use(Vuex)
const state = {
wxRenderer: null,
output: '',
html: '',
editor: null,
cssEditor: null,
currentFont: '',
currentSize: '',
currentColor: '',
citeStatus: 0,
nightMode: false,
codeTheme: 'github',
rightClickMenuVisible: false
};
const mutations = {
setEditorValue(state, data) {
state.editor.setValue(data);
},
setCssEditorValue(state, data) {
state.cssEditor.setValue(data);
},
setWxRendererOptions(state, data) {
state.wxRenderer.setOptions(data);
},
setCiteStatus(state, data) {
state.citeStatus = data;
localStorage.setItem('citeStatus', data);
},
setCurrentFont(state, data) {
state.currentFont = data;
localStorage.setItem('fonts', data);
},
setCurrentSize(state, data) {
state.currentSize = data;
localStorage.setItem('size', data);
},
setCurrentColor(state, data) {
state.currentColor = data;
localStorage.setItem('color', data);
},
setCurrentCodeTheme(state, data) {
state.codeTheme = data;
localStorage.setItem('codeTheme', data);
},
setRightClickMenuVisible(state, data) {
state.rightClickMenuVisible = data;
},
themeChanged(state) {
state.nightMode = !state.nightMode;
localStorage.setItem('nightMode', state.nightMode);
},
initEditorState(state) {
state.currentFont = localStorage.getItem('fonts') || config.builtinFonts[0].value;
state.currentColor = localStorage.getItem('color') || config.colorOption[1].value;
state.currentSize = localStorage.getItem('size') || config.sizeOption[2].value;
state.codeTheme = localStorage.getItem('codeTheme') || config.codeThemeOption[0].value;
state.citeStatus = localStorage.getItem('citeStatus') === 'true';
state.nightMode = localStorage.getItem('nightMode') === 'true';
state.wxRenderer = new WxRenderer({
theme: setColor(state.currentColor),
fonts: state.currentFont,
size: state.currentSize,
status: state.citeStatus
});
},
initEditorEntity(state) {
state.editor = CodeMirror.fromTextArea(
document.getElementById('editor'), {
value: '',
mode: 'text/x-markdown',
theme: 'xq-light',
lineNumbers: false,
lineWrapping: true,
styleActiveLine: true,
autoCloseBrackets: true,
extraKeys: {
'Ctrl-F': function autoFormat(editor) {
const doc = formatDoc(editor.getValue(0))
localStorage.setItem('__editor_content', doc)
editor.setValue(doc)
},
'Ctrl-S': function save(editor) {}
}
}
);
// 如果有编辑器内容被保存则读取,否则加载默认内容
state.editor.setValue(localStorage.getItem('__editor_content') || formatDoc(DEFAULT_CONTENT))
},
initCssEditorEntity(state) {
state.cssEditor = CodeMirror.fromTextArea(
document.getElementById('cssEditor'), {
value: '',
mode: 'css',
theme: 'style-mirror',
lineNumbers: false,
lineWrapping: true,
matchBrackets: true,
autofocus: true,
extraKeys: {
'Ctrl-F': function autoFormat(editor) {
const totalLines = editor.lineCount();
editor.autoFormatRange({
line: 0,
ch: 0
}, {
line: totalLines
});
},
'Ctrl-S': function save(editor) {}
}
}
);
// 如果有编辑器内容被保存则读取,否则加载默认内容
state.cssEditor.setValue(localStorage.getItem('__css_content') || DEFAULT_CSS_CONTENT)
},
editorRefresh(state) {
let output = marked(state.editor.getValue(0), {
renderer: state.wxRenderer.getRenderer(state.citeStatus)
});
// 去除第一行的 margin-top
output = output.replace(/(style=".*?)"/, '$1;margin-top: 0"');
if (state.citeStatus) {
// 引用脚注
output += state.wxRenderer.buildFootnotes();
// 附加的一些 style
output += state.wxRenderer.buildAddition();
}
state.output = output;
},
clearEditorToDefault(state) {
const doc = formatDoc(DEFAULT_CONTENT);
state.editor.setValue(doc);
state.cssEditor.setValue(DEFAULT_CSS_CONTENT);
}
}
export default new Vuex.Store({
state,
mutations,
actions: {}
});