halo-dev / halo

强大易用的开源建站工具。
https://www.halo.run
GNU General Public License v3.0
33.24k stars 9.59k forks source link

通过 API 创建文档。编辑器的格式有点问题 #4936

Closed LetTTGACO closed 9 months ago

LetTTGACO commented 9 months ago

系统信息

使用的哪种方式运行?

Docker

在线站点地址

No response

发生了什么?

通过 API 创建的文档/apis/api.console.halo.run/v1alpha1/posts/{name}/content,

{
    "snapshotName": "feb8d0bb-4669-4806-8b8d-864fbf8bd678",
    "raw": "Markdown",
    "content":"<h1>Markdown</h1>\n",
    "rawType": "markdown"
}

"rawType"设置为"markdown"貌似不起作用,在访问后台编辑器文档时,并没有格式化为 markdown,实际上好像还是以 HTML 格式渲染的,所以显示的比较乱 如果我将content和raw都保持为一致的 html 格式,编辑器中才会显示的比较正常。 我不明白将"rawType"设置为"markdown"的作用是什么。 根据社区的插件示例,他也是设置为 markdown,但是我实际测试这个字段并没什么用 image

相关日志输出

No response

附加信息

No response

LetTTGACO commented 9 months ago

社区插件:obsidian-halo
vscode-extension-halo 都是设置为 markdown,但我这么设置没什么用

ruibaby commented 9 months ago

Halo 的默认编辑器是富文本编辑器,rawType 为 html,rawType 的意义在于让 Halo 知道文章应该用什么源格式的编辑器进行编辑。

Halo 本身没有自带 Markdown 编辑器,需要用户自行安装,所有的编辑器插件可以在 https://www.halo.run/store/apps?type=PLUGIN 中找到。

此外,在 rawType 设置为 markdown 且系统中并没有 markdown 类型的编辑器时,进入文章编辑应该会给出提示:

image

所以你这边还能正常打开编辑页面似乎不太正常,如果我遗漏了什么,请指正。

LetTTGACO commented 9 months ago

我这边没任何警告提示,且能正常编辑文档,我也没安装 markdown 编辑器。

ruibaby commented 9 months ago

我这边没任何警告提示,且能正常编辑文档,我也没安装 markdown 编辑器。

我这边没能复现成功,使用了 VSCode 插件发布文章,然后系统也没有 Markdown 编辑器,这个时候并不会使用默认编辑器。

我建议先安装一个 Markdown 编辑器,看看能否正常选择到这个编辑器。

LetTTGACO commented 9 months ago

image 我这边稳定复现,而且我怎么才能上传为 markdown 时,默认用 markdown 编辑器打开,进入文章之后,切换不了编辑器了,按钮是灰色的

ruibaby commented 9 months ago

可以提供一下 post 的数据。

