mirror of
https://github.com/marktext/marktext.git
synced 2025-05-03 17:32:46 +08:00
Fix multiple print service bugs (#594)
* Fix print service * Fix printing * Optimize CSS style and remove deprecated code
This commit is contained in:
parent
eb11f110e9
commit
6ec0a215ac
@ -29,7 +29,8 @@ const handleResponseForExport = async (e, { type, content, pathname, markdown })
|
|||||||
let data = content
|
let data = content
|
||||||
try {
|
try {
|
||||||
if (!content && type === 'pdf') {
|
if (!content && type === 'pdf') {
|
||||||
data = await promisify(win.webContents.printToPDF.bind(win.webContents))({ printBackground: false })
|
data = await promisify(win.webContents.printToPDF.bind(win.webContents))({ printBackground: true })
|
||||||
|
removePrintServiceFromWindow(win)
|
||||||
}
|
}
|
||||||
if (data) {
|
if (data) {
|
||||||
await writeFile(filePath, data, extension)
|
await writeFile(filePath, data, extension)
|
||||||
@ -44,7 +45,19 @@ const handleResponseForExport = async (e, { type, content, pathname, markdown })
|
|||||||
message: ERROR_MSG
|
message: ERROR_MSG
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
// User canceled save dialog
|
||||||
|
if (type === 'pdf') {
|
||||||
|
removePrintServiceFromWindow(win)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleResponseForPrint = e => {
|
||||||
|
const win = BrowserWindow.fromWebContents(e.sender)
|
||||||
|
win.webContents.print({ printBackground: true }, () => {
|
||||||
|
removePrintServiceFromWindow(win)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
const handleResponseForSave = (e, { id, markdown, pathname, options }) => {
|
const handleResponseForSave = (e, { id, markdown, pathname, options }) => {
|
||||||
@ -113,6 +126,11 @@ const pandocFile = async pathname => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const removePrintServiceFromWindow = win => {
|
||||||
|
// remove print service content and restore GUI
|
||||||
|
win.webContents.send('AGANI::print-service-clearup')
|
||||||
|
}
|
||||||
|
|
||||||
ipcMain.on('AGANI::save-all', (e, unSavedFiles) => {
|
ipcMain.on('AGANI::save-all', (e, unSavedFiles) => {
|
||||||
Promise.all(unSavedFiles.map(file => handleResponseForSave(e, file)))
|
Promise.all(unSavedFiles.map(file => handleResponseForSave(e, file)))
|
||||||
.catch(log)
|
.catch(log)
|
||||||
@ -178,6 +196,8 @@ ipcMain.on('AGANI::response-file-save', handleResponseForSave)
|
|||||||
|
|
||||||
ipcMain.on('AGANI::response-export', handleResponseForExport)
|
ipcMain.on('AGANI::response-export', handleResponseForExport)
|
||||||
|
|
||||||
|
ipcMain.on('AGANI::response-print', handleResponseForPrint)
|
||||||
|
|
||||||
ipcMain.on('AGANI::close-window', e => {
|
ipcMain.on('AGANI::close-window', e => {
|
||||||
const win = BrowserWindow.fromWebContents(e.sender)
|
const win = BrowserWindow.fromWebContents(e.sender)
|
||||||
appWindow.forceClose(win)
|
appWindow.forceClose(win)
|
||||||
|
@ -81,9 +81,9 @@ class Muya {
|
|||||||
return this.contentState.history.clearHistory()
|
return this.contentState.history.clearHistory()
|
||||||
}
|
}
|
||||||
|
|
||||||
exportStyledHTML (filename) {
|
exportStyledHTML (title = '', printOptimization = false) {
|
||||||
const { markdown } = this
|
const { markdown } = this
|
||||||
return new ExportHtml(markdown).generate(filename)
|
return new ExportHtml(markdown).generate(title, printOptimization)
|
||||||
}
|
}
|
||||||
|
|
||||||
exportHtml () {
|
exportHtml () {
|
||||||
|
@ -38,20 +38,27 @@ class ExportHtml {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
// get html with style
|
/**
|
||||||
generate (filename = '') {
|
* Get HTML with style
|
||||||
|
*
|
||||||
|
* @param {*} title Page title
|
||||||
|
* @param {*} printOptimization Optimize HTML and CSS for printing
|
||||||
|
*/
|
||||||
|
generate (title = '', printOptimization = false) {
|
||||||
|
// WORKAROUND: Hide Prism.js style when exporting or printing. Otherwise the background color is white in the dark theme.
|
||||||
|
const highlightCssStyle = printOptimization ? `@media print { ${highlightCss} }` : highlightCss
|
||||||
const html = this.renderHtml()
|
const html = this.renderHtml()
|
||||||
return `<!DOCTYPE html>
|
return `<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
<title>${filename}</title>
|
<title>${title}</title>
|
||||||
<style>
|
<style>
|
||||||
${githubMarkdownCss}
|
${githubMarkdownCss}
|
||||||
</style>
|
</style>
|
||||||
<style>
|
<style>
|
||||||
${highlightCss}
|
${highlightCssStyle}
|
||||||
</style>
|
</style>
|
||||||
<style>
|
<style>
|
||||||
${katexCss}
|
${katexCss}
|
||||||
|
@ -29,14 +29,11 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
html, body {
|
html, body {
|
||||||
font-size: 16px;
|
|
||||||
background: rgb(45, 45, 45);
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
font-family: "Open Sans", "Clear Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
|
font-family: "Open Sans", "Clear Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||||||
|
font-size: 16px;
|
||||||
color: rgb(217, 217, 217);
|
color: rgb(217, 217, 217);
|
||||||
line-height: 1.6;
|
line-height: 1.6;
|
||||||
|
background: rgb(45, 45, 45);
|
||||||
}
|
}
|
||||||
|
|
||||||
::-webkit-scrollbar {
|
::-webkit-scrollbar {
|
||||||
|
@ -29,14 +29,11 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
html, body {
|
html, body {
|
||||||
font-size: 16px;
|
|
||||||
background: rgb(252, 252, 252);
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
font-family: "Open Sans", "Clear Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
|
font-family: "Open Sans", "Clear Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||||||
|
font-size: 16px;
|
||||||
color: #303133;
|
color: #303133;
|
||||||
line-height: 1.6;
|
line-height: 1.6;
|
||||||
|
background: rgb(252, 252, 252);
|
||||||
}
|
}
|
||||||
|
|
||||||
::-webkit-scrollbar {
|
::-webkit-scrollbar {
|
||||||
|
@ -139,6 +139,7 @@
|
|||||||
dispatch('LINTEN_FOR_SET_LINE_ENDING')
|
dispatch('LINTEN_FOR_SET_LINE_ENDING')
|
||||||
dispatch('LISTEN_FOR_NEW_TAB')
|
dispatch('LISTEN_FOR_NEW_TAB')
|
||||||
dispatch('LISTEN_FOR_CLOSE_TAB')
|
dispatch('LISTEN_FOR_CLOSE_TAB')
|
||||||
|
dispatch('LINTEN_FOR_PRINT_SERVICE_CLEARUP')
|
||||||
dispatch('LINTEN_FOR_EXPORT_SUCCESS')
|
dispatch('LINTEN_FOR_EXPORT_SUCCESS')
|
||||||
dispatch('LISTEN_FOR_SET_TEXT_DIRECTION')
|
dispatch('LISTEN_FOR_SET_TEXT_DIRECTION')
|
||||||
dispatch('LISTEN_FOR_TEXT_DIRECTION_MENU')
|
dispatch('LISTEN_FOR_TEXT_DIRECTION_MENU')
|
||||||
|
@ -3,8 +3,8 @@ body article.print-container {
|
|||||||
}
|
}
|
||||||
@media print {
|
@media print {
|
||||||
/* General rules for printing. */
|
/* General rules for printing. */
|
||||||
body {
|
html, body {
|
||||||
background: transparent none;
|
background: transparent !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
body > div {
|
body > div {
|
||||||
|
@ -215,6 +215,7 @@
|
|||||||
bus.$on('undo', this.handleUndo)
|
bus.$on('undo', this.handleUndo)
|
||||||
bus.$on('redo', this.handleRedo)
|
bus.$on('redo', this.handleRedo)
|
||||||
bus.$on('export', this.handleExport)
|
bus.$on('export', this.handleExport)
|
||||||
|
bus.$on('print-service-clearup', this.handlePrintServiceClearup)
|
||||||
bus.$on('paragraph', this.handleEditParagraph)
|
bus.$on('paragraph', this.handleEditParagraph)
|
||||||
bus.$on('format', this.handleInlineFormat)
|
bus.$on('format', this.handleInlineFormat)
|
||||||
bus.$on('searchValue', this.handleSearch)
|
bus.$on('searchValue', this.handleSearch)
|
||||||
@ -367,9 +368,10 @@
|
|||||||
},
|
},
|
||||||
|
|
||||||
handlePrint () {
|
handlePrint () {
|
||||||
const html = this.editor.exportHtml()
|
// generate styled HTML with empty title and optimized for printing
|
||||||
const printer = new Printer(html)
|
const html = this.editor.exportStyledHTML('', true)
|
||||||
printer.print()
|
this.printer.renderMarkdown(html)
|
||||||
|
this.$store.dispatch('PRINT_RESPONSE')
|
||||||
},
|
},
|
||||||
|
|
||||||
handleExport (type) {
|
handleExport (type) {
|
||||||
@ -382,7 +384,8 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
case 'pdf': {
|
case 'pdf': {
|
||||||
const html = this.editor.exportStyledHTML()
|
// generate styled HTML with empty title and optimized for printing
|
||||||
|
const html = this.editor.exportStyledHTML('', true)
|
||||||
this.printer.renderMarkdown(html)
|
this.printer.renderMarkdown(html)
|
||||||
this.$store.dispatch('EXPORT', { type, markdown })
|
this.$store.dispatch('EXPORT', { type, markdown })
|
||||||
break
|
break
|
||||||
@ -390,6 +393,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
handlePrintServiceClearup () {
|
||||||
|
this.printer.clearup()
|
||||||
|
},
|
||||||
|
|
||||||
handleEditParagraph (type) {
|
handleEditParagraph (type) {
|
||||||
if (type === 'table') {
|
if (type === 'table') {
|
||||||
this.tableChecker = { rows: 4, columns: 3 }
|
this.tableChecker = { rows: 4, columns: 3 }
|
||||||
|
@ -9,12 +9,6 @@ class MarkdownPrint {
|
|||||||
printContainer.innerHTML = html
|
printContainer.innerHTML = html
|
||||||
}
|
}
|
||||||
|
|
||||||
print (html) {
|
|
||||||
this.renderMarkdown(html)
|
|
||||||
window.print()
|
|
||||||
this.clearup()
|
|
||||||
}
|
|
||||||
|
|
||||||
clearup () {
|
clearup () {
|
||||||
if (this.container) {
|
if (this.container) {
|
||||||
this.container.remove()
|
this.container.remove()
|
||||||
|
@ -494,6 +494,16 @@ const actions = {
|
|||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
|
PRINT_RESPONSE ({ commit }) {
|
||||||
|
ipcRenderer.send('AGANI::response-print')
|
||||||
|
},
|
||||||
|
|
||||||
|
LINTEN_FOR_PRINT_SERVICE_CLEARUP ({ commit }) {
|
||||||
|
ipcRenderer.on('AGANI::print-service-clearup', e => {
|
||||||
|
bus.$emit('print-service-clearup')
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
LISTEN_FOR_INSERT_IMAGE ({ commit, state }) {
|
LISTEN_FOR_INSERT_IMAGE ({ commit, state }) {
|
||||||
ipcRenderer.on('AGANI::INSERT_IMAGE', (e, { filename: imagePath, type }) => {
|
ipcRenderer.on('AGANI::INSERT_IMAGE', (e, { filename: imagePath, type }) => {
|
||||||
if (!hasKeys(state.currentFile)) return
|
if (!hasKeys(state.currentFile)) return
|
||||||
|
Loading…
Reference in New Issue
Block a user