Something went wrong. Try again.
[READ-ONLY] Mirror of https://github.com/chrisvander/markdown-editor. A clean markdown editor written with Electron
Something went wrong. Try again.
markdown-editor index.js
4.1 kB · 143 lines
JavaScript
at master
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144require('electron-titlebar')const {app,BrowserWindow,ipcRenderer} = require('electron')const {dialog} = require('electron').remote;const fs = require('fs');
window.onload = () => { initEditor();}
// MARKDOWN REGEX
function manageClass(regex, cl, element) { if (element.innerHTML.search(regex) != -1) element.classList.add(cl); else if (element.classList.contains(cl)) element.classList.remove(cl);}
function applySelectionFunc(pnode, regex, command) { let node = pnode.firstChild; let text = pnode.innerHTML; let match; while (match = regex.exec(text)) { console.log(match);
if (match == null) return;
let start = (regex.lastIndex - match[0].length + 2); let end = (regex.lastIndex - 2);
let range = document.createRange(); let sel = window.getSelection(); let original = sel.getRangeAt(0);
range.setStart(node, start); range.setEnd(pnode.lastChild, end); sel.removeAllRanges(); sel.addRange(range); document.execCommand(command,false,false); sel.removeAllRanges(); sel.addRange(original); }}
function markdownEngine(editor, opts) { editor.querySelectorAll("p").forEach((p) => { manageClass(/^#[^#]+/g, "h1", p); manageClass(/^##[^#]+/g, "h2", p); manageClass(/^###[^#]+/g, "h3", p); manageClass(/^####[^#]+/g, "h4", p); manageClass(/^#####[^#]+/g, "h5", p); manageClass(/^######[^#]+/g, "h6", p); manageClass(/^[\+] /g, "ul-plus", p); manageClass(/^[\-\*] /g, "ul", p); // applySelectionFunc(p,/(?:^|[^>])\*\*[^<>].+[^<>]\*\*/g, "bold"); // if (p.innerHTML.search(/\*\*/g) != -1) document.execCommand('bold', false, false ); });}
function initEditor() { let editor = document.getElementById('editor'); markdownEngine(editor); editor.addEventListener('input', function(ev) { let keys = []; if (ev.keyCode == '13') { document.execCommand('formatBlock', false, 'p'); return false; } markdownEngine(editor, keys); }, false);}
// FILE MANAGEMENT
var current_file = "";function saveFile(saveAs = false) {let writable_content = document.getElementById('editor').innerHTML .replace(/&/g, '&') .replace(/</g, '<') .replace(/>/g, '>') .replace(/"/g, '"') .replace(/<br>/g, '\u000a') .replace(/<\/p>/g, '\u000a') .replace(/<p.*>/g, '') .replace(/ /g, '\u0020'); if (current_file === "" || saveAs) { dialog.showSaveDialog({ filters: [ {name: 'Markdown', extensions: ['md']}, {name: 'Text', extensions: ['txt']}, {name: 'All Files', extensions: ['*']} ] }, (fileName) => { if (fileName === undefined){ return; }
// fileName is a string that contains the path and filename created in the save file dialog. fs.writeFile(fileName, writable_content, (err) => { if (err) { alert("An error occurred creating the file "+ err.message) } document.getElementsByTagName('title')[0].innerHTML = fileName; document.getElementById('title').innerHTML = fileName; current_file = fileName;
app.addRecentDocument(fileName); }); }); } else { fs.writeFile(current_file, writable_content, (err) => { if (err) { alert("An error occurred saving the file "+ err.message) } }); }}
function openFile() { dialog.showOpenDialog((filePaths) => { if (filePaths === undefined) { return; }
var filePath = filePaths[0];
fs.readFile(filePath, 'utf-8', (err, data) => { if (err) alert('Error reading the file: ' + err); document.getElementById('editor').innerHTML = "<p>" + data .replace(/&/g, '&') .replace(/</g, '<') .replace(/>/g, '>') .replace(/"/g, '"') .replace(/\u000a/g, '<p>') .replace(/\u0020/g, ' '); initEditor(); }); document.getElementsByTagName('title')[0].innerHTML = filePath; document.getElementById('title').innerHTML = filePath; current_file = filePath;
app.addRecentDocument(filePath); });}