LetTTGACO commented 9 months ago
{"contentType":"json","dataType":"json","headers":{"Authorization":"Bearer pat_eyJraWQiOiJoXDAWDAWDAdDwbGF0ZS1tYW5hZ2UtYXR0YWNobWVudHMiLCJyb2xlLXRlbXBsYXRlLXZpZXctYXR0YWNobWVudHMiLCJyb2xlLXRlbXBsYXRlLW1hbmFnZS1jb25maWdtYXBzIiwicm9sZS10ZW1wbGF0ZS12aWV3LWNvbmZpZ21hcHMiLCJyb2xlLXRlbXBsYXRlLW1hbmFnZS1tZW51cyIsInJvbGUtdGVtcGxhdGUtdmlldy1tZW51cyIsInJvbGUtdGVtcGxhdGUtbWFuYWdlLXBvc3RzIiwicm9sZS10ZW1wbGF0ZS12aWV3LXBvc3RzIiwicm9sZS10ZW1wbGF0ZS1tYW5hZ2Utc25hcHNob3RzIiwicm9sZS10ZW1wbGF0ZS1tYW5hZ2UtdGFncyIsInJvbGUtdGVtcGxhdGUtbWFuYWdlLWNhdGVnb3JpZXMiXSwicGF0X25hbWUiOiJwYXQtMTg3NC1ycXZwRCIsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA5MC8iLCJpYXQiOjE3MDExNTcyNjUsImp0aSI6ImU5ZjI1YWVhLTY1OGYtYTU1My0xNWIzLTc5MTk0NjQzYWY0YSJ9.eeEevblXiAI8T04Lu53RPnNNDEQctHGbMtxbViumLKLLZmgnc_hsHJdialpT_gpD_H4AfaAgzmT7-1CVlW-canrBl9HxnFpOBe0pdagpNwov2Eb7gs5OWush1XDSc53kAAqwlA5mH_TK4AnMKa768WEJ-Jw1TFgZD__43AA_MdbTOe0eo501r5h8W9_uDSU93gCoetVFXC0ylagNJ9-09noGkhAgudgaEJX18_xOBX18rUv0K9rUjf0idFgMcPFCqTG7Tf17EX2FR1OgADUSrZsmiuOE-ILLb-VD5GbT2hJFfZKHZ2-sIiyfdOZOcJz5xjxT3mHyPp0a4BiEje5o8dYvpI61wnmrqye4KphOMZazGoP0D3jKCV97YGbfI5PL02iwWNM6A-4hAVziqeFUIIaKhdDp-N3r4DPMzOHnhZpJ-xEBzwehAJJTkIYHmkttjCegcwYyFqlFPoN22xqNcuVy6HBjQBBHTc4teRgaEWHBcbioRuGJnl3q3GWz0aBLRaXp3FUxgnNiEkIF39N7740aYt4q6MecmxOUtqOlRGxI2Od2dz3-F-IJQBKUrEslTeItuKciG_OMEla3DSd1xCyf0xTsmYYTcai3YfNAaVPGEcBYIA0p1jXAKnYVBfXVl_0EswIPQTpk5hLhbCoXH4pftNqzwCOCHQ0d8k5-Ixc"},"gzip":true,"timeout":60000,"method":"POST","data":{"post":{"spec":{"title":"Notion示例文章","slug":"f0cf6faf-83c7-4ca1-8b3f-6a232eef4a3b","template":"","cover":"https://www.notion.so/images/page-cover/met_camille_pissarro_1896.jpg","deleted":false,"publish":true,"pinned":false,"allowComment":true,"visible":"PUBLIC","priority":0,"excerpt":{"autoGenerate":true,"raw":""},"categories":["category-mnzhy"],"tags":["tag-jMAkt"],"htmlMetas":[]},"apiVersion":"content.halo.run/v1alpha1","kind":"Post","metadata":{"name":"f0cf6faf-83c7-4ca1-8b3f-6a232eef4a3b","annotations":{"content.halo.run/preferred-editor":"default"}}},"content":{"raw":"\n# Notion-Markdown\n\n\n[Notion示例文章源地址](https://1874.notion.site/Notion-0658ee89cadf4d0e9b6adfbb1d953c70)\n\n\n## 行内样式\n\n\n- **加粗**\n\n\n_斜体_\n\n\n<u>下划线</u>\n\n\n删除线\n\n\n行内代码 `const a = 123`\n\n\n行内公式,在Vitepress会报错,不做演示\n\n\n红色的文字\n\n\n蓝色的文字背景\n\n\n绿色的块背景\n\n\n## Basic block(基本块)\n\n\n## Notion示例文章的子页面\n\nNotion示例文章的子页面\n\n\n| 表格标题 | 备注              |\n| ---- | --------------- |\n| 测试1  | 啊大大             |\n| 测试2  | `const a = 123` |\n\n- 无序列表\n1. 有序列表:事物按规律变化,也有一种不可避免的性质.这种性质就叫做**必然性**\n\t1. 事物的必然性,是事物本身的性质(我们反对宿命论的是其认为这一切是受神明的支配,而不是反对事物发展中存在的不可避免的性质的事实)\n\t\t1. 第三级别列表\n\t\t2. 第三级别列表\n\t2. 其决定于它自己本身发展的情况和周围的条件\n\t\t1. 第三级别列表\n\t\t\t1. 第三级别列表\n<details>\n<summary>折叠块:点击展开【一级】</summary>\n<details>\n<summary>点击展开【二级】</summary>\n<details>\n<summary>点击展开【三级】</summary>\n\n内容文本\n\n\n</details>\n\n\n</details>\n\n\n</details>\n\n\n> 引用块\n\n\n---\n\n\n[link_to_page](f478ef37-c82a-41f1-b7a5-9c195b043831)\n\n\n> 👏 标注文本:**Elog 0.4.0-beta.7 发布了!**  \n> 开放式跨平台博客解决方案,随意组合写作平台和部署平台  \n>   \n> 帮助导航👇  \n> ❓ [Elog能干什么](https://elog.1874.cool/notion/introduce)  \n> 🚀 [快速开始](https://elog.1874.cool/notion/start)\n\n\n## Media(媒体)\n\n\n![cover.JPG](https://image.1874.cool/moon/cover.JPG)\n\n\n[bookmark](https://elog.1874.cool)\n\n\n[46_1677164223.mp4](https://prod-files-secure.s3.us-west-2.amazonaws.com/13a508a2-de5b-47bc-b05f-367d31c13e36/5999649b-7796-46a0-abd4-2e17b7b607ab/46_1677164223.mp4?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20231129%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20231129T044401Z&X-Amz-Expires=3600&X-Amz-Signature=5d8893fb139e61248dcfaf435eaac7535e9295ef74c949c43f6aa0fcbe7afb47&X-Amz-SignedHeaders=host&x-id=GetObject)\n\n\n```python\npwd='123456'\nprint(f\"password={pwd!r}\")\n\n## output:\n#password='123456'\n```\n\n\n[example.txt](https://prod-files-secure.s3.us-west-2.amazonaws.com/13a508a2-de5b-47bc-b05f-367d31c13e36/753c8245-2aea-45de-8a5a-509c105f6236/example.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20231129%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20231129T044401Z&X-Amz-Expires=3600&X-Amz-Signature=9e671ce5e6d037c1575a3b865d1b659400ed2f9f10fd05034b9a537c7e0d91f1&X-Amz-SignedHeaders=host&x-id=GetObject)\n\n\n## DataBase(数据库)\n\n\n数据库\n\n\n## AI block\n\n\nAPI不支持,会报错`Block type ai_block is not supported via the API.`\n\n\n## Advanced block(高级块)\n\n\n$$\nf\\left(\\left[\\frac{1+\\{x, y\\}}{\\left(\\frac{x}{y}+\\frac{y}{x}\\right)(u+1)}+a\\right]^{3 / 2}\\right)\\tag{行标}\n$$\n\n\nNotion示例文章的同步块\n\n\n# 折叠一级标题\n\n\n\t## 折叠二级标题\n\n\n\t\t折叠内容\n\n\n两列分栏(左)\n\n- [ ] 左侧书写\n\n两列分栏(右)\n\n- [ ] 右侧书写\n\n```mermaid\ngraph LR;\nMermaid思维导图-->思维导图\nMermaid思维导图-->研发\n```\n\n\n@Anonymous \n\n\n[Notion-Markdown](https://www.notion.so/f478ef37c82a41f1b7a59c195b043831) \n\n\n2023-04-26 \n\n\n🚀🔥🐸\n\n\n## Embeds(嵌入)\n\n\n嵌入网页\n\n\n[embed](https://elog.1874.cool)\n\n","content":"<h1>Notion-Markdown</h1>\n<p><a href=\"https://1874.notion.site/Notion-0658ee89cadf4d0e9b6adfbb1d953c70\">Notion示例文章源地址</a></p>\n<h2>行内样式</h2>\n<ul>\n<li><strong>加粗</strong></li>\n</ul>\n<p><em>斜体</em></p>\n<p><u>下划线</u></p>\n<p>删除线</p>\n<p>行内代码 <code>const a = 123</code></p>\n<p>行内公式,在Vitepress会报错,不做演示</p>\n<p>红色的文字</p>\n<p>蓝色的文字背景</p>\n<p>绿色的块背景</p>\n<h2>Basic block(基本块)</h2>\n<h2>Notion示例文章的子页面</h2>\n<p>Notion示例文章的子页面</p>\n<table>\n<thead>\n<tr>\n<th>表格标题</th>\n<th>备注</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>测试1</td>\n<td>啊大大</td>\n</tr>\n<tr>\n<td>测试2</td>\n<td><code>const a = 123</code></td>\n</tr>\n</tbody></table>\n<ul>\n<li>无序列表</li>\n</ul>\n<ol>\n<li>有序列表:事物按规律变化,也有一种不可避免的性质.这种性质就叫做<strong>必然性</strong><ol>\n<li>事物的必然性,是事物本身的性质(我们反对宿命论的是其认为这一切是受神明的支配,而不是反对事物发展中存在的不可避免的性质的事实)<ol>\n<li>第三级别列表</li>\n<li>第三级别列表</li>\n</ol>\n</li>\n<li>其决定于它自己本身发展的情况和周围的条件<ol>\n<li>第三级别列表<ol>\n<li>第三级别列表</li>\n</ol>\n</li>\n</ol>\n</li>\n</ol>\n</li>\n</ol>\n<details>\n<summary>折叠块:点击展开【一级】</summary>\n<details>\n<summary>点击展开【二级】</summary>\n<details>\n<summary>点击展开【三级】</summary>\n\n<p>内容文本</p>\n</details>\n\n\n</details>\n\n\n</details>\n\n\n<blockquote>\n<p>引用块</p>\n</blockquote>\n<hr>\n<p><a href=\"f478ef37-c82a-41f1-b7a5-9c195b043831\">link_to_page</a></p>\n<blockquote>\n<p>👏 标注文本:<strong>Elog 0.4.0-beta.7 发布了!</strong><br>开放式跨平台博客解决方案,随意组合写作平台和部署平台  </p>\n<p>帮助导航👇<br>❓ <a href=\"https://elog.1874.cool/notion/introduce\">Elog能干什么</a><br>🚀 <a href=\"https://elog.1874.cool/notion/start\">快速开始</a></p>\n</blockquote>\n<h2>Media(媒体)</h2>\n<p><img src=\"https://image.1874.cool/moon/cover.JPG\" alt=\"cover.JPG\"></p>\n<p><a href=\"https://elog.1874.cool\">bookmark</a></p>\n<p><a href=\"https://prod-files-secure.s3.us-west-2.amazonaws.com/13a508a2-de5b-47bc-b05f-367d31c13e36/5999649b-7796-46a0-abd4-2e17b7b607ab/46_1677164223.mp4?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20231129%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20231129T044401Z&X-Amz-Expires=3600&X-Amz-Signature=5d8893fb139e61248dcfaf435eaac7535e9295ef74c949c43f6aa0fcbe7afb47&X-Amz-SignedHeaders=host&x-id=GetObject\">46_1677164223.mp4</a></p>\n<pre><code class=\"hljs language-python\">pwd=<span class=\"hljs-string\">&#x27;123456&#x27;</span>\n<span class=\"hljs-built_in\">print</span>(<span class=\"hljs-string\">f&quot;password=<span class=\"hljs-subst\">{pwd!r}</span>&quot;</span>)\n\n<span class=\"hljs-comment\">## output:</span>\n<span class=\"hljs-comment\">#password=&#x27;123456&#x27;</span>\n</code></pre><p><a href=\"https://prod-files-secure.s3.us-west-2.amazonaws.com/13a508a2-de5b-47bc-b05f-367d31c13e36/753c8245-2aea-45de-8a5a-509c105f6236/example.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20231129%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20231129T044401Z&X-Amz-Expires=3600&X-Amz-Signature=9e671ce5e6d037c1575a3b865d1b659400ed2f9f10fd05034b9a537c7e0d91f1&X-Amz-SignedHeaders=host&x-id=GetObject\">example.txt</a></p>\n<h2>DataBase(数据库)</h2>\n<p>数据库</p>\n<h2>AI block</h2>\n<p>API不支持,会报错<code>Block type ai_block is not supported via the API.</code></p>\n<h2>Advanced block(高级块)</h2>\n<p>$$<br>f\\left(\\left[\\frac{1+{x, y}}{\\left(\\frac{x}{y}+\\frac{y}{x}\\right)(u+1)}+a\\right]^{3 / 2}\\right)\\tag{行标}<br>$$</p>\n<p>Notion示例文章的同步块</p>\n<h1>折叠一级标题</h1>\n<pre><code>## 折叠二级标题\n\n\n    折叠内容\n</code></pre><p>两列分栏(左)</p>\n<ul>\n<li><input disabled=\"\" type=\"checkbox\"> 左侧书写</li>\n</ul>\n<p>两列分栏(右)</p>\n<ul>\n<li><input disabled=\"\" type=\"checkbox\"> 右侧书写</li>\n</ul>\n<pre><code class=\"hljs language-mermaid\">graph LR;\nMermaid思维导图--&gt;思维导图\nMermaid思维导图--&gt;研发\n</code></pre><p>@Anonymous </p>\n<p><a href=\"https://www.notion.so/f478ef37c82a41f1b7a59c195b043831\">Notion-Markdown</a> </p>\n<p>2023-04-26 </p>\n<p>🚀🔥🐸</p>\n<h2>Embeds(嵌入)</h2>\n<p>嵌入网页</p>\n<p><a href=\"https://elog.1874.cool\">embed</a></p>\n","rawType":"markdown"}}}
LetTTGACO commented 9 months ago

