LetTTGACO / elog

Markdown 批量导出工具、开放式跨平台博客解决方案,随意组合写作平台(语雀/Notion/FlowUs/飞书/我来Wolai)和博客平台(Hexo/Vitepress/Halo/Confluence/WordPress等)
https://elog.1874.cool
MIT License
1.44k stars 77 forks source link

语雀平台发布到halo时,文章中的图片网址不会更换 #94

Closed misnet closed 1 month ago

misnet commented 2 months ago

你当前使用的Elog版本

0.14.2

Elog配置文件

module.exports = {
  write: {
    platform: 'yuque',
    yuque: {
      token: process.env.YUQUE_TOKEN,
      login: process.env.YUQUE_LOGIN,
      repo: process.env.YUQUE_REPO,
      onlyPublic: false,
      onlyPublished: true,
    },
    'yuque-pwd': {
      username: process.env.YUQUE_USERNAME,
      password: process.env.YUQUE_PASSWORD,
      login: process.env.YUQUE_LOGIN,
      repo: process.env.YUQUE_REPO,
      onlyPublic: false,
      onlyPublished: true,
    }
  },
  deploy: {
    platform: 'halo',
    local: {
      outputDir: './docs',
      filename: 'title',
      format: 'markdown',
    },
    halo: {
      endpoint: process.env.HALO_ENDPOINT,
      token: process.env.HALO_TOKEN,
      policyName: process.env.HALO_POLICY_NAME,
      rowType: 'html',
      needUploadImage: false,
      frontMatter:{
          enable:true,
          exclude:[],
          include:['cover','title','urlname','date','updated','tags','description']
      }
    }
  },
  image: {
    enable: true,
    platform: 'oss',
    local: {
      outputDir: './docs/images',
      prefixKey: '/images',
      pathFollowDoc: false,
    },
    oss: {
      secretId: process.env.OSS_SECRET_ID,
      secretKey: process.env.OSS_SECRET_KEY,
      bucket: process.env.OSS_BUCKET,
      region: process.env.OSS_REGION,
      host: process.env.OSS_HOST,
      prefixKey: 'halo/',
    }
  }
}

发生了什么?

1、写作平台是语雀 2、图床用的是阿里云,有开启 运行 elog sync -e .elog.env后没报错,图片也能上传到oss上,但发布到halo平台的文章内容中的图片地址、封面图地址都还是语雀的图片地址,并没有更改为图床的地址

Elog错误日志

无报错信息

附加信息

No response

LetTTGACO commented 2 months ago

但发布到halo平台的文章内容中的图片地址、封面图地址都还是语雀的图片地址,并没有更改为图床的地址

我尝试复现,可是并没有出现这个问题,我的 elog.config.js 配置信息如下

module.exports = {
  write: {
    platform: 'flowus',
    flowus: {
      tablePageId: process.env.FLOWUS_TEMPLATE_TABLE_PAGE_ID,
    }
  },
  deploy: {
    platform: 'halo',
    halo: {
      endpoint: process.env.HALO_ENDPOINT,
      token: process.env.HALO_TOKEN,
      policyName: process.env.HALO_POLICY_NAME,
      rowType: 'markdown',
      needUploadImage: false
    }
  },
  image: {
    enable: true,
    platform: 'cos',
    cos: {
      secretId: process.env.COS_SECRET_ID,
      secretKey: process.env.COS_SECRET_KEY,
      bucket: process.env.COS_IMAGE_BUCKET,
      region: process.env.COS_IMAGE_REGION,
      host: process.env.COS_HOST,
      prefixKey: 'halo-images',
      secretExt: '', // 可选
    }
  },
}

我的同步日志

image

可以看到图片被成功替换,且部署到了 Halo,可以从这篇文档看到 网站中的图片被成功替换了

方便贴一下 脱敏后 的同步时的日志吗?

LetTTGACO commented 2 months ago

值得注意的是:目前版本语雀的封面图地址并不会被自动替换,可以通过拓展点的方式来替换。可以参考这个仓库format-image.js文件配置来进行手动替换

misnet commented 1 month ago

rowType:'html'时,日志有显示上传成功,图片替换成功

image

但到halo平台上,图片在编辑器和预览显示的都是https://cdn.nlark.com/yuque开头的网址。

当我将rowType设为markdown时,我先elog clean,然后halo上的文章和oss的图全部删除,然后再elog sync下。日志和rowType=html时差不多,日志多了以下这个:

