diff --git a/browser/components/MarkdownPreview.js b/browser/components/MarkdownPreview.js index a3e7bb93..a69e11fb 100644 --- a/browser/components/MarkdownPreview.js +++ b/browser/components/MarkdownPreview.js @@ -118,6 +118,7 @@ export default class MarkdownPreview extends React.Component { this.checkboxClickHandler = (e) => this.handleCheckboxClick(e) this.saveAsTextHandler = () => this.handleSaveAsText() this.saveAsMdHandler = () => this.handleSaveAsMd() + this.saveAsHtmlHandler = () => this.handleSaveAsHtml() this.printHandler = () => this.handlePrint() this.linkClickHandler = this.handlelinkClick.bind(this) @@ -173,21 +174,29 @@ export default class MarkdownPreview extends React.Component { this.exportAsDocument('md') } + handleSaveAsHtml () { + this.exportAsDocument('html', function formatHtml (value) { + return this.refs.root.contentWindow.document.documentElement.outerHTML + }) + } + handlePrint () { this.refs.root.contentWindow.print() } - exportAsDocument (fileType) { + exportAsDocument (fileType, formatter) { const options = { filters: [ { name: 'Documents', extensions: [fileType] } ], properties: ['openFile', 'createDirectory'] } + var value = formatter ? formatter.call(this, this.props.value) : this.props.value + dialog.showSaveDialog(remote.getCurrentWindow(), options, (filename) => { if (filename) { - fs.writeFile(filename, this.props.value, (err) => { + fs.writeFile(filename, value, (err) => { if (err) throw err }) } @@ -223,6 +232,7 @@ export default class MarkdownPreview extends React.Component { this.refs.root.contentWindow.document.addEventListener('dragover', this.preventImageDroppedHandler) eventEmitter.on('export:save-text', this.saveAsTextHandler) eventEmitter.on('export:save-md', this.saveAsMdHandler) + eventEmitter.on('export:save-html', this.saveAsHtmlHandler) eventEmitter.on('print', this.printHandler) } @@ -234,6 +244,7 @@ export default class MarkdownPreview extends React.Component { this.refs.root.contentWindow.document.removeEventListener('dragover', this.preventImageDroppedHandler) eventEmitter.off('export:save-text', this.saveAsTextHandler) eventEmitter.off('export:save-md', this.saveAsMdHandler) + eventEmitter.off('export:save-html', this.saveAsHtmlHandler) eventEmitter.off('print', this.printHandler) } diff --git a/browser/main/Detail/InfoPanel.js b/browser/main/Detail/InfoPanel.js index e718fbf3..a5202e71 100644 --- a/browser/main/Detail/InfoPanel.js +++ b/browser/main/Detail/InfoPanel.js @@ -4,7 +4,7 @@ import CSSModules from 'browser/lib/CSSModules' import styles from './InfoPanel.styl' const InfoPanel = ({ - storageName, folderName, noteLink, updatedAt, createdAt, exportAsMd, exportAsTxt, wordCount, letterCount, type, print + storageName, folderName, noteLink, updatedAt, createdAt, exportAsMd, exportAsTxt, exportAsHtml, wordCount, letterCount, type, print }) => (
@@ -57,17 +57,22 @@ const InfoPanel = ({
+ +
@@ -82,6 +87,7 @@ InfoPanel.propTypes = { createdAt: PropTypes.string.isRequired, exportAsMd: PropTypes.func.isRequired, exportAsTxt: PropTypes.func.isRequired, + exportAsHtml: PropTypes.func.isRequired, wordCount: PropTypes.number, letterCount: PropTypes.number, type: PropTypes.string.isRequired, diff --git a/browser/main/Detail/InfoPanelTrashed.js b/browser/main/Detail/InfoPanelTrashed.js index 77ecea22..6e86b884 100644 --- a/browser/main/Detail/InfoPanelTrashed.js +++ b/browser/main/Detail/InfoPanelTrashed.js @@ -4,7 +4,7 @@ import CSSModules from 'browser/lib/CSSModules' import styles from './InfoPanel.styl' const InfoPanelTrashed = ({ - storageName, folderName, updatedAt, createdAt, exportAsMd, exportAsTxt + storageName, folderName, updatedAt, createdAt, exportAsMd, exportAsTxt, exportAsHtml }) => (
@@ -31,17 +31,22 @@ const InfoPanelTrashed = ({
+ +
@@ -54,7 +59,8 @@ InfoPanelTrashed.propTypes = { updatedAt: PropTypes.string.isRequired, createdAt: PropTypes.string.isRequired, exportAsMd: PropTypes.func.isRequired, - exportAsTxt: PropTypes.func.isRequired + exportAsTxt: PropTypes.func.isRequired, + exportAsHtml: PropTypes.func.isRequired } export default CSSModules(InfoPanelTrashed, styles) diff --git a/browser/main/Detail/MarkdownNoteDetail.js b/browser/main/Detail/MarkdownNoteDetail.js index f4c805c1..5dd0d765 100644 --- a/browser/main/Detail/MarkdownNoteDetail.js +++ b/browser/main/Detail/MarkdownNoteDetail.js @@ -170,6 +170,10 @@ class MarkdownNoteDetail extends React.Component { ee.emit('export:save-text') } + exportAsHtml () { + ee.emit('export:save-html') + } + handleTrashButtonClick (e) { const { note } = this.state const { isTrashed } = note @@ -296,6 +300,7 @@ class MarkdownNoteDetail extends React.Component { folderName={currentOption.folder.name} updatedAt={formatDate(note.updatedAt)} createdAt={formatDate(note.createdAt)} + exportAsHtml={this.exportAsHtml} exportAsMd={this.exportAsMd} exportAsTxt={this.exportAsTxt} /> @@ -363,6 +368,7 @@ class MarkdownNoteDetail extends React.Component { createdAt={formatDate(note.createdAt)} exportAsMd={this.exportAsMd} exportAsTxt={this.exportAsTxt} + exportAsHtml={this.exportAsHtml} wordCount={note.content.split(' ').length} letterCount={note.content.replace(/\r?\n/g, '').length} type={note.type} diff --git a/browser/main/Detail/SnippetNoteDetail.js b/browser/main/Detail/SnippetNoteDetail.js index 51f14fae..5a1b7f51 100644 --- a/browser/main/Detail/SnippetNoteDetail.js +++ b/browser/main/Detail/SnippetNoteDetail.js @@ -579,6 +579,7 @@ class SnippetNoteDetail extends React.Component { createdAt={formatDate(note.createdAt)} exportAsMd={this.showWarning} exportAsTxt={this.showWarning} + exportAsHtml={this.showWarning} />
diff --git a/lib/main-menu.js b/lib/main-menu.js index 3adc323e..19ccc965 100644 --- a/lib/main-menu.js +++ b/lib/main-menu.js @@ -106,6 +106,13 @@ const file = { mainWindow.webContents.send('list:isMarkdownNote') mainWindow.webContents.send('export:save-md') } + }, + { + label: 'Html (.html)', + click () { + mainWindow.webContents.send('list:isMarkdownNote') + mainWindow.webContents.send('export:save-html') + } } ] },