Skip to content

Commit 72b8d56

Browse files
committed
Merge remote-tracking branch 'upstream/master' into html-to-md
2 parents 0d36f59 + 606be43 commit 72b8d56

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

71 files changed

+423
-162
lines changed

browser/components/CodeEditor.js

Lines changed: 10 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import styles from '../components/CodeEditor.styl'
2020
const { ipcRenderer, remote, clipboard } = require('electron')
2121
import normalizeEditorFontFamily from 'browser/lib/normalizeEditorFontFamily'
2222
const spellcheck = require('browser/lib/spellcheck')
23-
const buildEditorContextMenu = require('browser/lib/contextMenuBuilder')
23+
const buildEditorContextMenu = require('browser/lib/contextMenuBuilder').buildEditorContextMenu
2424
import { createTurndownService } from '../lib/turndown'
2525
import {languageMaps} from '../lib/CMLanguageList'
2626
import snippetManager from '../lib/SnippetManager'
@@ -53,6 +53,7 @@ export default class CodeEditor extends React.Component {
5353
this.focusHandler = () => {
5454
ipcRenderer.send('editor:focused', true)
5555
}
56+
const debouncedDeletionOfAttachments = _.debounce(attachmentManagement.deleteAttachmentsNotPresentInNote, 30000)
5657
this.blurHandler = (editor, e) => {
5758
ipcRenderer.send('editor:focused', false)
5859
if (e == null) return null
@@ -64,16 +65,11 @@ export default class CodeEditor extends React.Component {
6465
el = el.parentNode
6566
}
6667
this.props.onBlur != null && this.props.onBlur(e)
67-
6868
const {
6969
storageKey,
7070
noteKey
7171
} = this.props
72-
attachmentManagement.deleteAttachmentsNotPresentInNote(
73-
this.editor.getValue(),
74-
storageKey,
75-
noteKey
76-
)
72+
debouncedDeletionOfAttachments(this.editor.getValue(), storageKey, noteKey)
7773
}
7874
this.pasteHandler = (editor, e) => {
7975
e.preventDefault()
@@ -205,23 +201,11 @@ export default class CodeEditor extends React.Component {
205201
'Cmd-T': function (cm) {
206202
// Do nothing
207203
},
208-
'Ctrl-/': function (cm) {
209-
if (global.process.platform === 'darwin') { return }
210-
const dateNow = new Date()
211-
cm.replaceSelection(dateNow.toLocaleDateString())
212-
},
213-
'Cmd-/': function (cm) {
214-
if (global.process.platform !== 'darwin') { return }
204+
[translateHotkey(hotkey.insertDate)]: function (cm) {
215205
const dateNow = new Date()
216206
cm.replaceSelection(dateNow.toLocaleDateString())
217207
},
218-
'Shift-Ctrl-/': function (cm) {
219-
if (global.process.platform === 'darwin') { return }
220-
const dateNow = new Date()
221-
cm.replaceSelection(dateNow.toLocaleString())
222-
},
223-
'Shift-Cmd-/': function (cm) {
224-
if (global.process.platform !== 'darwin') { return }
208+
[translateHotkey(hotkey.insertDateTime)]: function (cm) {
225209
const dateNow = new Date()
226210
cm.replaceSelection(dateNow.toLocaleString())
227211
},
@@ -267,7 +251,7 @@ export default class CodeEditor extends React.Component {
267251
value: this.props.value,
268252
linesHighlighted: this.props.linesHighlighted,
269253
lineNumbers: this.props.displayLineNumbers,
270-
lineWrapping: true,
254+
lineWrapping: this.props.lineWrapping,
271255
theme: this.props.theme,
272256
indentUnit: this.props.indentSize,
273257
tabSize: this.props.indentSize,
@@ -566,6 +550,10 @@ export default class CodeEditor extends React.Component {
566550
this.editor.setOption('lineNumbers', this.props.displayLineNumbers)
567551
}
568552

553+
if (prevProps.lineWrapping !== this.props.lineWrapping) {
554+
this.editor.setOption('lineWrapping', this.props.lineWrapping)
555+
}
556+
569557
if (prevProps.scrollPastEnd !== this.props.scrollPastEnd) {
570558
this.editor.setOption('scrollPastEnd', this.props.scrollPastEnd)
571559
}

browser/components/MarkdownEditor.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,7 @@ class MarkdownEditor extends React.Component {
304304
enableRulers={config.editor.enableRulers}
305305
rulers={config.editor.rulers}
306306
displayLineNumbers={config.editor.displayLineNumbers}
307+
lineWrapping
307308
matchingPairs={config.editor.matchingPairs}
308309
matchingTriples={config.editor.matchingTriples}
309310
explodingPairs={config.editor.explodingPairs}
@@ -340,6 +341,7 @@ class MarkdownEditor extends React.Component {
340341
smartArrows={config.preview.smartArrows}
341342
breaks={config.preview.breaks}
342343
sanitize={config.preview.sanitize}
344+
mermaidHTMLLabel={config.preview.mermaidHTMLLabel}
343345
ref='preview'
344346
onContextMenu={(e) => this.handleContextMenu(e)}
345347
onDoubleClick={(e) => this.handleDoubleClick(e)}

browser/components/MarkdownPreview.js

Lines changed: 19 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -18,24 +18,20 @@ import mdurl from 'mdurl'
1818
import exportNote from 'browser/main/lib/dataApi/exportNote'
1919
import { escapeHtmlCharacters } from 'browser/lib/utils'
2020
import yaml from 'js-yaml'
21-
import context from 'browser/lib/context'
22-
import i18n from 'browser/lib/i18n'
23-
import fs from 'fs'
2421
import { render } from 'react-dom'
2522
import Carousel from 'react-image-carousel'
2623
import ConfigManager from '../main/lib/ConfigManager'
2724

2825
const { remote, shell } = require('electron')
2926
const attachmentManagement = require('../main/lib/dataApi/attachmentManagement')
27+
const buildMarkdownPreviewContextMenu = require('browser/lib/contextMenuBuilder').buildMarkdownPreviewContextMenu
3028

3129
const { app } = remote
3230
const path = require('path')
3331
const fileUrl = require('file-url')
3432

3533
const dialog = remote.dialog
3634

37-
const uri2path = require('file-uri-to-path')
38-
3935
const markdownStyle = require('!!css!stylus?sourceMap!./markdown.styl')[0][1]
4036
const appPath = fileUrl(
4137
process.env.NODE_ENV === 'production' ? app.getAppPath() : path.resolve()
@@ -45,6 +41,7 @@ const CSS_FILES = [
4541
`${appPath}/node_modules/codemirror/lib/codemirror.css`,
4642
`${appPath}/node_modules/react-image-carousel/lib/css/main.min.css`
4743
]
44+
const win = global.process.platform === 'win32'
4845

4946
function buildStyle (
5047
fontFamily,
@@ -249,30 +246,9 @@ export default class MarkdownPreview extends React.Component {
249246
}
250247

251248
handleContextMenu (event) {
252-
// If a contextMenu handler was passed to us, use it instead of the self-defined one -> return
253-
if (_.isFunction(this.props.onContextMenu)) {
254-
this.props.onContextMenu(event)
255-
return
256-
}
257-
// No contextMenu was passed to us -> execute our own link-opener
258-
if (event.target.tagName.toLowerCase() === 'a' && event.target.getAttribute('href')) {
259-
const href = event.target.href
260-
const isLocalFile = href.startsWith('file:')
261-
if (isLocalFile) {
262-
const absPath = uri2path(href)
263-
try {
264-
if (fs.lstatSync(absPath).isFile()) {
265-
context.popup([
266-
{
267-
label: i18n.__('Show in explorer'),
268-
click: (e) => shell.showItemInFolder(absPath)
269-
}
270-
])
271-
}
272-
} catch (e) {
273-
console.log('Error while evaluating if the file is locally available', e)
274-
}
275-
}
249+
const menu = buildMarkdownPreviewContextMenu(this, event)
250+
if (menu != null) {
251+
menu.popup(remote.getCurrentWindow())
276252
}
277253
}
278254

@@ -345,7 +321,11 @@ export default class MarkdownPreview extends React.Component {
345321
customCSS
346322
)
347323
let body = this.markdown.render(noteContent)
348-
const files = [this.GetCodeThemeLink(codeBlockTheme), ...CSS_FILES]
324+
body = attachmentManagement.fixLocalURLS(
325+
body,
326+
this.props.storagePath
327+
)
328+
const files = [this.getCodeThemeLink(codeBlockTheme), ...CSS_FILES]
349329
files.forEach(file => {
350330
if (global.process.platform === 'win32') {
351331
file = file.replace('file:///', '')
@@ -580,6 +560,7 @@ export default class MarkdownPreview extends React.Component {
580560
if (
581561
prevProps.smartQuotes !== this.props.smartQuotes ||
582562
prevProps.sanitize !== this.props.sanitize ||
563+
prevProps.mermaidHTMLLabel !== this.props.mermaidHTMLLabel ||
583564
prevProps.smartArrows !== this.props.smartArrows ||
584565
prevProps.breaks !== this.props.breaks ||
585566
prevProps.lineThroughCheckbox !== this.props.lineThroughCheckbox
@@ -657,7 +638,7 @@ export default class MarkdownPreview extends React.Component {
657638

658639
this.getWindow().document.getElementById(
659640
'codeTheme'
660-
).href = this.GetCodeThemeLink(codeBlockTheme)
641+
).href = this.getCodeThemeLink(codeBlockTheme)
661642
this.getWindow().document.getElementById('style').innerHTML = buildStyle(
662643
fontFamily,
663644
fontSize,
@@ -670,14 +651,12 @@ export default class MarkdownPreview extends React.Component {
670651
)
671652
}
672653

673-
GetCodeThemeLink (name) {
654+
getCodeThemeLink (name) {
674655
const theme = consts.THEMES.find(theme => theme.name === name)
675656

676-
if (theme) {
677-
return `${appPath}/${theme.path}`
678-
} else {
679-
return `${appPath}/node_modules/codemirror/theme/elegant.css`
680-
}
657+
return theme != null
658+
? theme.path
659+
: `${appPath}/node_modules/codemirror/theme/elegant.css`
681660
}
682661

683662
rewriteIframe () {
@@ -703,7 +682,8 @@ export default class MarkdownPreview extends React.Component {
703682
showCopyNotification,
704683
storagePath,
705684
noteKey,
706-
sanitize
685+
sanitize,
686+
mermaidHTMLLabel
707687
} = this.props
708688
let { value, codeBlockTheme } = this.props
709689

@@ -845,7 +825,7 @@ export default class MarkdownPreview extends React.Component {
845825
_.forEach(
846826
this.refs.root.contentWindow.document.querySelectorAll('.mermaid'),
847827
el => {
848-
mermaidRender(el, htmlTextHelper.decodeEntities(el.innerHTML), theme)
828+
mermaidRender(el, htmlTextHelper.decodeEntities(el.innerHTML), theme, mermaidHTMLLabel)
849829
}
850830
)
851831

browser/components/MarkdownSplitEditor.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,6 @@ class MarkdownSplitEditor extends React.Component {
150150
onMouseMove={e => this.handleMouseMove(e)}
151151
onMouseUp={e => this.handleMouseUp(e)}>
152152
<CodeEditor
153-
styleName='codeEditor'
154153
ref='code'
155154
width={this.state.codeEditorWidthInPercent + '%'}
156155
mode='Boost Flavored Markdown'
@@ -160,6 +159,7 @@ class MarkdownSplitEditor extends React.Component {
160159
fontFamily={config.editor.fontFamily}
161160
fontSize={editorFontSize}
162161
displayLineNumbers={config.editor.displayLineNumbers}
162+
lineWrapping
163163
matchingPairs={config.editor.matchingPairs}
164164
matchingTriples={config.editor.matchingTriples}
165165
explodingPairs={config.editor.explodingPairs}
@@ -187,7 +187,6 @@ class MarkdownSplitEditor extends React.Component {
187187
</div>
188188
<MarkdownPreview
189189
style={previewStyle}
190-
styleName='preview'
191190
theme={config.ui.theme}
192191
keyMap={config.editor.keyMap}
193192
fontSize={config.preview.fontSize}
@@ -200,6 +199,7 @@ class MarkdownSplitEditor extends React.Component {
200199
smartArrows={config.preview.smartArrows}
201200
breaks={config.preview.breaks}
202201
sanitize={config.preview.sanitize}
202+
mermaidHTMLLabel={config.preview.mermaidHTMLLabel}
203203
ref='preview'
204204
tabInde='0'
205205
value={value}

browser/components/MarkdownSplitEditor.styl

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,30 @@
88
top -2px
99
width 0
1010
z-index 0
11+
border-left 1px solid $ui-borderColor
1112
.slider-hitbox
1213
absolute top bottom left right
1314
width 7px
1415
left -3px
1516
z-index 10
1617
cursor col-resize
18+
19+
body[data-theme="dark"]
20+
.root
21+
.slider
22+
border-left 1px solid $ui-dark-borderColor
23+
24+
body[data-theme="solarized-dark"]
25+
.root
26+
.slider
27+
border-left 1px solid $ui-solarized-dark-borderColor
28+
29+
body[data-theme="monokai"]
30+
.root
31+
.slider
32+
border-left 1px solid $ui-monokai-borderColor
33+
34+
body[data-theme="dracula"]
35+
.root
36+
.slider
37+
border-left 1px solid $ui-dracula-borderColor

browser/components/ModalEscButton.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ const ModalEscButton = ({
88
}) => (
99
<button styleName='escButton' onClick={handleEscButtonClick}>
1010
<div styleName='esc-mark'>×</div>
11-
<div styleName='esc-text'>esc</div>
11+
<div>esc</div>
1212
</button>
1313
)
1414

browser/components/NoteItem.js

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -148,15 +148,14 @@ NoteItem.propTypes = {
148148
tags: PropTypes.array,
149149
isStarred: PropTypes.bool.isRequired,
150150
isTrashed: PropTypes.bool.isRequired,
151-
blog: {
151+
blog: PropTypes.shape({
152152
blogLink: PropTypes.string,
153153
blogId: PropTypes.number
154-
}
154+
})
155155
}),
156156
handleNoteClick: PropTypes.func.isRequired,
157157
handleNoteContextMenu: PropTypes.func.isRequired,
158-
handleDragStart: PropTypes.func.isRequired,
159-
handleDragEnd: PropTypes.func.isRequired
158+
handleDragStart: PropTypes.func.isRequired
160159
}
161160

162161
export default CSSModules(NoteItem, styles)

browser/components/SideNavFilter.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ SideNavFilter.propTypes = {
7474
isStarredActive: PropTypes.bool.isRequired,
7575
isTrashedActive: PropTypes.bool.isRequired,
7676
handleStarredButtonClick: PropTypes.func.isRequired,
77-
handleTrashdButtonClick: PropTypes.func.isRequired
77+
handleTrashedButtonClick: PropTypes.func.isRequired
7878
}
7979

8080
export default CSSModules(SideNavFilter, styles)

browser/components/SnippetTab.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ class SnippetTab extends React.Component {
114114
>
115115
{snippet.name.trim().length > 0
116116
? snippet.name
117-
: <span styleName='button-unnamed'>
117+
: <span>
118118
{i18n.__('Unnamed')}
119119
</span>
120120
}

browser/components/TodoProcess.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@ const TodoProcess = ({
2525
)
2626

2727
TodoProcess.propTypes = {
28-
todoStatus: {
28+
todoStatus: PropTypes.exact({
2929
total: PropTypes.number.isRequired,
3030
completed: PropTypes.number.isRequired
31-
}
31+
})
3232
}
3333

3434
export default CSSModules(TodoProcess, styles)

0 commit comments

Comments
 (0)