const wrapSymbols = ['*', '_', '~', '^', '+', '='] export function wrapTextWith (editor, cm, symbol) { if (!cm.getSelection()) { return CodeMirror.Pass } else { let ranges = cm.listSelections() for (let i = 0; i < ranges.length; i++) { let range = ranges[i] if (!range.empty()) { const from = range.from() const to = range.to() if (symbol !== 'Backspace') { let selection = cm.getRange(from, to) let anchorIndex = editor.indexFromPos(ranges[i].anchor) let headIndex = editor.indexFromPos(ranges[i].head) cm.replaceRange(symbol + selection + symbol, from, to, '+input') if (anchorIndex > headIndex) { ranges[i].anchor.ch += symbol.length ranges[i].head.ch += symbol.length } else { ranges[i].head.ch += symbol.length ranges[i].anchor.ch += symbol.length } cm.setSelections(ranges) } else { let preEndPos = { line: to.line, ch: to.ch + symbol.length } let preText = cm.getRange(to, preEndPos) let preIndex = wrapSymbols.indexOf(preText) let postEndPos = { line: from.line, ch: from.ch - symbol.length } let postText = cm.getRange(postEndPos, from) let postIndex = wrapSymbols.indexOf(postText) // check if surround symbol are list in array and matched if (preIndex > -1 && postIndex > -1 && preIndex === postIndex) { cm.replaceRange('', to, preEndPos, '+delete') cm.replaceRange('', postEndPos, from, '+delete') } } } } } } export function insertText (cm, text, cursorEnd = 0) { let cursor = cm.getCursor() cm.replaceSelection(text, cursor, cursor) cm.focus() cm.setCursor({line: cursor.line, ch: cursor.ch + cursorEnd}) } export function insertLink (cm, isImage) { let cursor = cm.getCursor() let ranges = cm.listSelections() const linkEnd = '](https://)' const symbol = (isImage) ? '![' : '[' for (let i = 0; i < ranges.length; i++) { let range = ranges[i] if (!range.empty()) { const from = range.from() const to = range.to() let anchorIndex = editor.indexFromPos(ranges[i].anchor) let headIndex = editor.indexFromPos(ranges[i].head) let selection = cm.getRange(from, to) selection = symbol + selection + linkEnd cm.replaceRange(selection, from, to) if (anchorIndex > headIndex) { ranges[i].anchor.ch += symbol.length ranges[i].head.ch += symbol.length } else { ranges[i].head.ch += symbol.length ranges[i].anchor.ch += symbol.length } cm.setSelections(ranges) } else { cm.replaceRange(symbol + linkEnd, cursor, cursor) cm.setCursor({line: cursor.line, ch: cursor.ch + symbol.length + linkEnd.length}) } } cm.focus() } export function insertHeader (cm) { let cursor = cm.getCursor() let startOfLine = {line: cursor.line, ch: 0} let startOfLineText = cm.getRange(startOfLine, {line: cursor.line, ch: 1}) // See if it is already a header if (startOfLineText === '#') { cm.replaceRange('#', startOfLine, startOfLine) } else { cm.replaceRange('# ', startOfLine, startOfLine) } cm.focus() } export function insertOnStartOfLines (cm, symbol) { let cursor = cm.getCursor() let ranges = cm.listSelections() for (let i = 0; i < ranges.length; i++) { let range = ranges[i] if (!range.empty()) { const from = range.from() const to = range.to() let selection = cm.getRange({line: from.line, ch: 0}, to) selection = selection.replace(/\n/g, '\n' + symbol) selection = symbol + selection cm.replaceRange(selection, from, to) } else { cm.replaceRange(symbol, {line: cursor.line, ch: 0}, {line: cursor.line, ch: 0}) } } cm.setCursor({line: cursor.line, ch: cursor.ch + symbol.length}) cm.focus() }