From 5d1db1de31780662a05964adbdbe099e124d3b12 Mon Sep 17 00:00:00 2001 From: asmsuechan Date: Sat, 14 Jan 2017 23:52:53 +0900 Subject: [PATCH] Add export as txt/md --- browser/components/MarkdownPreview.js | 32 +++++++++++++++++++++++++++ lib/main-menu.js | 20 +++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/browser/components/MarkdownPreview.js b/browser/components/MarkdownPreview.js index c5fbc949..fe4a5c56 100644 --- a/browser/components/MarkdownPreview.js +++ b/browser/components/MarkdownPreview.js @@ -6,6 +6,8 @@ import consts from 'browser/lib/consts' import Raphael from 'raphael' import flowchart from 'flowchart' import SequenceDiagram from 'js-sequence-diagrams' +import ee from 'browser/main/lib/eventEmitter' +import fs from 'fs' function decodeHTMLEntities (text) { var entities = [ @@ -25,6 +27,7 @@ function decodeHTMLEntities (text) { const { remote } = require('electron') const { app } = remote const path = require('path') +const dialog = remote.require('electron').dialog const markdownStyle = require('!!css!stylus?sourceMap!./markdown.styl')[0][1] const appPath = 'file://' + (process.env.NODE_ENV === 'production' @@ -90,6 +93,8 @@ export default class MarkdownPreview extends React.Component { this.mouseUpHandler = (e) => this.handleMouseUp(e) this.anchorClickHandler = (e) => this.handlePreviewAnchorClick(e) this.checkboxClickHandler = (e) => this.handleCheckboxClick(e) + this.saveAsTextHandler = () => this.handleSaveAsText() + this.saveAsMdHandler = () => this.handleSaveAsMd() } handlePreviewAnchorClick (e) { @@ -134,6 +139,29 @@ export default class MarkdownPreview extends React.Component { if (this.props.onMouseUp != null) this.props.onMouseUp(e) } + handleSaveAsText () { + this.exportAsDocument('txt') + } + + handleSaveAsMd () { + this.exportAsDocument('md') + } + + exportAsDocument (fileType) { + const options = { + filters: [ + { name: 'Documents', extensions: [fileType]} + ], + properties: ['openFile', 'createDirectory'] + } + dialog.showSaveDialog(remote.getCurrentWindow(), options, + (filename) => { + if (filename) { + fs.writeFile(filename, this.props.value, () => {}) + } + }) + } + componentDidMount () { this.refs.root.setAttribute('sandbox', 'allow-scripts') this.refs.root.contentWindow.document.body.addEventListener('contextmenu', this.contextMenuHandler) @@ -149,12 +177,16 @@ export default class MarkdownPreview extends React.Component { this.refs.root.contentWindow.document.addEventListener('mousedown', this.mouseDownHandler) this.refs.root.contentWindow.document.addEventListener('mouseup', this.mouseUpHandler) + ee.on('export:save-text', this.saveAsTextHandler) + ee.on('export:save-md', this.saveAsMdHandler) } componentWillUnmount () { this.refs.root.contentWindow.document.body.removeEventListener('contextmenu', this.contextMenuHandler) this.refs.root.contentWindow.document.removeEventListener('mousedown', this.mouseDownHandler) this.refs.root.contentWindow.document.removeEventListener('mouseup', this.mouseUpHandler) + ee.off('export:save-text', this.saveAsTextHandler) + ee.off('export:save-md', this.saveAsMdHandler) } componentDidUpdate (prevProps) { diff --git a/lib/main-menu.js b/lib/main-menu.js index 482c8b07..8e6ab4f4 100644 --- a/lib/main-menu.js +++ b/lib/main-menu.js @@ -62,6 +62,26 @@ var file = { { type: 'separator' }, + { + label: 'Export as', + submenu: [ + { + label: 'Plain Text (.txt)', + click: function () { + mainWindow.webContents.send('export:save-text') + } + }, + { + label: 'MarkDown (.md)', + click: function () { + mainWindow.webContents.send('export:save-md') + } + } + ] + }, + { + type: 'separator' + }, { label: 'Delete Note', accelerator: OSX ? 'Control + Backspace' : 'Control + Delete',