Skip to content

Commit

Permalink
feat: #319 PicGO图形化配置界面-hook文件重构
Browse files Browse the repository at this point in the history
  • Loading branch information
terwer committed Feb 8, 2023
1 parent f05e829 commit 10d9704
Show file tree
Hide file tree
Showing 6 changed files with 252 additions and 87 deletions.
8 changes: 4 additions & 4 deletions components/picgo/PicgoSetting.vue
Expand Up @@ -28,10 +28,8 @@
<blockquote class="picgo-setting-tip">
<div>
{{ $t("picgo.siyuan.tip") }} 。 从 0.7.0+
开始,支持多个配置文件切换,默认的 PicGO 配置文件为:
<pre
style="display: inline-block"
><code>[思源工作空间]/data/storage/syp/picgo/picgo.cfg.json</code></pre>
开始,支持多个配置文件切换,当前系统默认的 PicGO 配置文件为:
<pre style="display: inline-block"><code>{{ picgoCfg }}</code></pre>
{{ $t("setting.picgo.refer.to") }}
<a
Expand Down Expand Up @@ -69,8 +67,10 @@ import { isElectron } from "~/utils/browserUtil"
import PicbedSetting from "~/components/picgo/setting/PicbedSetting.vue"
import PicgoConfigSetting from "~/components/picgo/setting/PicgoConfigSetting.vue"
import { ref } from "vue"
import picgoUtil from "~/utils/otherlib/picgoUtil"
const isReload = ref(false)
const picgoCfg = picgoUtil.getPicgoCfgPath()
const picgoSettingTabChange = () => {
isReload.value = !isReload.value
Expand Down
5 changes: 5 additions & 0 deletions components/picgo/setting/ConfigForm.vue
Expand Up @@ -241,6 +241,11 @@ const onBack = () => {
const onSubmit = async () => {
const result = (await validate()) || false
if (result !== false) {
// 图床配置表单
if (props.configType === "uploader") {
picgoUtil.updateUploaderConfig(props.id, result?._id, result)
}
onBack()
}
}
Expand Down
2 changes: 1 addition & 1 deletion components/picgo/setting/PicgoConfigSetting.vue
Expand Up @@ -25,7 +25,7 @@

<template>
<div>
<el-form>
<el-form label-width="125px">
<el-form-item :label="$t('setting.picgo.picgo.open.config.file')">
<el-button>{{ $t("setting.picgo.picgo.click.to.open") }}</el-button>
</el-form-item>
Expand Down
298 changes: 218 additions & 80 deletions public/lib/siyuanhook.js
Expand Up @@ -23,10 +23,27 @@
* questions.
*/

// 警告⚠️:请勿在非思源笔记浏览器环境调用此文件中的任何方法
// 警告1⚠️:请勿在非思源笔记浏览器环境调用此文件中的任何方法
// 警告2⚠️:此文件请勿引用其他任何需要编译的类库
// 提示3⚠️:此文件是挂件唯一的hook入口

console.warn("从0.6.8+开始,siyuanhook.js将作为统一的hook入口。")

/**
* 是否是Electron环境,等价于isInSiyuanOrSiyuanNewWin
*/
const isElectron = /Electron/.test(navigator.userAgent)

/**
* 思源笔记或者思源笔记新窗口,等价于Electron环境
*/
const isInSiyuanOrSiyuanNewWin = () => {
return isElectron
}

/**
* 思源笔记Iframe挂件环境
*/
const isSiyuanWidget = () => {
return (
window.frameElement != null &&
Expand All @@ -38,106 +55,227 @@ const isSiyuanWidget = () => {
)
}

/**
* 思源笔记新窗口
*/
const isSiyuanNewWin = () => {
return typeof window.terwer !== "undefined"
}

/**
* 获取可操作的Window
*/
const getSiyuanWindow = () => {
if (!isInSiyuanOrSiyuanNewWin()) {
return window
}

if (isSiyuanWidget()) {
return parent.window
} else {
return window
}
}

/**
* 获取新窗口数据目录
*/
const getSiyuanNewWinDataDir = () => {
return window.terwer.dataDir ?? "/notfound"
}

/**
* 获取数据目录
*/
export const getSiyuanDataDir = () => {
const syWin = getSiyuanWindow()

if (isSiyuanWidget()) {
return syWin.siyuan.config.system.dataDir
} else {
if (isSiyuanNewWin()) {
return getSiyuanNewWinDataDir()
} else {
return syWin.siyuan.config.system.dataDir
}
}
}

/**
* 获取跨平台的配置文件路径
*/
const getCrossPlatformAppDataFolder = () => {
const syWin = getSiyuanWindow()
const path = syWin.require("path")

let configFilePath
if (process.platform === "darwin") {
configFilePath = path.join(process.env.HOME, "/Library/Application Support")
} else if (process.platform === "win32") {
configFilePath = path.join(process.env.APPDATA, "Roaming")
} else if (process.platform === "linux") {
configFilePath = process.env.HOME
}

return configFilePath
}

/**
* 引入依赖
*
* @param entryName 运行模式名称
* @param libpath 依赖全路径
* @param alias 依赖别名
* @author terwer
* @since 0.7.0
*/
const requireLib = (entryName, libpath, alias) => {
const syWin = getSiyuanWindow()
console.log(entryName + "将要从以下位置引入" + alias, libpath)
return syWin.require(libpath)
}

// 初始化方法统一定义
const initMethods = {
/**
* 初始化 sy-post-publisher 配置文件存储,适用于【iframe挂件模式】、【新窗口模式】以及【js片段模式】
*/
initLocalStorageMethod: (entryName) => {
const syWin = getSiyuanWindow()
const dataDir = getSiyuanDataDir()

// 挂载JsonLocalStorage到window
const LocalStorage = requireLib(
entryName,
`${dataDir}/widgets/sy-post-publisher/lib/json-localstorage/json-localstorage.js`,
"json-localstorage"
)
LocalStorage.init("../../../../storage/syp/")
},

/**
* 初始化插槽,仅【iframe挂件模式】、【自定义js片段模式】可用
* @param entryName 入口名称
*/
initSlotMethod: (entryName) => {
const syWin = getSiyuanWindow()

// 初始化插槽
const initSlot = requireLib(
entryName,
`${syWin.siyuan.config.system.dataDir}/widgets/sy-post-publisher/lib/siyuan/silot.js`,
"插槽"
)
initSlot()
},

/**
* 初始化主题适配,仅【iframe挂件模式】可用
* @param entryName 入口名称
*/
initThemeAdaptor: (entryName) => {
const syWin = getSiyuanWindow()

// 初始化主题适配
const initTheme = requireLib(
entryName,
`${syWin.siyuan.config.system.dataDir}/widgets/sy-post-publisher/lib/siyuan/theme.js`,
"自定义主题片段"
)
setTimeout(initTheme, 1000)
},
}

// iframe挂件
const initIframeWidaget = () => {
// 初始化插槽
const slotLibPath = `${parent.window.siyuan.config.system.dataDir}/widgets/sy-post-publisher/lib/siyuan/silot.js`
console.log("iframe挂件将要从以下位置引入插槽", slotLibPath)
const initSlot = parent.window.require(slotLibPath)
initSlot()

// 挂载JsonLocalStorage到window
const jsonLocalstorageLibPath = `${parent.window.siyuan.config.system.dataDir}/widgets/sy-post-publisher/lib/json-localstorage/json-localstorage.js`
console.log(
"iframe挂件将要从以下位置引入json-localstorage",
jsonLocalstorageLibPath
)
const LocalStorage = parent.window.require(jsonLocalstorageLibPath)
LocalStorage.init("../../../../storage/syp/")

// 挂载PicGO到window
const syPicgoLibPath = `${parent.window.siyuan.config.system.dataDir}/widgets/sy-post-publisher/lib/picgo/picgo.js`
console.log("iframe挂件将要从以下位置引入sy-picgo", syPicgoLibPath)
const picgoExtension = parent.window.require(syPicgoLibPath).default
picgoExtension.initPicgo(
`${parent.window.siyuan.config.system.dataDir}/storage/syp/picgo/picgo.cfg.json`
)
initMethods.initLocalStorageMethod("iframe挂件")

// 初始化发布辅助功能
const publishHelperLibPath = `${parent.window.siyuan.config.system.dataDir}/widgets/sy-post-publisher/lib/siyuan/publish-helper.js`
console.log("iframe挂件将要从以下位置引入发布辅助功能", publishHelperLibPath)
const initPublishHelper = parent.window.require(publishHelperLibPath)
initPublishHelper()
// 初始化插槽
initMethods.initSlotMethod("iframe挂件")

// 初始化主题适配
const themeAdaptorLibPath = `${parent.window.siyuan.config.system.dataDir}/widgets/sy-post-publisher/lib/siyuan/theme.js`
console.log(
"iframe挂件将要从以下位置引入主题适配脚本theme.js",
themeAdaptorLibPath
)
const initTheme = parent.window.require(themeAdaptorLibPath)
setTimeout(initTheme, 1000)
initMethods.initThemeAdaptor("iframe挂件")

// // 挂载PicGO到window
// const syPicgoLibPath = `${parent.window.siyuan.config.system.dataDir}/widgets/sy-post-publisher/lib/picgo/picgo.js`
// console.log("iframe挂件将要从以下位置引入sy-picgo", syPicgoLibPath)
// const picgoExtension = parent.window.require(syPicgoLibPath).default
// // PicGO存储到配置目录,便于后面插件
// const path = parent.window.require("path")
// const appDataFolder = getCrossPlatformAppDataFolder(path)
// // const picgo_cfg_070 = `${parent.window.siyuan.config.system.dataDir}/storage/syp/picgo/picgo.cfg.json`
// const picgo_cfg_067 = `${parent.window.siyuan.config.system.dataDir}/widgets/sy-post-publisher/lib/picgo/picgo.cfg.json`
// const picgo_cfg_070 = path.join(appDataFolder, "sy-picgo", "picgo.cfg.json")
// const fs = parent.window.require("fs")
// if (fs.existsSync(picgo_cfg_067) && !fs.existsSync(picgo_cfg_070)) {
// console.warn("检测到旧的PicGO配置文件,启动迁移")
// fs.copySync(picgo_cfg_067, picgo_cfg_070)
// }
// picgoExtension.initPicgo(picgo_cfg_070)
//
// // 初始化发布辅助功能
// const publishHelperLibPath = `${parent.window.siyuan.config.system.dataDir}/widgets/sy-post-publisher/lib/siyuan/publish-helper.js`
// console.log("iframe挂件将要从以下位置引入发布辅助功能", publishHelperLibPath)
// const initPublishHelper = parent.window.require(publishHelperLibPath)
// initPublishHelper()
//
}

// 新窗口打开
const initSiyuanNewWin = () => {
// 挂载JsonLocalStorage到window
const jsonLocalstorageLibPath = `${window.terwer.dataDir}/widgets/sy-post-publisher/lib/json-localstorage/json-localstorage.js`
console.log(
"思源笔记新窗口将要从以下位置引入json-localstorage",
jsonLocalstorageLibPath
)
const LocalStorage = window.require(jsonLocalstorageLibPath)
// 设置json配置目录
LocalStorage.init("../../../../storage/syp/")

// 挂载PicGO到window
const syPicgoLibPath = `${window.terwer.dataDir}/widgets/sy-post-publisher/lib/picgo/picgo.js`
console.log("思源笔记新窗口将要从以下位置引入sy-picgo", syPicgoLibPath)
const picgoExtension = window.require(syPicgoLibPath).default
picgoExtension.initPicgo(
`${window.terwer.dataDir}/storage/syp/picgo/picgo.cfg.json`
)
initMethods.initLocalStorageMethod("思源笔记新窗口")

// // 挂载PicGO到window
// const syPicgoLibPath = `${window.terwer.dataDir}/widgets/sy-post-publisher/lib/picgo/picgo.js`
// console.log("思源笔记新窗口将要从以下位置引入sy-picgo", syPicgoLibPath)
// const picgoExtension = window.require(syPicgoLibPath).default
// // PicGO存储到配置目录,便于后面插件
// const path = window.require("path")
// const appDataFolder = getCrossPlatformAppDataFolder(path)
// // const picgo_cfg_070 = `${window.terwer.dataDir}/storage/syp/picgo/picgo.cfg.json`
// const picgo_cfg_067 = `${window.terwer.dataDir}/widgets/sy-post-publisher/lib/picgo/picgo.cfg.json`
// const picgo_cfg_070 = path.join(appDataFolder, "sy-picgo", "picgo.cfg.json")
// const fs = window.require("fs")
// if (fs.existsSync(picgo_cfg_067)) {
// fs.copySync(picgo_cfg_067, picgo_cfg_070)
// }
// picgoExtension.initPicgo(picgo_cfg_070)
}

// js片段
const initJsCode = () => {
// 初始化插槽
const slotLibPath = `${window.siyuan.config.system.dataDir}/widgets/sy-post-publisher/lib/siyuan/silot.js`
console.log("自定义js片段将要从以下位置引入插槽", slotLibPath)
const initSlot = window.require(slotLibPath)
initSlot()

// 挂载JsonLocalStorage到window
const jsonLocalstorageLibPath = `${window.siyuan.config.system.dataDir}/widgets/sy-post-publisher/lib/json-localstorage/json-localstorage.js`
console.log(
"自定义js片段将要从以下位置引入json-localstorage",
jsonLocalstorageLibPath
)
const LocalStorage = window.require(jsonLocalstorageLibPath)
// 设置json配置目录
LocalStorage.init("../../../../storage/syp/")

// 挂载PicGO到window
const syPicgoLibPath = `${window.siyuan.config.system.dataDir}/widgets/sy-post-publisher/lib/picgo/picgo.js`
console.log("自定义js片段将要从以下位置引入sy-picgo", syPicgoLibPath)
const picgoExtension = window.require(syPicgoLibPath).default
picgoExtension.initPicgo(
`${window.siyuan.config.system.dataDir}/storage/syp/picgo/picgo.cfg.json`
)
initMethods.initLocalStorageMethod("自定义js片段")

// 初始化发布辅助功能
const publishHelperLibPath = `${window.siyuan.config.system.dataDir}/widgets/sy-post-publisher/lib/siyuan/publish-helper.js`
console.log(
"自定义js片段将要从以下位置引入发布辅助功能",
publishHelperLibPath
)
const initPublishHelper = window.require(publishHelperLibPath)
initPublishHelper()
// 初始化插槽
initMethods.initSlotMethod("iframe挂件")

// // 挂载PicGO到window
// const syPicgoLibPath = `${window.siyuan.config.system.dataDir}/widgets/sy-post-publisher/lib/picgo/picgo.js`
// console.log("自定义js片段将要从以下位置引入sy-picgo", syPicgoLibPath)
// const picgoExtension = window.require(syPicgoLibPath).default
// // PicGO存储到配置目录,便于后面插件
// const path = window.require("path")
// const appDataFolder = getCrossPlatformAppDataFolder(path)
// // const picgo_cfg_070 = `${window.siyuan.config.system.dataDir}/storage/syp/picgo/picgo.cfg.json`
// const picgo_cfg_067 = `${window.siyuan.config.system.dataDir}/widgets/sy-post-publisher/lib/picgo/picgo.cfg.json`
// const picgo_cfg_070 = path.join(appDataFolder, "sy-picgo", "picgo.cfg.json")
// const fs = window.require("fs")
// if (fs.existsSync(picgo_cfg_067)) {
// fs.copySync(picgo_cfg_067, picgo_cfg_070)
// }
// picgoExtension.initPicgo(picgo_cfg_070)
//
// // 初始化发布辅助功能
// const publishHelperLibPath = `${window.siyuan.config.system.dataDir}/widgets/sy-post-publisher/lib/siyuan/publish-helper.js`
// console.log(
// "自定义js片段将要从以下位置引入发布辅助功能",
// publishHelperLibPath
// )
// const initPublishHelper = window.require(publishHelperLibPath)
// initPublishHelper()
}

// init
Expand Down

0 comments on commit 10d9704

Please sign in to comment.