front-matter解析失败,将返回预定义属性can` not read a block mapping entry; a multiline key may not be an implicit key at line 2,column 1: 预定义属性:https://elog.1874.cool/notion/raqyleng501h23p1#预定义属性

但不影响deploy到halo上,但在halo编辑器编辑时图片地址是对的是oss的地址,但前台查看文章的地址却还是语雀的地址,我必须在halo后台重新点一下发布,前台预览文章的图片网址才会变成是oss的地址。

关于封面图我用了你说的拓展点方法,相关代码:

const { matterMarkdownAdapter } = require('@elog/cli')

/**

module.exports = { format, };

用了这个代码后,同步就会报错:

image
LetTTGACO commented 1 month ago

好的谢谢,我晚上会复现一下。

LetTTGACO commented 1 month ago

找到问题了,图片未被替换确实是个 BUG。

错误原因

Elog 在整个部署流程中分为 3 个部分。

  1. 拉取语雀的文档,会保存一份 markdown 数据
  2. 图片处理,处理 markdown 数据,将其中的图片替换为图床图片
  3. 文档部署,根据用户的选择,将 markdown 直接输出/ 或将其转成 html 格式的文档

理想情况下,在流程 2 中,图片的处理只会针对 markdown进行处理,如果在流程 3 中需要格式化为其他格式,例如 html,则只需要将 markdown 转为 Html 即可。

而 Halo 就可能需要根据用户的选择,将其转成 markdown/html,由rowType配置控制。

正常情况下,设置rowType: html 是没什么问题的,elog 只需要将处理图片后的 markdown 转成 html 就行。但问题就出在了语雀平台上:语雀比较特殊,他的 API 接口也会同时返回一份 HTML 的数据

而elog 的 markdown 转 Html 程序会去判断如果已经有 html 数据,则直接返回已存在的 html 数据即可

所以这就导致本来被处理后的 markdown 未被使用,反而使用了语雀直接返回的 html 数据,而这份数据的图片未被处理。

这就导致了上传到 Halo 平台的文档始终是语雀直接返回的那份 html 数据。

解决办法

解决办法有两个:

  1. 最简单的处理。将 elog.config.js中的rowType: 'html', 改为rowType: 'markdown'即可,这样就能保证 上传到 halo 的是已经处理过图片的文档。当然你的 Halo 需要安装 markdown 编辑器才能查看和编辑,可以在插件市场找到相关的编辑器插件。 详情原因可以看 Halo 官方对于这个字段的解释。

不过 Elog 还是希望文档的维护交由写作平台(语雀)来维护,而不是在 Halo 编辑器中继续修改,这可能导致文档被下一次的 elog 同步所覆盖。

  1. 等待 Elog 修复,此 bug 将会在未来几天内进行修复。

非常感谢您提供的 bug 线索!

LetTTGACO commented 1 month ago

关于封面图的拓展点处理报错。代码需要进行一点修改,错误原因是因为部分文档在语雀中是没有封面图的,这就导致 cover 属性并不存在导致程序报错。将其修改为以下代码即可,后续会优化此类型报错

const { markdownAdapter } = require('@elog/cli') // 使用markdownAdapter 即可, Halo 平台文章正文并不需要 front matter 头

/**

自定义文档插件
@param {DocDetail} doc doc的类型定义为 DocDetail
@param {ImageClient} imageClient 图床下载器,可用于图片上传
@return {Promise} 返回处理后的文档对象
*/
const format = async (doc, imageClient) => {
    const cover = doc.properties.cover
    // 将 cover 字段中的 notion 图片下载到本地
    if (imageClient && cover) { // 判断封面图存在再处理图片
        // 只有启用图床平台image.enable=true时,imageClient才能用,否则请自行实现图片上传
        const url = await imageClient.uploadImageFromUrl(cover, doc)
        // cover链接替换为本地图片
        doc.properties.cover = url
    }
    doc.body = markdownAdapter(doc);
    return doc;
};
module.exports = {
    format,
};
LetTTGACO commented 1 month ago

我这边测试了下发现,Halo 可能是有缓存。直接将 elog.config.js中的rowType: 'html', 改为rowType: 'markdown', 删除 elog.cache.json,重新运行 elog 同步命令,线上的 halo 站点依旧是语雀的图床。

解决办法有两个:

  1. 在 halo 管理后台统一删除所有由 elog 同步来的文档后,删除 elog.cache.json,重新运行 elog 同步命令即可
  2. 在 halo 管理后台 找到未被替换图片的文章,进入编辑页,可以发现图片已经是被替换成 oss 的链接,此时重新点击右上角发布,Halo 站点就会更新。
LetTTGACO commented 1 month ago

front-matter解析失败,将返回预定义属性can` not read a block mapping entry; a multiline key may not be an implicit key at line 2,column 1: 预定义属性:https://elog.1874.cool/notion/raqyleng501h23p1#预定义属性

这个错误是由于 语雀文档头部的 front matter 格式错误,如果你想自定义该文档的 Front Matter,则需要在语雀正文头部正确书写 YAML 格式的 Front Matter,这是一个基本的例子,更多关于 Front Matter 的说明

---
title: "Example Title"
date: "2023-10-01"
tags:
  - tag1
  - tag2
---
misnet commented 1 month ago

依据您的建议,问题解决,多谢!