From ac21891c7b04f66a433dfd8e1788811026663c92 Mon Sep 17 00:00:00 2001 From: terwer Date: Wed, 30 Aug 2023 18:54:55 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8DYAML=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E4=B8=8D=E7=94=9F=E6=95=88=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/adaptors/base/baseExtendApi.ts | 98 +++++++++++++++---- .../publish/SinglePublishDoPublish.vue | 4 +- src/composables/usePublish.ts | 40 +++----- 3 files changed, 97 insertions(+), 45 deletions(-) diff --git a/src/adaptors/base/baseExtendApi.ts b/src/adaptors/base/baseExtendApi.ts index e81dbab8..3545cf1e 100644 --- a/src/adaptors/base/baseExtendApi.ts +++ b/src/adaptors/base/baseExtendApi.ts @@ -27,7 +27,7 @@ import { IBlogApi } from "zhi-blog-api/dist/lib/IBlogApi" import { IWebApi } from "zhi-blog-api/dist/lib/IWebApi" import { BaseBlogApi } from "~/src/adaptors/api/base/baseBlogApi.ts" import { BaseWebApi } from "~/src/adaptors/web/base/baseWebApi.ts" -import { BlogConfig, MediaObject, Post, WebApi, YamlConvertAdaptor, YamlFormatObj } from "zhi-blog-api" +import { BlogConfig, MediaObject, PageTypeEnum, Post, WebApi, YamlConvertAdaptor, YamlFormatObj } from "zhi-blog-api" import { createAppLogger, ILogger } from "~/src/utils/appLogger.ts" import { LuteUtil } from "~/src/utils/luteUtil.ts" import { usePicgoBridge } from "~/src/composables/usePicgoBridge.ts" @@ -40,6 +40,7 @@ import { SiyuanKernelApi } from "zhi-siyuan-api" import { DynamicConfig } from "~/src/platforms/dynamicConfig.ts" import { MUST_USE_OWN_PLATFORM, MUST_USE_PICBED_PLATFORM } from "~/src/utils/constants.ts" import { toRaw } from "vue" +import _ from "lodash" /** * 各种模式共享的扩展基类 @@ -84,51 +85,105 @@ class BaseExtendApi extends WebApi implements IBlogApi, IWebApi { post = await this.handlePictures(post, id, publishCfg) // 处理YAML post = await this.handleYaml(post, id, publishCfg) + // 处理其他 + post = await this.handleOther(post, id, publishCfg) return post } // ================ // private methods // ================ - private async handleYaml(post: Post, id?: string, publishCfg?: any) { + /** + * 处理其他属性 + * + * @param doc - 要处理YAML的 Post 对象 + * @param id - 思源笔记文档 ID + * @param publishCfg - (可选)发布配置参数 + * @returns 一个 Promise,解析为处理后的 Post 对象 + */ + private async handleOther(doc: Post, id?: string, publishCfg?: any) { const cfg: BlogConfig = publishCfg?.cfg + const post = _.cloneDeep(doc) as Post + + // 同步摘要 + post.mt_excerpt = post.shortDesc + post.mt_text_more = post.shortDesc + + // 发布格式 + if (cfg?.pageType == PageTypeEnum.Markdown) { + post.description = post.markdown + } else { + post.description = post.html + } + return post + } + + /** + * 处理YAML + * + * @param doc - 要处理YAML的 Post 对象 + * @param id - 思源笔记文档 ID + * @param publishCfg - (可选)发布配置参数 + * @returns 一个 Promise,解析为处理后的 Post 对象 + */ + private async handleYaml(doc: Post, id?: string, publishCfg?: any) { + const cfg: BlogConfig = publishCfg?.cfg + const post = _.cloneDeep(doc) as Post + + this.logger.debug("开始处理yaml,post", { post: toRaw(post) }) + + // 前台已经处理好,这里无需再处理 + // const yamlAdaptor: YamlConvertAdaptor = this.api.getYamlAdaptor() + // if (null !== yamlAdaptor) { + // // 先生成对应平台的yaml + // const yamlObj: YamlFormatObj = yamlAdaptor.convertToYaml(post, cfg) + // // 同步发布内容 + // post.yaml = yamlObj.formatter + // post.markdown = yamlObj.mdFullContent + // post.html = yamlObj.htmlContent + // this.logger.info("handled yaml using YamlConverterAdaptor") + // } else { + // // 同步发布内容 + // const yamlObj = post.toYamlObj() + // const yaml = YamlUtil.obj2Yaml(yamlObj) + // const md = YamlUtil.extractMarkdown(post.markdown) + // post.yaml = yaml + // post.markdown = md + // post.html = LuteUtil.mdToHtml(md) + // this.logger.info("yaml adaptor not found, using default") + // } + const yamlAdaptor: YamlConvertAdaptor = this.api.getYamlAdaptor() if (null !== yamlAdaptor) { - // 先生成对应平台的yaml - const yamlObj: YamlFormatObj = yamlAdaptor.convertToYaml(post, cfg) - // 同步发布内容 - post.yaml = yamlObj.formatter - post.markdown = yamlObj.mdFullContent - post.html = yamlObj.htmlContent - this.logger.info("handled yaml using YamlConverterAdaptor") - } else { - // 同步发布内容 - const yamlObj = post.toYamlObj() - const yaml = YamlUtil.obj2Yaml(yamlObj) const md = YamlUtil.extractMarkdown(post.markdown) - post.yaml = yaml - post.markdown = md + const yaml = post.yaml + post.markdown = YamlUtil.addYamlToMd(yaml, md) post.html = LuteUtil.mdToHtml(md) - this.logger.info("yaml adaptor not found, using default") + this.logger.info("检测到该平台已开启YAML适配器,已附加YAML到Markdown正文") + } else { + this.logger.info("未找到YAML适配器,不作处理") } - this.logger.debug("handledYaml yaml finished =>", { post: toRaw(post) }) + this.logger.debug("yaml处理之后,post", { post: toRaw(post) }) return post } /** * 处理图片 * - * @param post - 要处理图片的 Post 对象 + * @param doc - 要处理图片的 Post 对象 * @param id - 思源笔记文档 ID * @param publishCfg - (可选)发布配置参数 * @returns 一个 Promise,解析为处理后的 Post 对象 */ - private async handlePictures(post: Post, id: string, publishCfg?: any): Promise { + private async handlePictures(doc: Post, id: string, publishCfg?: any): Promise { const cfg: BlogConfig = publishCfg?.cfg const dynCfg: DynamicConfig = publishCfg?.dynCfg const middlewareUrl = cfg?.middlewareUrl + const post = _.cloneDeep(doc) as Post + this.logger.debug("图片处理之前, post =>", { post: toRaw(post) }) + // 判断key包含 custom_Zhihu 或者 /custom_Zhihu-\w+/ const mustUseOwnPlatform: string[] = MUST_USE_OWN_PLATFORM const mustUsePicbedPlatform: string[] = MUST_USE_PICBED_PLATFORM @@ -162,7 +217,7 @@ class BaseExtendApi extends WebApi implements IBlogApi, IWebApi { // ========================== // 图片替换 this.logger.info("使用 PicGO上传图片") - this.logger.debug("开始图片处理, post =>", { post }) + this.logger.debug("开始图片处理, post =>", { post: toRaw(post) }) post.markdown = await this.picgoBridge.handlePicgo(id, post.markdown) this.logger.debug("图片处理完毕, post.markdown =>", { md: post.markdown }) } else { @@ -226,6 +281,9 @@ class BaseExtendApi extends WebApi implements IBlogApi, IWebApi { // 利用 lute 把 md 转换成 html post.html = LuteUtil.mdToHtml(post.markdown) + + this.logger.info("图片预处理全部完成") + this.logger.debug("图片处理之后,post", { post: toRaw(post) }) return post } diff --git a/src/components/publish/SinglePublishDoPublish.vue b/src/components/publish/SinglePublishDoPublish.vue index 79f9fa16..828a7935 100644 --- a/src/components/publish/SinglePublishDoPublish.vue +++ b/src/components/publish/SinglePublishDoPublish.vue @@ -49,6 +49,7 @@ import PublishKnowledgeSpace from "~/src/components/publish/form/PublishKnowledg import { SiyuanAttr } from "zhi-siyuan-api" import PublishTitle from "~/src/components/publish/form/PublishTitle.vue" import { useChatGPT } from "~/src/composables/useChatGPT.ts" +import _ from "lodash"; const logger = createAppLogger("single-publish-do-publish") @@ -113,7 +114,8 @@ const handlePublish = async () => { logger.info("保存到系统平台开始") for (const sysKey of sysKeys) { const sysPublishCfg = await getPublishCfg(sysKey) - await doSinglePublish(sysKey, id, sysPublishCfg, formData.mergedPost) + const siyuanPost = _.cloneDeep(formData.mergedPost) as Post + await doSinglePublish(sysKey, id, sysPublishCfg, siyuanPost) } logger.info("保存到系统平台结束") diff --git a/src/composables/usePublish.ts b/src/composables/usePublish.ts index 6277e94c..1fea3500 100644 --- a/src/composables/usePublish.ts +++ b/src/composables/usePublish.ts @@ -110,7 +110,9 @@ const usePublish = () => { } singleFormData.isAdd = StrUtil.isEmptyString(postid) - let post = doc + // 确保每次发布都是新的副本 + const post = _.cloneDeep(doc) as Post + logger.debug("准备开始发布处理, doc =>", { post: toRaw(doc) }) // 保证postid一致 post.postid = postid @@ -118,25 +120,15 @@ const usePublish = () => { const api = await getPublishApi(key, cfg) // =================================== - // 文章处理开始 + // 文章预处理开始 // =================================== - // 平台相关的正文预处理 - 仅在发布的时候调用 - logger.debug(`before preEditPost, isAdd ${singleFormData.isAdd}, post=>`, toRaw(post)) - post = await api.preEditPost(post, id, publishCfg) - logger.debug(`after preEditPost, post=>`, toRaw(post)) - - // 同步摘要 - post.mt_excerpt = post.shortDesc - post.mt_text_more = post.shortDesc - // 发布格式 - if (cfg?.pageType == PageTypeEnum.Markdown) { - post.description = post.markdown - } else { - post.description = post.html - } - logger.debug(`文章全部预处理完毕,最终结果 =>id=${id},key=${key},`, { post: toRaw(post) }) + logger.info(`开始文章预处理, isAdd =>${singleFormData.isAdd}`) + logger.debug(`post=>`, toRaw(post)) + const finalPost = await api.preEditPost(post, id, publishCfg) + logger.info(`文章全部预处理完毕,id=${id},key=${key}`) + logger.debug(`最终结果 =>`, { finalPost: toRaw(finalPost) }) // =================================== - // 文章处理结束 + // 文章预处理结束 // =================================== // 处理发布:新增 或者 更新 @@ -144,14 +136,14 @@ const usePublish = () => { logger.info("文章未发布,准备发布") // result 正常情况下就是 postid - const result = await api.newPost(post) + const result = await api.newPost(finalPost) // 写入属性到配置 postid = result const posidKey = cfg.posidKey const postMeta = ObjectUtil.getProperty(setting, id, {}) postMeta[posidKey] = postid - postMeta[SiyuanAttr.Custom_slug] = post.wp_slug + postMeta[SiyuanAttr.Custom_slug] = finalPost.wp_slug setting[id] = postMeta await updateSetting(setting) @@ -161,19 +153,19 @@ const usePublish = () => { logger.info("文章已发布,准备更新") // result 正常情况下是 true - const result = await api.editPost(postid, post) + const result = await api.editPost(postid, finalPost) // 写入属性到配置 // 这里更新 slug 的原因是历史文章有可能没有生成过别名 const postMeta = ObjectUtil.getProperty(setting, id, {}) if (!postMeta.hasOwnProperty(SiyuanAttr.Custom_slug)) { logger.info("检测到未生成过别名,准备更新别名") - postMeta[SiyuanAttr.Custom_slug] = post.wp_slug + postMeta[SiyuanAttr.Custom_slug] = finalPost.wp_slug setting[id] = postMeta await updateSetting(setting) } else { // 确保别名不被修改 - post.wp_slug = postMeta[SiyuanAttr.Custom_slug] + finalPost.wp_slug = postMeta[SiyuanAttr.Custom_slug] } logger.info("edit post=>", result) @@ -186,7 +178,7 @@ const usePublish = () => { logger.info("内置平台,忽略保存属性") } else { const yamlKey = getDynYamlKey(key) - await kernelApi.setSingleBlockAttr(id, yamlKey, post.yaml) + await kernelApi.setSingleBlockAttr(id, yamlKey, finalPost.yaml) } logger.info("文章属性处理完成")