mirror of
https://github.com/marktext/marktext.git
synced 2025-05-03 04:51:28 +08:00
Merge 2ed837da4a
into 11c8cc1e19
This commit is contained in:
commit
eb4cb7fb58
@ -460,17 +460,30 @@ class App {
|
|||||||
ipcMain.on('app-create-settings-window', category => {
|
ipcMain.on('app-create-settings-window', category => {
|
||||||
this._openSettingsWindow(category)
|
this._openSettingsWindow(category)
|
||||||
})
|
})
|
||||||
|
ipcMain.on('scroll-to-header-by-name', (windowId, slug) => {
|
||||||
ipcMain.on('app-open-file-by-id', (windowId, filePath) => {
|
let editor = this._windowManager.get(windowId)
|
||||||
|
const win = editor.browserWindow
|
||||||
|
win.webContents.send('mt::scroll-to-header-by-name', slug)
|
||||||
|
})
|
||||||
|
ipcMain.on('app-open-file-by-id', (windowId, filePath, slug) => {
|
||||||
const openFilesInNewWindow = this._accessor.preferences.getItem('openFilesInNewWindow')
|
const openFilesInNewWindow = this._accessor.preferences.getItem('openFilesInNewWindow')
|
||||||
|
let editor = null
|
||||||
if (openFilesInNewWindow) {
|
if (openFilesInNewWindow) {
|
||||||
this._createEditorWindow(null, [filePath])
|
this._createEditorWindow(null, [filePath])
|
||||||
} else {
|
} else {
|
||||||
const editor = this._windowManager.get(windowId)
|
editor = this._windowManager.get(windowId)
|
||||||
if (editor) {
|
if (editor) {
|
||||||
editor.openTab(filePath, {}, true)
|
editor.openTab(filePath, {}, true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (!slug) { return }
|
||||||
|
|
||||||
|
if (!editor) { editor = this._windowManager.get(windowId) }
|
||||||
|
if (!editor) { return }
|
||||||
|
const win = editor.browserWindow
|
||||||
|
|
||||||
|
// probably should pass this further down but at least createEditorWindow isn't setup great for taking params.
|
||||||
|
setTimeout(() => win.webContents.send('mt::scroll-to-header-by-name', slug), 250)
|
||||||
})
|
})
|
||||||
ipcMain.on('app-open-files-by-id', (windowId, fileList) => {
|
ipcMain.on('app-open-files-by-id', (windowId, fileList) => {
|
||||||
const openFilesInNewWindow = this._accessor.preferences.getItem('openFilesInNewWindow')
|
const openFilesInNewWindow = this._accessor.preferences.getItem('openFilesInNewWindow')
|
||||||
|
@ -417,8 +417,25 @@ ipcMain.on('mt::format-link-click', (e, { data, dirname }) => {
|
|||||||
if (!data || (!data.href && !data.text)) {
|
if (!data || (!data.href && !data.text)) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
let parsedUrl = null
|
||||||
|
let slug = null
|
||||||
|
|
||||||
const urlCandidate = data.href || data.text
|
let urlCandidate = data.href || data.text
|
||||||
|
if (typeof (urlCandidate) === 'string') {
|
||||||
|
try {
|
||||||
|
parsedUrl = new URL(urlCandidate, 'b:/fake/')
|
||||||
|
if (parsedUrl.protocol === 'b:') { // seems like a local file
|
||||||
|
if (parsedUrl.hash) {
|
||||||
|
slug = parsedUrl.hash.substring(1)
|
||||||
|
if (urlCandidate.endsWith(parsedUrl.hash)) {
|
||||||
|
urlCandidate = urlCandidate.substring(0, urlCandidate.length - parsedUrl.hash.length)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
if (URL_REG.test(urlCandidate)) {
|
if (URL_REG.test(urlCandidate)) {
|
||||||
shell.openExternal(urlCandidate)
|
shell.openExternal(urlCandidate)
|
||||||
return
|
return
|
||||||
@ -427,8 +444,12 @@ ipcMain.on('mt::format-link-click', (e, { data, dirname }) => {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
const href = data.href
|
const href = urlCandidate
|
||||||
if (!href) {
|
if (!href) {
|
||||||
|
if (slug) {
|
||||||
|
const win = BrowserWindow.fromWebContents(e.sender)
|
||||||
|
gotoSlug(win, slug)
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -443,7 +464,7 @@ ipcMain.on('mt::format-link-click', (e, { data, dirname }) => {
|
|||||||
pathname = path.normalize(pathname)
|
pathname = path.normalize(pathname)
|
||||||
if (isMarkdownFile(pathname)) {
|
if (isMarkdownFile(pathname)) {
|
||||||
const win = BrowserWindow.fromWebContents(e.sender)
|
const win = BrowserWindow.fromWebContents(e.sender)
|
||||||
openFileOrFolder(win, pathname)
|
openFileOrFolder(win, pathname, slug)
|
||||||
} else {
|
} else {
|
||||||
shell.openPath(pathname)
|
shell.openPath(pathname)
|
||||||
}
|
}
|
||||||
@ -533,11 +554,13 @@ export const openFolder = async win => {
|
|||||||
openFileOrFolder(win, filePaths[0])
|
openFileOrFolder(win, filePaths[0])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
export const gotoSlug = (win, slug) => {
|
||||||
export const openFileOrFolder = (win, pathname) => {
|
ipcMain.emit('scroll-to-header-by-name', win.id, slug)
|
||||||
|
}
|
||||||
|
export const openFileOrFolder = (win, pathname, slug) => {
|
||||||
const resolvedPath = normalizeAndResolvePath(pathname)
|
const resolvedPath = normalizeAndResolvePath(pathname)
|
||||||
if (isFile(resolvedPath)) {
|
if (isFile(resolvedPath)) {
|
||||||
ipcMain.emit('app-open-file-by-id', win.id, resolvedPath)
|
ipcMain.emit('app-open-file-by-id', win.id, resolvedPath, slug)
|
||||||
} else if (isDirectory(resolvedPath)) {
|
} else if (isDirectory(resolvedPath)) {
|
||||||
ipcMain.emit('app-open-directory-by-id', win.id, resolvedPath)
|
ipcMain.emit('app-open-directory-by-id', win.id, resolvedPath)
|
||||||
} else {
|
} else {
|
||||||
|
@ -588,6 +588,7 @@ export default {
|
|||||||
bus.$on('deleteParagraph', this.handleParagraph)
|
bus.$on('deleteParagraph', this.handleParagraph)
|
||||||
bus.$on('insertParagraph', this.handleInsertParagraph)
|
bus.$on('insertParagraph', this.handleInsertParagraph)
|
||||||
bus.$on('scroll-to-header', this.scrollToHeader)
|
bus.$on('scroll-to-header', this.scrollToHeader)
|
||||||
|
bus.$on('scroll-to-header-by-name', this.scrollToHeaderByName)
|
||||||
bus.$on('screenshot-captured', this.handleScreenShot)
|
bus.$on('screenshot-captured', this.handleScreenShot)
|
||||||
bus.$on('switch-spellchecker-language', this.switchSpellcheckLanguage)
|
bus.$on('switch-spellchecker-language', this.switchSpellcheckLanguage)
|
||||||
bus.$on('open-command-spellchecker-switch-language', this.openSpellcheckerLanguageCommand)
|
bus.$on('open-command-spellchecker-switch-language', this.openSpellcheckerLanguageCommand)
|
||||||
@ -907,6 +908,16 @@ export default {
|
|||||||
scrollToHeader (slug) {
|
scrollToHeader (slug) {
|
||||||
return this.scrollToElement(`#${slug}`)
|
return this.scrollToElement(`#${slug}`)
|
||||||
},
|
},
|
||||||
|
tocNameToSlugName (slug) {
|
||||||
|
return slug.toLowerCase().replace(/[^a-zA-Z0-9 ]/g, '').replace(/\s+/g, '-')
|
||||||
|
},
|
||||||
|
scrollToHeaderByName (slug) {
|
||||||
|
this.editor.contentState.getTOC().forEach(item => {
|
||||||
|
if (this.tocNameToSlugName(item.content) === slug) {
|
||||||
|
this.scrollToHeader(item.slug)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
scrollToElement (selector) {
|
scrollToElement (selector) {
|
||||||
// Scroll to search highlight word
|
// Scroll to search highlight word
|
||||||
@ -1142,6 +1153,7 @@ export default {
|
|||||||
bus.$off('deleteParagraph', this.handleParagraph)
|
bus.$off('deleteParagraph', this.handleParagraph)
|
||||||
bus.$off('insertParagraph', this.handleInsertParagraph)
|
bus.$off('insertParagraph', this.handleInsertParagraph)
|
||||||
bus.$off('scroll-to-header', this.scrollToHeader)
|
bus.$off('scroll-to-header', this.scrollToHeader)
|
||||||
|
bus.$off('scroll-to-header-by-name', this.scrollToHeaderByName)
|
||||||
bus.$off('screenshot-captured', this.handleScreenShot)
|
bus.$off('screenshot-captured', this.handleScreenShot)
|
||||||
bus.$off('switch-spellchecker-language', this.switchSpellcheckLanguage)
|
bus.$off('switch-spellchecker-language', this.switchSpellcheckLanguage)
|
||||||
bus.$off('open-command-spellchecker-switch-language', this.openSpellcheckerLanguageCommand)
|
bus.$off('open-command-spellchecker-switch-language', this.openSpellcheckerLanguageCommand)
|
||||||
|
@ -138,6 +138,7 @@ export default {
|
|||||||
dispatch('LISTEN_FOR_UPDATE')
|
dispatch('LISTEN_FOR_UPDATE')
|
||||||
// module: editor
|
// module: editor
|
||||||
dispatch('LISTEN_SCREEN_SHOT')
|
dispatch('LISTEN_SCREEN_SHOT')
|
||||||
|
dispatch('LISTEN_SCROLL_TO_HEADER')
|
||||||
dispatch('ASK_FOR_USER_PREFERENCE')
|
dispatch('ASK_FOR_USER_PREFERENCE')
|
||||||
dispatch('LISTEN_TOGGLE_VIEW')
|
dispatch('LISTEN_TOGGLE_VIEW')
|
||||||
dispatch('LISTEN_FOR_CLOSE')
|
dispatch('LISTEN_FOR_CLOSE')
|
||||||
|
@ -344,6 +344,11 @@ const actions = {
|
|||||||
bus.$emit('screenshot-captured')
|
bus.$emit('screenshot-captured')
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
LISTEN_SCROLL_TO_HEADER ({ commit }) {
|
||||||
|
ipcRenderer.on('mt::scroll-to-header-by-name', (e, slug) => {
|
||||||
|
bus.$emit('scroll-to-header-by-name', slug)
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
// image path auto complement
|
// image path auto complement
|
||||||
ASK_FOR_IMAGE_AUTO_PATH ({ commit, state }, src) {
|
ASK_FOR_IMAGE_AUTO_PATH ({ commit, state }, src) {
|
||||||
|
Loading…
Reference in New Issue
Block a user