diff --git a/src/main/server/convert.ts b/src/main/server/convert.ts
index 88248a3c..6417bb8d 100644
--- a/src/main/server/convert.ts
+++ b/src/main/server/convert.ts
@@ -12,7 +12,7 @@ const convert = async (html: string, type: string) => {
const path = os.tmpdir() + `/yn_convert_${new Date().getTime()}.${type}`
return new Promise((resolve, reject) => {
- const args = ['-f', 'html', '-o', path, '--reference-doc', docxTplPath]
+ const args = ['--self-contained', '-f', 'html', '-o', path, '--reference-doc', docxTplPath]
console.log(binPath, args)
const process = spawn(binPath, args)
diff --git a/src/main/server/index.ts b/src/main/server/index.ts
index 899a2719..e40be624 100644
--- a/src/main/server/index.ts
+++ b/src/main/server/index.ts
@@ -150,7 +150,7 @@ const convertFile = async (ctx: any, next: any) => {
const html = ctx.request.body.html
const type = ctx.request.body.type
- ctx.type = mime.getType(`file.${type}`)
+ ctx.set('content-type', 'application/octet-stream')
ctx.body = await convert(html, type)
} else {
await next()
diff --git a/src/renderer/components/ExportPanel.vue b/src/renderer/components/ExportPanel.vue
new file mode 100644
index 00000000..a7f7ecda
--- /dev/null
+++ b/src/renderer/components/ExportPanel.vue
@@ -0,0 +1,262 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/renderer/components/Preview.vue b/src/renderer/components/Preview.vue
index aa47cc93..33511a50 100644
--- a/src/renderer/components/Preview.vue
+++ b/src/renderer/components/Preview.vue
@@ -11,15 +11,9 @@
-
@@ -48,8 +42,7 @@ import { isElectron } from '@fe/utils/env'
import { markdown } from '@fe/context/markdown'
import { triggerHook } from '@fe/context/plugin'
import { useBus } from '@fe/support/bus'
-import { useToast } from '@fe/support/toast'
-import { registerAction, removeAction } from '@fe/context/action'
+import { getActionHandler, registerAction, removeAction } from '@fe/context/action'
import { revealLineInCenter } from '@fe/context/editor'
import Render from './Render.vue'
@@ -63,7 +56,6 @@ export default defineComponent({
setup () {
const bus = useBus()
const store = useStore()
- const toast = useToast()
const { currentContent, currentFile, autoPreview, presentation } = toRefs(store.state)
const fileName = computed(() => currentFile.value?.name)
@@ -71,7 +63,6 @@ export default defineComponent({
const refViewWrapper = ref(null)
const refView = ref(null)
- const refConvertForm = ref(null)
const renderContent = ref()
@@ -85,7 +76,6 @@ export default defineComponent({
level: number;
sourceLine: number;
}[]>([])
- const convert = ref({ fileName: '', html: '', type: '' })
const todoCount = ref(0)
const todoDoneCount = ref(0)
const scrollTop = ref(0)
@@ -191,38 +181,25 @@ export default defineComponent({
}
}
- function convertFile (type: string) {
- triggerHook('ON_VIEW_BEFORE_CONVERT', { getViewDom })
-
- toast.show('info', '转换中,请稍候……')
-
- let baseUrl = location.origin + location.pathname.substring(0, location.pathname.lastIndexOf('/')) + '/'
-
- // Windows 下偶尔解析 localhost 很耗时,这里直接用 ip 代替
- if (/^(http|https):\/\/localhost/i.test(baseUrl)) {
- baseUrl = baseUrl.replace(/localhost/i, '127.0.0.1')
- }
-
- convert.value = {
- fileName: (fileName.value || '未命名') + `.${type}`,
- html: refView.value!.outerHTML.replace(/src="api/g, `src="${baseUrl}api`),
- type
- }
- setTimeout(() => {
- refConvertForm.value!.submit()
- }, 300)
- }
-
function print () {
window.print()
}
+ function showExport () {
+ getActionHandler('doc.show-export')()
+ }
+
+ function getContentHtml () {
+ return refView.value?.outerHTML || ''
+ }
+
onMounted(() => {
nextTick(renderDebonce)
triggerHook('ON_VIEW_MOUNTED', { getViewDom })
registerAction({ name: 'view.refresh', handler: render })
registerAction({ name: 'view.reveal-line', handler: revealLine })
registerAction({ name: 'view.scroll-top-to', handler: scrollTopTo })
+ registerAction({ name: 'view.get-content-html', handler: getContentHtml })
window.addEventListener('keydown', keydownHandler, true)
bus.on('global.resize', resizeHandler)
resizeHandler()
@@ -232,6 +209,7 @@ export default defineComponent({
removeAction('view.refresh')
removeAction('view.reveal-line')
removeAction('view.scroll-top-to')
+ removeAction('view.get-content-html')
window.removeEventListener('keydown', keydownHandler)
bus.off('global.resize', resizeHandler)
})
@@ -245,7 +223,6 @@ export default defineComponent({
return {
refViewWrapper,
- refConvertForm,
refView,
presentation,
renderContent,
@@ -253,12 +230,11 @@ export default defineComponent({
height,
scrollToTopStyle,
heads,
- convert,
todoCount,
todoDoneCount,
scrollTop,
print,
- convertFile,
+ showExport,
handleScroll,
handleRender,
handleRendered,
@@ -360,7 +336,7 @@ export default defineComponent({
background: var(--g-color-75);
}
-.convert {
+.action-btns {
font-size: 14px;
pointer-events: initial;
}
diff --git a/src/renderer/components/SettingPanel.vue b/src/renderer/components/SettingPanel.vue
index 72e14b36..223a9ec5 100644
--- a/src/renderer/components/SettingPanel.vue
+++ b/src/renderer/components/SettingPanel.vue
@@ -11,7 +11,7 @@ import XMask from './Mask.vue'
import Setting from './Setting.vue'
export default defineComponent({
- name: 'x-filter',
+ name: 'setting-panel',
components: { XMask, Setting },
setup () {
const store = useStore()
diff --git a/src/renderer/components/Toast.vue b/src/renderer/components/Toast.vue
index 5437d4c0..d7cac1d2 100644
--- a/src/renderer/components/Toast.vue
+++ b/src/renderer/components/Toast.vue
@@ -1,5 +1,5 @@
- {{toast.content}}
+ {{toast.content}}