Skip to content

Commit

Permalink
fix: 修复YAML修改不生效的问题
Browse files Browse the repository at this point in the history
  • Loading branch information
terwer committed Aug 30, 2023
1 parent 629c468 commit ac21891
Show file tree
Hide file tree
Showing 3 changed files with 97 additions and 45 deletions.
98 changes: 78 additions & 20 deletions src/adaptors/base/baseExtendApi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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"

/**
* 各种模式共享的扩展基类
Expand Down Expand Up @@ -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<Post> {
private async handlePictures(doc: Post, id: string, publishCfg?: any): Promise<Post> {
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
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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
}

Expand Down
4 changes: 3 additions & 1 deletion src/components/publish/SinglePublishDoPublish.vue
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down Expand Up @@ -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("保存到系统平台结束")
Expand Down
40 changes: 16 additions & 24 deletions src/composables/usePublish.ts
Original file line number Diff line number Diff line change
Expand Up @@ -110,48 +110,40 @@ 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

// 初始化API
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) })
// ===================================
// 文章处理结束
// 文章预处理结束
// ===================================

// 处理发布:新增 或者 更新
if (singleFormData.isAdd) {
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)

Expand All @@ -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)
Expand All @@ -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("文章属性处理完成")

Expand Down

0 comments on commit ac21891

Please sign in to comment.