import { NButton, NInput, NInputGroup, NStep, NSteps } from 'naive-ui' import { computed, defineComponent, ref } from 'vue' import { currentConfig } from '~/core/config.ts' import { OceanPress } from '~/core/ocean_press.ts' import { vApi } from '~/core/siyuan_api.ts' import Config_tab from '~/pages/config_tab.tsx' import Step1_selectNote from './step1_selectNote.tsx' import Step3_config from './step3_config.tsx' import Step4_generate from './step4_generate.tsx' import { Context, Effect } from 'effect' import { EffectRender, EffectLocalStorageDep, EffectLogDep, EffectConfigDep, } from '~/core/EffectDep.ts' import { renderApiDep } from '~/core/render.api.dep.ts' import { bowerApiDep } from '~/util/store.bower.dep.ts' export default defineComponent({ setup() { const _notebooks = vApi.notebook_lsNotebooks() const current = computed(() => { let i = 0 if (_notebooks.value.fulfilled) i = 2 i = 5 return i }) const percentage = ref(0) const genHTML_status = ref(false) const log = ref('') async function genHTML(otherConfig?: { /** 实验性api https://github.com/WICG/file-system-access/blob/main/EXPLAINER.md */ dir_ref: any }) { genHTML_status.value = true log.value = '' const ocean_press = new OceanPress(currentConfig.value) // 浏览器端写磁盘插件 if (otherConfig?.dir_ref) { ocean_press.pluginCenter.registerPlugin({ build_onFileTree([tree]) { writeFileSystem(tree, otherConfig.dir_ref) }, }) } const context = Context.empty().pipe( Context.add(EffectRender, renderApiDep), Context.add(EffectLocalStorageDep, bowerApiDep), Context.add(EffectConfigDep, currentConfig.value), Context.add(EffectLogDep, { log: (msg) => { log.value += msg + '\n' }, percentage: (n) => { percentage.value = n }, }), ) const p = Effect.provide(ocean_press.build(), context) await Effect.runPromise(p) genHTML_status.value = false percentage.value = 100 } return () => ( <> http apiPrefix: authorized: 确定 {_notebooks.value.fulfilled && ( )} {/* sw 存在很大的问题,暂时取消预览功能 */} {/* */} genHTML()} onSaveToDisk={(dir_ref: any) => genHTML({ dir_ref })} /> ) }, }) /** chrome系高版本可用 */ async function writeFileSystem( fileTree: { [htmlPath: string]: string | ArrayBuffer }, dir_ref: any, ) { /** 并发写文件 */ await Promise.all( Object.entries(fileTree).map(async ([path, html]) => { await writeFile(dir_ref, path, html).catch((e) => { console.log(e, dir_ref) }) }), ) async function writeFile( dir_ref: any, name: string, data: string | ArrayBuffer, ) { const pathArr = name.split('/') /** 如果路径中的目录不存在则创建 */ if (pathArr.length > 1) { for (let i = 0; i < pathArr.length - 1; i++) { const dirName = pathArr[i] if (dirName === '') { continue } dir_ref = await dir_ref.getDirectoryHandle(dirName, { create: true }) } } /** 写文件 */ const new_file = await dir_ref.getFileHandle(pathArr[pathArr.length - 1], { create: true, }) const new_file_writer = await new_file.createWritable() await new_file_writer.write(data) await new_file_writer.close() } }