我可能知道了,应该是这里指定的编辑器? image

ruibaby commented 9 months ago

对,这里的 annotations 是具体的编辑器,因为不同格式也可能有不同的编辑器,所以在用户选择之后会设置一个这样的 annotations,他的优先级最高。如果是通过外部调用 API 创建文章,这个值可以不设置。

LetTTGACO commented 9 months ago

感谢,可以了,这里能正常显示了,也无法切换到默认编辑器 image

ruibaby commented 9 months ago

不同源格式不能随意切换,目前不支持格式转换。

LetTTGACO commented 9 months ago

嗯嗯,这个是没问题的。

LetTTGACO commented 9 months ago

还有个小问题:我在上传完图片附件后,因为我需要将文档中原有的图片路径全部替换掉,所以我需要在上传完就拿到这张图片在 Halo 附件中的路径,看了下只能从metadata.annotations['storage.halo.run/uri']中获取,想问下这个字段storage.halo.run/uri可信吗?会在什么情况下不存在这个路径? image

在获取附件列表接口中,是存在status.permalink字段来获取路径的,而在上传完返回的信息中没有,这两个字段哪个更可信 image

因为我是想在上传完返回的附件信息中就拿到当前图片的 URL,而不用再查一次列表。

或者说有什么接口可以拿到/upload这个前缀,因为我图片名称是固定的,我也可以自己拼接

