From d6c28da3a8d61c149a2c5f9c6af46a1b57407f48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nguy=E1=BB=85n=20Vi=E1=BB=87t=20H=C6=B0ng?= Date: Sat, 19 May 2018 19:39:08 +0700 Subject: [PATCH] added export escape html config --- browser/components/MarkdownPreview.js | 3 +- browser/main/lib/ConfigManager.js | 3 + .../main/modals/PreferencesModal/Export.js | 120 ++++++++++++++++++ browser/main/modals/PreferencesModal/index.js | 11 +- 4 files changed, 135 insertions(+), 2 deletions(-) create mode 100644 browser/main/modals/PreferencesModal/Export.js diff --git a/browser/components/MarkdownPreview.js b/browser/components/MarkdownPreview.js index 6646f749..ef11a0cc 100755 --- a/browser/components/MarkdownPreview.js +++ b/browser/components/MarkdownPreview.js @@ -15,6 +15,7 @@ import copy from 'copy-to-clipboard' import mdurl from 'mdurl' import exportNote from 'browser/main/lib/dataApi/exportNote' import { escapeHtmlCharacters } from 'browser/lib/utils' +import ConfigManager from 'browser/main/lib/ConfigManager' const { remote } = require('electron') const attachmentManagement = require('../main/lib/dataApi/attachmentManagement') @@ -218,7 +219,7 @@ export default class MarkdownPreview extends React.Component { const {fontFamily, fontSize, codeBlockFontFamily, lineNumber, codeBlockTheme, scrollPastEnd, theme} = this.getStyleParams() const inlineStyles = buildStyle(fontFamily, fontSize, codeBlockFontFamily, lineNumber, scrollPastEnd, theme) - let body = this.markdown.render(escapeHtmlCharacters(noteContent)) + let body = this.markdown.render(ConfigManager.get().exports.escapeHtml ? escapeHtmlCharacters(noteContent) : noteContent) const files = [this.GetCodeThemeLink(codeBlockTheme), ...CSS_FILES] const attachmentsAbsolutePaths = attachmentManagement.getAbsolutePathsOfAttachmentsInContent(noteContent, this.props.storagePath) diff --git a/browser/main/lib/ConfigManager.js b/browser/main/lib/ConfigManager.js index 79fe0f5f..5b263191 100644 --- a/browser/main/lib/ConfigManager.js +++ b/browser/main/lib/ConfigManager.js @@ -65,6 +65,9 @@ export const DEFAULT_CONFIG = { token: '', username: '', password: '' + }, + exports: { + escapeHtml: true } } diff --git a/browser/main/modals/PreferencesModal/Export.js b/browser/main/modals/PreferencesModal/Export.js new file mode 100644 index 00000000..ae57cc14 --- /dev/null +++ b/browser/main/modals/PreferencesModal/Export.js @@ -0,0 +1,120 @@ +import React from 'react' +import ConfigManager from 'browser/main/lib/ConfigManager' +import i18n from 'browser/lib/i18n' +import styles from './ConfigTab.styl' +import CSSModules from 'browser/lib/CSSModules' +import store from 'browser/main/store' + +const electron = require('electron') +const ipc = electron.ipcRenderer + +class Export extends React.Component { + constructor(props) { + super(props) + this.state = { + config: props.config + } + } + + componentDidMount () { + this.handleSettingDone = () => { + this.setState({ExportAlert: { + type: 'success', + message: i18n.__('Successfully applied!') + }}) + } + this.handleSettingError = (err) => { + this.setState({ExportAlert: { + type: 'error', + message: err.message != null ? err.message : i18n.__('Error occurs!') + }}) + } + ipc.addListener('APP_SETTING_DONE', this.handleSettingDone) + ipc.addListener('APP_SETTING_ERROR', this.handleSettingError) + } + + componentWillUnmount () { + ipc.removeListener('APP_SETTING_DONE', this.handleSettingDone) + ipc.removeListener('APP_SETTING_ERROR', this.handleSettingError) + } + + handleUIChange (e) { + const newConfig = { + exports: { + escapeHtml: this.refs.escapeHtmlExport.checked + } + } + + this.setState({ config: newConfig }, () => { + const { exports } = this.props.config + this.currentConfig = { exports } + if (_.isEqual(this.currentConfig, this.state.config)) { + this.props.haveToSave() + } else { + this.props.haveToSave({ + tab: 'EXPORT', + type: 'warning', + message: i18n.__('You have to save!') + }) + } + }) + } + + handleSaveUIClick (e) { + const newConfig = { + exports: this.state.config.exports + } + + ConfigManager.set(newConfig) + + store.dispatch({ + type: 'SET_UI', + config: newConfig + }) + this.clearMessage() + this.props.haveToSave() + } + + clearMessage () { + _.debounce(() => { + this.setState({ + UiAlert: null + }) + }, 2000)() + } + + render () { + const ExportAlert = this.state.ExportAlert + const ExportAlertElement = ExportAlert != null + ?

+ {ExportAlert.message} +

+ : null + return ( +
+
+
{i18n.__('Export')}
+ +
+ +
+
+ + {ExportAlertElement} +
+
+
+ ) + } +} + +export default CSSModules(Export, styles) diff --git a/browser/main/modals/PreferencesModal/index.js b/browser/main/modals/PreferencesModal/index.js index 70e25a88..a68cd588 100644 --- a/browser/main/modals/PreferencesModal/index.js +++ b/browser/main/modals/PreferencesModal/index.js @@ -7,6 +7,7 @@ import InfoTab from './InfoTab' import Crowdfunding from './Crowdfunding' import StoragesTab from './StoragesTab' import Blog from './Blog' +import Export from './Export' import ModalEscButton from 'browser/components/ModalEscButton' import CSSModules from 'browser/lib/CSSModules' import styles from './PreferencesModal.styl' @@ -86,6 +87,13 @@ class Preferences extends React.Component { haveToSave={alert => this.setState({BlogAlert: alert})} /> ) + case 'EXPORT': + return ( + this.setState({ExportAlert: alert})} + /> + ) case 'STORAGES': default: return ( @@ -123,7 +131,8 @@ class Preferences extends React.Component { {target: 'UI', label: i18n.__('Interface'), UI: this.state.UIAlert}, {target: 'INFO', label: i18n.__('About')}, {target: 'CROWDFUNDING', label: i18n.__('Crowdfunding')}, - {target: 'BLOG', label: i18n.__('Blog'), Blog: this.state.BlogAlert} + {target: 'BLOG', label: i18n.__('Blog'), Blog: this.state.BlogAlert}, + {target: 'EXPORT', label: i18n.__('Export')} ] const navButtons = tabs.map((tab) => {