ruibaby commented 9 months ago

还有个小问题:我在上传完图片附件后,因为我需要将文档中原有的图片路径全部替换掉,所以我需要在上传完就拿到这张图片在 Halo 附件中的路径,看了下只能从metadata.annotations['storage.halo.run/uri']中获取,想问下这个字段storage.halo.run/uri可信吗?会在什么情况下不存在这个路径?

status.permalink 为准,但因为这个字段是异步算出来的,所以直接调用查询方法可能是拿不到 permalink 的,需要轮询。

此外,不需要使用附件列表的接口,上传接口的返回体应该有 metadata.name,根据这个获取特定的附件即可。

轮询的逻辑可参考:

LetTTGACO commented 9 months ago

感谢,已解决此问题

musnows commented 7 months ago

请问API创建文章能指定文章的上传时间(文章发布时间)吗?我看vscode的插件里面有一个publishTime: undefined,,我使用Python将时间转为"%Y-%m-%d %H:%M:%S"格式的字符串传入publishTime字段进行请求,会变成bad requests,删除该字段则可以正常请求。

请问这个字段有效吗?用API上传文章时应该如何指定文章发布时间?

guqing commented 7 months ago

请问API创建文章能指定文章的上传时间(文章发布时间)吗?我看vscode的插件里面有一个publishTime: undefined,,我使用Python将时间转为"%Y-%m-%d %H:%M:%S"格式的字符串传入publishTime字段进行请求,会变成bad requests,删除该字段则可以正常请求。

请问这个字段有效吗?用API上传文章时应该如何指定文章发布时间?

日期格式不对 参考 "creationTimestamp": "2023-11-28T08:09:39.4255583122"

musnows commented 7 months ago

请问API创建文章能指定文章的上传时间(文章发布时间)吗?我看vscode的插件里面有一个publishTime: undefined,,我使用Python将时间转为"%Y-%m-%d %H:%M:%S"格式的字符串传入publishTime字段进行请求,会变成bad requests,删除该字段则可以正常请求。 请问这个字段有效吗?用API上传文章时应该如何指定文章发布时间?

日期格式不对 参考 "creationTimestamp": "2023-11-28T08:09:39.4255583122"

感谢大佬提醒。

我参考了posts接口里面传回的文章信息值里面的字段 "publishTime": "2024-01-22T05:12:33.716773059Z",应该使用的是这个格式,九位小数加一个字母Z,现在设置成功了。

image

python格式化代码如下,frontmatter_dict['date']是一个datetime.datetime类型。

microseconds_str = f"{frontmatter_dict['date'].microsecond:0<9}" # 9位,不够的后补0
publish_time = f"{frontmatter_dict['date'].strftime('%Y-%m-%dT%H:%M:%S')}.{microseconds_str}Z"