
Csdn Article Publish
- 63 installs
- 33 repo stars
- Updated July 5, 2026
- wuchubuzai2018/expert-skills-hub
Helps with ai & agent building tasks.
About
csdn-article-publish is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted development.
- csdn-article-publish
- AI & Agent Building
- AI-coding skill
Csdn Article Publish by the numbers
- 63 all-time installs (skills.sh)
- +2 installs in the week ending Jul 27, 2026 (Skillselion tracking)
- Ranked #6,190 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Jul 27, 2026 (Skillselion catalog sync)
npx skills add https://github.com/wuchubuzai2018/expert-skills-hub --skill csdn-article-publishAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 63 |
|---|---|
| repo stars | ★ 33 |
| Last updated | July 5, 2026 |
| Repository | wuchubuzai2018/expert-skills-hub ↗ |
What it does
Helps with ai & agent building tasks.
Files
CSDN Blog Article Publish Skills
技能概述
- 支持读取指定目录下的 Markdown 文件内容,并将其保存为 CSDN 草稿
- 生成 Markdown 文章并保存到本地文件
- 保存 Markdown 文章为 CSDN 草稿
- 支持本地前置校验,在请求发送前检查配置缺项、标题、标签数量、摘要长度、发布必填项等问题
- 自动维护本地文章映射文件
csdn_article_map.json,记录file -> articleId -> url - 根据文章 ID 或已保存过的 Markdown 文件更新文章
- 发布文章(需额外字段)
⚠️ 重要注意事项
- 防限流:CSDN 有接口限流机制,请勿频繁调用 API
- 建议操作:
- 单次保存/更新操作间隔至少 5-10 秒
- 每天保存/更新文章数量建议不超过5篇
- 批量操作时适当增加间隔时间
- 优先使用草稿状态,确认无误后再发布
使用流程
步骤 1:配置请求头
判断当前目录下是否存在 csdn_config.json 文件,若文件不存在请复制 config/config_example.json到工作目录下,并重命名为 csdn_config.json,文件需要根据示例文档让用户进行更改,填写请求头信息: config_example.json
获取请求头方法
1. 登录 CSDN 并打开 https://editor.csdn.net/md/ Markdown风格的文章编辑器 2. 填写标题和内容,点击保存为草稿 3. 打开浏览器开发者工具(F12) 4. 切换到 Network(网络)标签 5. 找到 saveArticle 请求,右键 → Copy → Copy as cURL 6. 从 curl 命令中提取以下请求头:
Cookie: 用户登录Cookiex-ca-nonce: 请求唯一标识(UUID)x-ca-signature: 签名x-ca-signature-headers: 签名头列表x-ca-key: API Key
配置文件格式
{
"headers": {
"Cookie": "用户Cookie",
"x-ca-nonce": "UUID",
"x-ca-signature": "签名",
"x-ca-signature-headers": "x-ca-key,x-ca-nonce",
"x-ca-key": "API Key"
},
"defaults": {
"readType": "public",
"type": "original",
"pubStatus": "draft",
"creation_statement": 0,
"tags": "",
"categories": ""
}
}详细字段说明见 config_example.json
脚本会在发送请求前先做本地校验:
- 检查必需请求头是否缺失或仍是示例值
- 检查 Cookie 是否明显不完整
- 检查
x-ca-signature-headers是否包含x-ca-key,x-ca-nonce - 检查默认配置中的
readType、type、pubStatus、creation_statement是否合法
步骤 2:生成 Markdown 文章
1. 根据用户需求生成文章内容(Markdown格式) 2. 保存到当前工作目录的 csdnarticle/ 文件夹中 3. 文件命名建议:{文章标题}.md
# 确保 csdnarticle 目录存在
mkdir -p csdnarticle步骤 3:保存草稿
将本地 Markdown 文件保存为 CSDN 草稿:
# 方式1:通过 --file 参数指定 Markdown 文件(推荐)
node {skills目录}/scripts/csdn_article.js save \
--title "Python 异步编程实战" \
--file csdnarticle/Python异步编程实战.md
# 方式2:通过 --content 参数直接传递内容
node {skills目录}/scripts/csdn_article.js save \
--title "Python 异步编程实战" \
--content "# Python 异步编程实战\n\n## 简介\n\n本文介绍Python异步编程..."
# 方式3:仅使用 --file 参数,自动提取文件名作为标题
node {skills目录}/scripts/csdn_article.js save \
--file csdnarticle/Python异步编程实战.md参数说明:
--title: 文章标题(使用 --file 时可选,未提供则使用文件名)--content: Markdown 内容(与 --file 二选一)--file: Markdown 文件路径(与 --content 二选一,推荐使用)--config: 配置文件路径(默认: csdn_config.json)
当使用 --file 保存成功后,脚本会在当前工作目录生成 csdn_article_map.json,记录该 Markdown 文件对应的文章 ID 和 URL。原有的 --id 参数仍然保留,后续 update / publish 既可以继续显式传 --id,也可以复用该映射。
步骤 4:检查草稿
引导用户在 CSDN 编辑器中检查文章排版、格式、内容是否正确,确认无误后,进入下一步。
步骤 5:发布文章(如需发布)
使用 publish 命令,通过 --extra 参数传递发布配置:
node {skills目录}/scripts/csdn_article.js publish \
--id 159048943 \
--title "Python 异步编程实战" \
--file csdnarticle/Python异步编程实战.md \
--extra '{"tags":"python,async","readType":"public","type":"original","creation_statement":1,"description":"Python 异步编程实战发布摘要"}'--extra 参数说明:
| 字段 | 说明 | 可选值 |
|---|---|---|
| tags | 标签(逗号分隔,最多5个) | python,async |
| readType | 可见范围 | public(默认值), private, read_need_fans, read_need_vip |
| type | 文章类型 | original(默认值), repost, translated |
| creation_statement | 创作声明 | 0=无声明(默认值), 1=部分内容由AI辅助生成, 2=内容来源网络进行整合创作, 3=个人观点,仅供参考 |
| description | 文章摘要(最大256字) | - |
详细 API 参数见 api_reference.md
本地前置校验
脚本会在发送请求前拦截以下常见问题,并给出修复建议:
- 配置缺项:缺少
Cookie、x-ca-nonce、x-ca-signature、x-ca-signature-headers、x-ca-key - 配置占位符未替换:仍保留
your_cookie_here、xxxxxx等示例值 - 标题为空:未提供
--title且文件名无法生成标题 - 标签过多:
tags超过 5 个 - 摘要过长:
description超过 256 字 - 发布缺字段:
publish模式下未提供摘要,或发布枚举值不合法 - 更新/发布找不到文章:既未传
--id,也没有可复用的本地映射
本地文章映射文件
- 文件名:
csdn_article_map.json - 生成时机:使用
save/update/publish且传入--file并成功请求后 - 用途:记录 Markdown 文件与文章 ID、文章 URL 的对应关系
- 效果:后续执行
update/publish时,如果继续使用同一个--file,可以继续显式传--id,也可以省略--id改为自动复用映射
示例:
# 首次保存,生成本地映射
node {skills目录}/scripts/csdn_article.js save \
--file csdnarticle/Python异步编程实战.md
# 之后基于同一个文件更新,既可以继续传 --id,也可以直接复用映射
node {skills目录}/scripts/csdn_article.js update \
--id 159048943 \
--file csdnarticle/Python异步编程实战.md
# 或者省略 --id,自动从本地映射读取
node {skills目录}/scripts/csdn_article.js update \
--file csdnarticle/Python异步编程实战.md
# 发布时同样既支持显式传 --id,也支持直接复用映射
node {skills目录}/scripts/csdn_article.js publish \
--id 159048943 \
--file csdnarticle/Python异步编程实战.md \
--extra '{"tags":"python,async","description":"Python 异步编程的实战经验总结","creation_statement":1}'
# 或者省略 --id,自动从本地映射读取
node {skills目录}/scripts/csdn_article.js publish \
--file csdnarticle/Python异步编程实战.md \
--extra '{"tags":"python,async","description":"Python 异步编程的实战经验总结","creation_statement":1}'目录结构
csdn-article-publish/
├── SKILL.md # 技能说明文档
├── scripts/
│ └── csdn_article.js # Node.js 脚本(核心执行脚本)
├── config/
│ ├── config_example.json # 用户配置文件示例
│ └── user_agents.json # 随机User-Agent列表
└── references/
├── api_reference.md # CSDN API 详细文档
└── troubleshooting.md # 常见问题排查指南运行时还会在当前工作目录生成 csdn_article_map.json,该文件不在仓库中维护。
场景样例
样例 1:生成并保存草稿
"帮我写一篇关于 Python 异步编程的文章,标题是《Python 异步编程实战》,保存到 CSDN 草稿箱"
执行流程: 1. 生成文章内容(Markdown格式) 2. 保存到 csdnarticle/Python异步编程实战.md 3. 调用 save 命令:
# 方式1:使用 --file 参数(推荐)
node scripts/csdn_article.js save \
--title "Python 异步编程实战" \
--file csdnarticle/Python异步编程实战.md
# 方式2:使用 --content 参数(内容较短时)
node scripts/csdn_article.js save \
--title "Python 异步编程实战" \
--content "# Python 异步编程实战\n\n## 简介\n\n本文介绍..."4. 返回文章 ID 供用户后续操作
样例 2:更新草稿
"更新我之前那篇 CSDN 草稿(ID: 159048943),把标题改成《Python 异步编程进阶》"
执行流程: 1. 根据新需求更新 Markdown 内容 2. 保存到 csdnarticle/Python异步编程进阶.md 3. 调用 update 命令:
# 方式1:使用 --file 参数(推荐,若已有本地映射可省略 --id)
node scripts/csdn_article.js update \
--id 159048943 \
--title "Python 异步编程进阶" \
--file csdnarticle/Python异步编程进阶.md
# 方式2:使用 --content 参数
node scripts/csdn_article.js update \
--id 159048943 \
--title "Python 异步编程进阶" \
--content "# Python 异步编程进阶\n\n## 新增内容..."样例 3:发布文章
"帮我把 ID 159048943 的文章发布到 CSDN,标签是 python,async"
执行流程: 1. 引导用户确认 creation_statement、readType、type 等字段 2. 调用 publish 命令:
# 方式1:使用 --file 参数(推荐,若已有本地映射可省略 --id)
node scripts/csdn_article.js publish \
--id 159048943 \
--title "Python 异步编程实战" \
--file csdnarticle/Python异步编程实战.md \
--extra '{"tags":"python,async","creation_statement":1,"readType":"public","type":"original","description":"Python 异步编程的发布版摘要"}'
# 方式2:使用 --content 参数
node scripts/csdn_article.js publish \
--id 159048943 \
--title "Python 异步编程实战" \
--content "# Python 异步编程实战\n\n..." \
--extra '{"tags":"python,async","creation_statement":1,"description":"Python 异步编程的发布版摘要"}'故障排查
常见的请求头过期、签名失效、限流、发布失败等问题,可参考 troubleshooting.md
{
"headers": {
"Cookie": "your_cookie_here",
"x-ca-nonce": "xxxxxx",
"x-ca-signature": "xxxxxxxx",
"x-ca-signature-headers": "x-ca-key,x-ca-nonce",
"x-ca-key": "xxxxxxxx"
},
"defaults": {
"readType": "public",
"type": "original",
"pubStatus": "draft",
"creation_statement": 0,
"tags": "",
"categories": "",
"description": ""
}
}
[
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:120.0) Gecko/20100101 Firefox/120.0",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Safari/605.1.15",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Safari/605.1.15",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36",
"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:121.0) Gecko/20100101 Firefox/121.0",
"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:120.0) Gecko/20100101 Firefox/120.0",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:119.0) Gecko/20100101 Firefox/119.0",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:121.0) Gecko/20100101 Firefox/121.0",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:120.0) Gecko/20100101 Firefox/120.0",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:118.0) Gecko/20100101 Firefox/118.0",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36",
"Mozilla/5.0 (X11; Linux x86_64; rv:121.0) Gecko/20100101 Firefox/121.0",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Safari/605.1.15"
]
CSDN Blog API Reference
API Endpoint
- URL:
https://bizapi.csdn.net/blog-console-api/v3/mdeditor/saveArticle - Method: POST
- Content-Type: application/json
Request Headers
备注:可以使用浏览器开发者工具中,先尝试保存一次草稿状态的文章的操作后,从请求头中进行获取
| Header | Required | Description |
|---|---|---|
| Cookie | Yes | 用户登录Cookie |
| x-ca-nonce | Yes | UUID字符串 |
| x-ca-signature | Yes | Base64签名 |
| x-ca-signature-headers | Yes | 签名头列表,如 "x-ca-key,x-ca-nonce" |
| x-ca-key | Yes | API Key |
Request Body Fields
| Field | Required | Default | Description |
|---|---|---|---|
| id | Update Only | - | 文章ID,更新时必需 |
| title | Yes | - | 文章标题 |
| content | Yes | - | HTML 格式正文内容 |
| markdowncontent | Yes | - | Markdown格式文章内容 |
| pubStatus | No | draft | 发布状态: draft/publish |
| readType | No | public | 可见范围 |
| type | No | original | 文章类型 |
| tags | No | - | 标签,逗号分隔,最多5个 |
| categories | No | - | 分类 |
| Description | No | - | 摘要,最大256字,发布时需要填写 |
| creation_statement | No | 0 | 创作声明 0=无声明(默认值), 1=部分内容由AI辅助生成, 2=内容来源网络进行整合创作, 3=个人观点,仅供参考 |
| status | No | 2 | 状态 2-草稿 0-发布 |
| cover_type | No | 1 | 封面类型 |
| authorized_status | No | false | 授权状态 |
| source | No | pc_mdeditor | 来源 |
Field Values
pubStatus
draft- 草稿状态publish- 发布状态
readType
public- 全部可见private- 仅我可见read_need_fans- 粉丝可见read_need_vip- VIP可见
type
original- 原创repost- 转载translated- 翻译
creation_statement
0- 无声明1- 部分内容由AI辅助生成2- 内容来源于网络,进行整合再创作3- 个人看法,仅供参考
Response
{
"code": 200,
"traceId": "xxx",
"data": {
"url": "https://blog.csdn.net/xxx/article/details/xxx",
"id": 123456,
"qrcode": "xxx",
"title": "文章标题",
"description": ""
},
"msg": "success"
}CSDN Article Publish Troubleshooting
1. 配置校验直接失败
如果脚本在发送请求前直接退出,通常是本地前置校验拦住了常见错误:
headers.Cookie缺失或仍是示例值:重新登录 CSDN 后,从saveArticle请求复制最新 Cookiex-ca-nonce/x-ca-signature/x-ca-key缺失:说明请求头没有完整复制x-ca-signature-headers不包含x-ca-key,x-ca-nonce:签名链不完整,请重新抓包tags超过 5 个:删减为最多 5 个标签description超过 256 字:压缩摘要内容publish模式缺少description:补充摘要后再发布
2. 哪些请求头最容易过期
以下字段最容易失效或变化:
Cookie:登录态过期后会失效x-ca-nonce:通常与当前请求相关,重新抓一次最稳妥x-ca-signature:签名字段,经常随请求变化
相对更稳定但仍建议一起更新的字段:
x-ca-signature-headersx-ca-key
最稳妥的做法不是只替换单个字段,而是重新打开编辑器并重新抓取一整组 saveArticle 请求头。
3. 如何刷新签名相关字段
建议按以下流程刷新:
1. 登录 CSDN,并打开 Markdown 编辑器页面 2. 随便填写一个标题和一段正文 3. 点击一次“保存草稿” 4. 打开浏览器开发者工具,进入 Network 5. 找到 saveArticle 请求 6. 从请求头中完整复制以下字段到 csdn_config.json
Cookiex-ca-noncex-ca-signaturex-ca-signature-headersx-ca-key
不要只更新其中一个字段,否则经常会出现签名不匹配的问题。
4. 保存草稿失败时先看什么
优先排查顺序:
1. 本地前置校验是否已经报错 2. Cookie 是否还是当前登录会话 3. x-ca-nonce 和 x-ca-signature 是否是最新抓取的值 4. 是否短时间内频繁保存导致限流 5. Markdown 文件是否为空、标题是否为空
如果接口返回了 traceId,建议保留它,方便后续定位具体请求。
5. 发布失败时先看什么
相比草稿保存,发布更容易因为字段不完整失败。重点检查:
1. description 是否已提供,且长度不超过 256 字 2. readType、type、creation_statement 是否是支持的值 3. tags 是否超过 5 个 4. 当前文章 ID 是否正确,或本地 csdn_article_map.json 是否映射到了正确文章
如果你是基于 --file 自动复用文章 ID,先检查 csdn_article_map.json 里该文件对应的 id 和 url 是否正确。
6. 限流怎么处理
CSDN 接口会出现限流。建议:
- 单次保存或更新之间至少间隔 5 到 10 秒
- 不要在短时间内批量连续发布多篇文章
- 一旦提示限流,先等待一段时间再继续
7. 本地文章映射失效怎么办
csdn_article_map.json 用来保存 Markdown 文件与文章 ID 的对应关系。如果映射错了:
- 直接删除错误条目后重新执行一次
save - 或者在
update/publish时显式传入--id覆盖映射
如果你移动了 Markdown 文件路径,映射键也会变化。最简单的修复方式是用新路径重新执行一次 save 或带 --id 的 update。
#!/usr/bin/env node
/**
* CSDN Blog Article Management Script
* Usage:
* node csdn_article.js save --title "标题" --content "内容"
* node csdn_article.js save --title "标题" --file path/to/article.md
* node csdn_article.js update --id 123456 --title "标题" --content "内容"
* node csdn_article.js publish --id 123456 --title "标题" --content "内容" --extra '{"tags":"python,async","creation_statement":1}'
*/
const fs = require('fs');
const path = require('path');
const https = require('https');
const { markdownToHtml } = require('./markdown_to_html');
const DEFAULT_CONFIG_FILE = 'csdn_config.json';
const DEFAULT_ARTICLE_MAP_FILE = 'csdn_article_map.json';
const USER_AGENTS_FILE = path.join(__dirname, '../config/user_agents.json');
const API_URL = 'https://bizapi.csdn.net/blog-console-api/v3/mdeditor/saveArticle';
const MAX_RETRIES = 3;
const RETRY_DELAY = 3000;
const MAX_TAG_COUNT = 5;
const MAX_DESCRIPTION_LENGTH = 256;
const REQUIRED_HEADERS = ['Cookie', 'x-ca-nonce', 'x-ca-signature', 'x-ca-signature-headers', 'x-ca-key'];
const VALID_READ_TYPES = new Set(['public', 'private', 'read_need_fans', 'read_need_vip']);
const VALID_ARTICLE_TYPES = new Set(['original', 'repost', 'translated']);
const VALID_CREATION_STATEMENTS = new Set([0, 1, 2, 3]);
const VALID_PUB_STATUS = new Set(['draft', 'publish']);
const TROUBLESHOOTING_DOC = 'skills/csdn-article-generator-publish/references/troubleshooting.md';
const log = {
info: (msg) => console.log(`\x1b[36m[INFO]\x1b[0m ${msg}`),
success: (msg) => console.log(`\x1b[32m[SUCCESS]\x1b[0m ${msg}`),
error: (msg) => console.error(`\x1b[31m[ERROR]\x1b[0m ${msg}`),
warn: (msg) => console.warn(`\x1b[33m[WARN]\x1b[0m ${msg}`),
step: (msg) => console.log(`\x1b[90m → ${msg}\x1b[0m`)
};
function parseArgs() {
const args = process.argv.slice(2);
const result = { command: null, options: {} };
for (let i = 0; i < args.length; i++) {
if (args[i].startsWith('--')) {
const key = args[i].replace('--', '');
const value = args[i + 1];
if (value && !value.startsWith('--')) {
if (key === 'id') {
result.options.id = parseInt(value, 10);
} else if (key === 'config') {
result.options.config = value;
} else {
result.options[key] = value;
}
i++;
} else {
result.options[key] = true;
}
} else if (!result.command) {
result.command = args[i];
}
}
return result;
}
function loadConfig(configPath) {
const resolvedPath = path.resolve(configPath);
if (!fs.existsSync(resolvedPath)) {
log.error(`Config file '${resolvedPath}' not found`);
process.exit(1);
}
return JSON.parse(fs.readFileSync(resolvedPath, 'utf-8'));
}
function parseExtra(extraValue) {
if (!extraValue) {
return {};
}
try {
return JSON.parse(extraValue);
} catch (error) {
log.error('Invalid JSON in --extra parameter');
log.step("Fix suggestion: ensure --extra uses valid JSON, for example --extra '{\"tags\":\"python,async\"}'");
process.exit(1);
}
}
function getArticleMapPath() {
return path.resolve(process.cwd(), DEFAULT_ARTICLE_MAP_FILE);
}
function loadArticleMap() {
const articleMapPath = getArticleMapPath();
if (!fs.existsSync(articleMapPath)) {
return {
path: articleMapPath,
data: {
version: 1,
articles: {}
}
};
}
try {
const data = JSON.parse(fs.readFileSync(articleMapPath, 'utf-8'));
return {
path: articleMapPath,
data: {
version: data.version || 1,
articles: data.articles || {}
}
};
} catch (error) {
log.error(`Failed to parse article map '${articleMapPath}'`);
log.step('Fix suggestion: repair or remove the local map file, then run save again to recreate it');
process.exit(1);
}
}
function saveArticleMap(articleMap) {
fs.writeFileSync(articleMap.path, `${JSON.stringify(articleMap.data, null, 2)}\n`, 'utf-8');
}
function normalizeFileKey(filePath) {
const absolutePath = path.resolve(filePath);
const relativePath = path.relative(process.cwd(), absolutePath);
if (relativePath && !relativePath.startsWith('..') && !path.isAbsolute(relativePath)) {
return relativePath.split(path.sep).join('/');
}
return absolutePath;
}
function updateArticleMap(articleMap, filePath, articleData, command) {
if (!filePath || !articleData || !articleData.id) {
return;
}
const key = normalizeFileKey(filePath);
const existing = articleMap.data.articles[key] || {};
articleMap.data.articles[key] = {
...existing,
id: String(articleData.id),
url: articleData.url || existing.url || '',
title: articleData.title || existing.title || '',
lastCommand: command,
updatedAt: new Date().toISOString()
};
}
function findArticleIdByFile(articleMap, filePath) {
if (!filePath) {
return null;
}
const key = normalizeFileKey(filePath);
return articleMap.data.articles[key] || null;
}
function isPlaceholderValue(value) {
if (typeof value !== 'string') {
return false;
}
const trimmed = value.trim();
const normalized = trimmed.toLowerCase();
const placeholderValues = new Set([
'your_cookie_here',
'your cookie',
'用户cookie',
'uuid',
'签名',
'api key',
'xxxxxxxx',
'xxxxxx'
]);
return placeholderValues.has(normalized) || /^x{6,}$/i.test(trimmed) || /^your[_ -]/i.test(trimmed);
}
function printValidationErrors(title, errors) {
log.error(title);
errors.forEach((error, index) => {
log.step(`${index + 1}. ${error}`);
});
process.exit(1);
}
function validateConfig(config, configFile) {
const errors = [];
const headers = config.headers || {};
const defaults = config.defaults || {};
REQUIRED_HEADERS.forEach((headerName) => {
const value = headers[headerName];
if (typeof value !== 'string' || !value.trim()) {
errors.push(`配置文件 ${configFile} 缺少 headers.${headerName},请从 saveArticle 请求头补齐该字段`);
return;
}
if (isPlaceholderValue(value)) {
errors.push(`配置文件 ${configFile} 中 headers.${headerName} 仍是示例值,请替换为你自己的真实请求头`);
}
});
if (typeof headers.Cookie === 'string' && headers.Cookie.trim() && headers.Cookie.trim().length < 20) {
errors.push('headers.Cookie 长度异常偏短,通常表示 Cookie 未完整复制,建议重新从浏览器复制 saveArticle 请求头');
}
if (typeof headers['x-ca-signature-headers'] === 'string') {
const signatureHeaders = headers['x-ca-signature-headers'];
if (!signatureHeaders.includes('x-ca-key') || !signatureHeaders.includes('x-ca-nonce')) {
errors.push('headers.x-ca-signature-headers 必须包含 x-ca-key,x-ca-nonce,否则签名校验大概率失败');
}
}
if (defaults.readType && !VALID_READ_TYPES.has(defaults.readType)) {
errors.push(`defaults.readType='${defaults.readType}' 不合法,可选值:public/private/read_need_fans/read_need_vip`);
}
if (defaults.type && !VALID_ARTICLE_TYPES.has(defaults.type)) {
errors.push(`defaults.type='${defaults.type}' 不合法,可选值:original/repost/translated`);
}
if (defaults.pubStatus && !VALID_PUB_STATUS.has(defaults.pubStatus)) {
errors.push(`defaults.pubStatus='${defaults.pubStatus}' 不合法,可选值:draft/publish`);
}
if (defaults.creation_statement !== undefined && !VALID_CREATION_STATEMENTS.has(Number(defaults.creation_statement))) {
errors.push(`defaults.creation_statement='${defaults.creation_statement}' 不合法,可选值:0/1/2/3`);
}
return errors;
}
function resolveContentAndTitle(args) {
let content = args.content;
let title = args.title ? String(args.title).trim() : '';
let resolvedFilePath = null;
if (args.file) {
resolvedFilePath = path.resolve(args.file);
log.step(`Reading file: ${resolvedFilePath}`);
if (!fs.existsSync(resolvedFilePath)) {
printValidationErrors('Input validation failed', [`Markdown file '${resolvedFilePath}' not found,请检查 --file 路径是否正确`]);
}
content = fs.readFileSync(resolvedFilePath, 'utf-8');
log.step(`File loaded, size: ${content.length} characters`);
if (!title) {
title = path.basename(resolvedFilePath, path.extname(resolvedFilePath));
log.step(`Using filename as title: ${title}`);
}
}
return {
content,
title,
resolvedFilePath
};
}
function splitTags(tagsValue) {
if (!tagsValue) {
return [];
}
return String(tagsValue)
.split(',')
.map((tag) => tag.trim())
.filter(Boolean);
}
function validateResolvedInput(command, payload, resolvedFilePath) {
const errors = [];
const tags = splitTags(payload.tags);
const description = typeof payload.Description === 'string' ? payload.Description.trim() : '';
if (!payload.markdowncontent || !String(payload.markdowncontent).trim()) {
errors.push('文章内容为空,请提供 --content 或使用 --file 指向一个非空 Markdown 文件');
}
if (!payload.title || !String(payload.title).trim()) {
errors.push('文章标题为空,请提供 --title,或者使用有文件名的 --file');
}
if ((command === 'update' || command === 'publish') && !payload.id) {
if (resolvedFilePath) {
errors.push('未找到文章 ID。请先用 save 保存该文件建立映射,或在本次命令中显式传入 --id');
} else {
errors.push('update/publish 需要文章 ID,请传入 --id,或改用 --file 并确保该文件已经保存过草稿');
}
}
if (tags.length > MAX_TAG_COUNT) {
errors.push(`tags 超过 ${MAX_TAG_COUNT} 个,当前 ${tags.length} 个,请删减后重试`);
}
if (description.length > MAX_DESCRIPTION_LENGTH) {
errors.push(`description 超过 ${MAX_DESCRIPTION_LENGTH} 字,当前 ${description.length} 字,请压缩摘要后重试`);
}
if (!VALID_READ_TYPES.has(payload.readType)) {
errors.push(`readType='${payload.readType}' 不合法,可选值:public/private/read_need_fans/read_need_vip`);
}
if (!VALID_ARTICLE_TYPES.has(payload.type)) {
errors.push(`type='${payload.type}' 不合法,可选值:original/repost/translated`);
}
if (!VALID_CREATION_STATEMENTS.has(Number(payload.creation_statement))) {
errors.push(`creation_statement='${payload.creation_statement}' 不合法,可选值:0/1/2/3`);
}
if (!VALID_PUB_STATUS.has(payload.pubStatus)) {
errors.push(`pubStatus='${payload.pubStatus}' 不合法,可选值:draft/publish`);
}
if (command === 'publish') {
if (!description) {
errors.push('publish 模式要求提供 description 摘要。请在 --extra 中传入 description,或在配置 defaults.description 中设置默认值');
}
}
return errors;
}
function buildFailureHints(result) {
const message = typeof result === 'string' ? result : `${result.msg || ''} ${result.code || ''}`;
const normalized = message.toLowerCase();
const hints = [];
if (normalized.includes('signature') || normalized.includes('签名')) {
hints.push('签名相关字段通常会随请求变化,请重新从浏览器里复制最新的 saveArticle 请求头');
}
if (normalized.includes('cookie') || normalized.includes('登录') || normalized.includes('unauthorized') || normalized.includes('403')) {
hints.push('Cookie 可能已过期。建议重新登录 CSDN 编辑器后,再抓取一次 saveArticle 请求头');
}
if (normalized.includes('nonce')) {
hints.push('x-ca-nonce 通常是一次性值,刷新页面后重新抓取请求头更稳妥');
}
if (normalized.includes('429') || normalized.includes('限流')) {
hints.push('已触发限流,建议至少等待 5 到 10 秒后再重试');
}
return hints;
}
function loadUserAgents() {
if (fs.existsSync(USER_AGENTS_FILE)) {
return JSON.parse(fs.readFileSync(USER_AGENTS_FILE, 'utf-8'));
}
return ['Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'];
}
function getRandomUserAgent() {
const agents = loadUserAgents();
return agents[Math.floor(Math.random() * agents.length)];
}
function buildHeaders(config) {
return {
'accept': '*/*',
'accept-language': 'zh-CN,zh;q=0.9',
'content-type': 'application/json',
'origin': 'https://editor.csdn.net',
'referer': 'https://editor.csdn.net/',
'user-agent': getRandomUserAgent(),
...config
};
}
function buildPayload(args, config) {
const defaults = config.defaults || {};
const extra = args.extra || {};
const isPublish = extra.pubStatus === 'publish' || args.command === 'publish';
const htmlContent = markdownToHtml(args.content);
const payload = {
id: args.id ? String(args.id) : undefined,
title: args.title,
content: htmlContent,
markdowncontent: args.content,
Description: extra.description || defaults.description || '',
readType: extra.readType || defaults.readType || 'public',
level: 0,
tags: extra.tags || defaults.tags || '',
status: isPublish ? 0 : 2,
categories: extra.categories || defaults.categories || '',
type: extra.type || defaults.type || 'original',
original_link: '',
authorized_status: false,
not_auto_saved: '1',
source: 'pc_mdeditor',
cover_images: [],
cover_type: 1,
is_new: 1,
vote_id: 0,
resource_id: '',
pubStatus: extra.pubStatus || defaults.pubStatus || 'draft',
creation_statement: extra.creation_statement !== undefined ? extra.creation_statement : (defaults.creation_statement !== undefined ? defaults.creation_statement : 0),
creator_activity_id: ''
};
return payload;
}
function post(url, headers, data) {
return new Promise((resolve, reject) => {
const urlObj = new URL(url);
const options = {
hostname: urlObj.hostname,
path: urlObj.pathname,
method: 'POST',
headers: {
...headers,
'Content-Length': Buffer.byteLength(JSON.stringify(data))
}
};
const req = https.request(options, (res) => {
let body = '';
res.on('data', chunk => body += chunk);
res.on('end', () => {
try {
resolve(JSON.parse(body));
} catch {
resolve(body);
}
});
});
req.on('error', reject);
req.write(JSON.stringify(data));
req.end();
});
}
async function postWithRetry(url, headers, data, retries = MAX_RETRIES) {
for (let attempt = 1; attempt <= retries; attempt++) {
try {
const result = await post(url, headers, data);
if (result.code === 200) {
return result;
}
if (result.code === 429 || (result.msg && result.msg.includes('限流'))) {
log.warn(`Rate limited, retrying in ${RETRY_DELAY / 1000}s... (attempt ${attempt}/${retries})`);
await new Promise(resolve => setTimeout(resolve, RETRY_DELAY));
continue;
}
return result;
} catch (err) {
if (attempt < retries) {
log.warn(`Request failed: ${err.message}, retrying... (attempt ${attempt}/${retries})`);
await new Promise(resolve => setTimeout(resolve, RETRY_DELAY));
} else {
throw err;
}
}
}
throw new Error('Max retries exceeded');
}
function printUsage() {
console.log('');
console.log('CSDN Article Management Script');
console.log('');
console.log('Usage:');
console.log(' node csdn_article.js save --title "标题" --content "内容"');
console.log(' node csdn_article.js save --title "标题" --file path/to/article.md');
console.log(' node csdn_article.js update --id 123456 --title "标题" --content "内容"');
console.log(' node csdn_article.js update --id 123456 --file path/to/article.md');
console.log(' node csdn_article.js update --file path/to/article.md');
console.log(' node csdn_article.js publish --id 123456 --title "标题" --content "内容" --extra \'{"tags":"python,async","description":"文章摘要"}\'');
console.log(' node csdn_article.js publish --file path/to/article.md --extra \'{"tags":"python,async","description":"文章摘要"}\'');
console.log('');
console.log('Options:');
console.log(' --title: 文章标题');
console.log(' --content: Markdown内容(与--file二选一)');
console.log(' --file: Markdown文件路径(与--content二选一,推荐)');
console.log(' --id: 文章ID(原有参数,继续支持显式传入;若--file已有本地映射也可省略)');
console.log(' --extra: JSON格式扩展参数');
console.log(' --config: 配置文件路径(默认: csdn_config.json)');
console.log('');
console.log('Extra options (via --extra JSON):');
console.log(' tags: 标签(逗号分隔)');
console.log(' readType: 可见范围 (public/private/read_need_fans/read_need_vip)');
console.log(' type: 文章类型 (original/repost/translated),默认值为original原创');
console.log(' creation_statement: 创作者声明 (0/1/2/3) 默认值为0,即不声明');
console.log(' pubStatus: 发布状态 (draft/publish)');
console.log(' description: 摘要(发布时必填,最多256字)');
console.log('');
console.log(`Local article map: ${DEFAULT_ARTICLE_MAP_FILE}`);
console.log('');
}
async function main() {
const { command, options } = parseArgs();
if (!command || command === '--help' || command === '-h') {
printUsage();
process.exit(0);
}
if (!['save', 'update', 'publish'].includes(command)) {
log.error(`Unknown command: ${command}`);
printUsage();
process.exit(1);
}
const configFile = options.config || DEFAULT_CONFIG_FILE;
log.info(`Using config file: ${configFile}`);
log.step('Loading configuration...');
const config = loadConfig(configFile);
const configErrors = validateConfig(config, configFile);
if (configErrors.length > 0) {
printValidationErrors('Configuration validation failed', configErrors);
}
const articleMap = loadArticleMap();
const extra = parseExtra(options.extra);
if (command === 'publish') {
extra.pubStatus = 'publish';
log.step('Publish mode enabled');
}
const resolvedInput = resolveContentAndTitle(options);
const articleRecord = findArticleIdByFile(articleMap, resolvedInput.resolvedFilePath);
if (!options.id && articleRecord && (command === 'update' || command === 'publish')) {
options.id = articleRecord.id;
log.step(`Resolved article ID from ${DEFAULT_ARTICLE_MAP_FILE}: ${options.id}`);
}
const buildArgs = {
command,
id: options.id,
title: resolvedInput.title,
content: resolvedInput.content,
extra
};
log.step('Building request headers...');
const headers = buildHeaders(config.headers || {});
log.step(`User-Agent: ${headers['user-agent'].substring(0, 60)}...`);
log.step('Building request payload...');
let payload;
try {
payload = buildPayload(buildArgs, config);
} catch (error) {
log.error(`Failed to convert Markdown to HTML: ${error.message}`);
process.exit(1);
}
const inputErrors = validateResolvedInput(command, payload, resolvedInput.resolvedFilePath);
if (inputErrors.length > 0) {
printValidationErrors('Input validation failed', inputErrors);
}
log.step(`Article title: ${payload.title}`);
log.step(`Content size: ${payload.markdowncontent.length} characters`);
log.step(`PubStatus: ${payload.pubStatus}`);
log.info(`Executing ${command} command...`);
try {
const result = await postWithRetry(API_URL, headers, payload);
if (result.code === 200) {
log.success('Article saved successfully!');
updateArticleMap(articleMap, resolvedInput.resolvedFilePath, result.data, command);
if (resolvedInput.resolvedFilePath) {
saveArticleMap(articleMap);
log.step(`Updated local article map: ${articleMap.path}`);
}
console.log('');
console.log(` Article URL: ${result.data.url}`);
console.log(` Article ID: ${result.data.id}`);
console.log(` Title: ${result.data.title}`);
console.log('');
} else {
log.error(`Failed: ${result.msg}`);
if (result.traceId) {
log.error(`Trace ID: ${result.traceId}`);
}
const failureHints = buildFailureHints(result);
failureHints.forEach((hint) => log.step(`Troubleshooting: ${hint}`));
if (failureHints.length > 0) {
log.step(`See ${TROUBLESHOOTING_DOC} for more details`);
}
process.exit(1);
}
} catch (err) {
log.error(`Request failed: ${err.message}`);
log.step(`See ${TROUBLESHOOTING_DOC} for common recovery steps`);
process.exit(1);
}
}
main();
const { marked } = require('./marked.umd.js');
if (!marked || typeof marked.parse !== 'function') {
throw new Error('Local marked.umd.js does not export marked.parse');
}
function markdownToHtml(markdown) {
return marked.parse(String(markdown || ''));
}
module.exports = {
markdownToHtml
};/**
* marked v17.0.4 - a markdown parser
* Copyright (c) 2018-2026, MarkedJS. (MIT License)
* Copyright (c) 2011-2018, Christopher Jeffrey. (MIT License)
* https://github.com/markedjs/marked
*/
/**
* DO NOT EDIT THIS FILE
* The code in this file is generated from files in ./src/
*/
(function(g,f){if(typeof exports=="object"&&typeof module<"u"){module.exports=f()}else if("function"==typeof define && define.amd){define("marked",f)}else {g["marked"]=f()}}(typeof globalThis < "u" ? globalThis : typeof self < "u" ? self : this,function(){var exports={};var __exports=exports;var module={exports};
"use strict";var G=Object.defineProperty;var Te=Object.getOwnPropertyDescriptor;var Oe=Object.getOwnPropertyNames;var we=Object.prototype.hasOwnProperty;var ye=(l,e)=>{for(var t in e)G(l,t,{get:e[t],enumerable:!0})},Pe=(l,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of Oe(e))!we.call(l,r)&&r!==t&&G(l,r,{get:()=>e[r],enumerable:!(n=Te(e,r))||n.enumerable});return l};var Se=l=>Pe(G({},"__esModule",{value:!0}),l);var Tt={};ye(Tt,{Hooks:()=>P,Lexer:()=>x,Marked:()=>I,Parser:()=>b,Renderer:()=>y,TextRenderer:()=>S,Tokenizer:()=>w,defaults:()=>R,getDefaults:()=>_,lexer:()=>Rt,marked:()=>g,options:()=>kt,parse:()=>xt,parseInline:()=>mt,parser:()=>bt,setOptions:()=>dt,use:()=>gt,walkTokens:()=>ft});module.exports=Se(Tt);function _(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var R=_();function Z(l){R=l}var L={exec:()=>null};function k(l,e=""){let t=typeof l=="string"?l:l.source,n={replace:(r,i)=>{let s=typeof i=="string"?i:i.source;return s=s.replace(m.caret,"$1"),t=t.replace(r,s),n},getRegex:()=>new RegExp(t,e)};return n}var $e=(()=>{try{return!!new RegExp("(?<=1)(?<!1)")}catch{return!1}})(),m={codeRemoveIndent:/^(?: {1,4}| {0,3}\t)/gm,outputLinkReplace:/\\([\[\]])/g,indentCodeCompensation:/^(\s+)(?:```)/,beginningSpace:/^\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\n/g,tabCharGlobal:/\t/g,multipleSpaceGlobal:/\s+/g,blankLine:/^[ \t]*$/,doubleBlankLine:/\n[ \t]*\n[ \t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] +\S/,listReplaceTask:/^\[[ xX]\] +/,listTaskCheckbox:/\[[ xX]\]/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^<a /i,endATag:/^<\/a>/i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^</,endAngleBracket:/>$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:l=>new RegExp(`^( {0,3}${l})((?:[ ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:l=>new RegExp(`^ {0,${Math.min(3,l-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`),hrRegex:l=>new RegExp(`^ {0,${Math.min(3,l-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),fencesBeginRegex:l=>new RegExp(`^ {0,${Math.min(3,l-1)}}(?:\`\`\`|~~~)`),headingBeginRegex:l=>new RegExp(`^ {0,${Math.min(3,l-1)}}#`),htmlBeginRegex:l=>new RegExp(`^ {0,${Math.min(3,l-1)}}<(?:[a-z].*>|!--)`,"i"),blockquoteBeginRegex:l=>new RegExp(`^ {0,${Math.min(3,l-1)}}>`)},_e=/^(?:[ \t]*(?:\n|$))+/,Le=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,Me=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,C=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,ze=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,Q=/ {0,3}(?:[*+-]|\d{1,9}[.)])/,se=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,ie=k(se).replace(/bull/g,Q).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,"").getRegex(),Ee=k(se).replace(/bull/g,Q).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),j=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,Ie=/^[^\n]+/,F=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/,Ae=k(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label",F).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),Ce=k(/^(bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,Q).getRegex(),q="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",U=/<!--(?:-?>|[\s\S]*?(?:-->|$))/,Be=k("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|<![A-Z][\\s\\S]*?(?:>\\n*|$)|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>\\n*|$)|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|</(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))","i").replace("comment",U).replace("tag",q).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),oe=k(j).replace("hr",C).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",q).getRegex(),De=k(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",oe).getRegex(),K={blockquote:De,code:Le,def:Ae,fences:Me,heading:ze,hr:C,html:Be,lheading:ie,list:Ce,newline:_e,paragraph:oe,table:L,text:Ie},ne=k("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",C).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code","(?: {4}| {0,3} )[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",q).getRegex(),qe={...K,lheading:Ee,table:ne,paragraph:k(j).replace("hr",C).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",ne).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",q).getRegex()},ve={...K,html:k(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:"[^"]*"|'[^']*'|\\s[^'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment",U).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:L,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:k(j).replace("hr",C).replace("heading",` *#{1,6} *[^
]`).replace("lheading",ie).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},He=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,Ge=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,ae=/^( {2,}|\\)\n(?!\s*$)/,Ze=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/,v=/[\p{P}\p{S}]/u,W=/[\s\p{P}\p{S}]/u,le=/[^\s\p{P}\p{S}]/u,Ne=k(/^((?![*_])punctSpace)/,"u").replace(/punctSpace/g,W).getRegex(),ue=/(?!~)[\p{P}\p{S}]/u,Qe=/(?!~)[\s\p{P}\p{S}]/u,je=/(?:[^\s\p{P}\p{S}]|~)/u,pe=/(?![*_])[\p{P}\p{S}]/u,Fe=/(?![*_])[\s\p{P}\p{S}]/u,Ue=/(?:[^\s\p{P}\p{S}]|[*_])/u,Ke=k(/link|precode-code|html/,"g").replace("link",/\[(?:[^\[\]`]|(?<a>`+)[^`]+\k<a>(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-",$e?"(?<!`)()":"(^^|[^`])").replace("code",/(?<b>`+)[^`]+\k<b>(?!`)/).replace("html",/<(?! )[^<>]*?>/).getRegex(),ce=/^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/,We=k(ce,"u").replace(/punct/g,v).getRegex(),Xe=k(ce,"u").replace(/punct/g,ue).getRegex(),he="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)",Je=k(he,"gu").replace(/notPunctSpace/g,le).replace(/punctSpace/g,W).replace(/punct/g,v).getRegex(),Ve=k(he,"gu").replace(/notPunctSpace/g,je).replace(/punctSpace/g,Qe).replace(/punct/g,ue).getRegex(),Ye=k("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,le).replace(/punctSpace/g,W).replace(/punct/g,v).getRegex(),et=k(/^~~?(?:((?!~)punct)|[^\s~])/,"u").replace(/punct/g,pe).getRegex(),tt="^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)",nt=k(tt,"gu").replace(/notPunctSpace/g,Ue).replace(/punctSpace/g,Fe).replace(/punct/g,pe).getRegex(),rt=k(/\\(punct)/,"gu").replace(/punct/g,v).getRegex(),st=k(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),it=k(U).replace("(?:-->|$)","-->").getRegex(),ot=k("^comment|^</[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>").replace("comment",it).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),D=/(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+[^`]*?`+(?!`)|[^\[\]\\`])*?/,at=k(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]+(?:\n[ \t]*)?|\n[ \t]*)(title))?\s*\)/).replace("label",D).replace("href",/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),ke=k(/^!?\[(label)\]\[(ref)\]/).replace("label",D).replace("ref",F).getRegex(),de=k(/^!?\[(ref)\](?:\[\])?/).replace("ref",F).getRegex(),lt=k("reflink|nolink(?!\\()","g").replace("reflink",ke).replace("nolink",de).getRegex(),re=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,X={_backpedal:L,anyPunctuation:rt,autolink:st,blockSkip:Ke,br:ae,code:Ge,del:L,delLDelim:L,delRDelim:L,emStrongLDelim:We,emStrongRDelimAst:Je,emStrongRDelimUnd:Ye,escape:He,link:at,nolink:de,punctuation:Ne,reflink:ke,reflinkSearch:lt,tag:ot,text:Ze,url:L},ut={...X,link:k(/^!?\[(label)\]\((.*?)\)/).replace("label",D).getRegex(),reflink:k(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",D).getRegex()},N={...X,emStrongRDelimAst:Ve,emStrongLDelim:Xe,delLDelim:et,delRDelim:nt,url:k(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol",re).replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/,text:k(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|protocol:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/).replace("protocol",re).getRegex()},pt={...N,br:k(ae).replace("{2,}","*").getRegex(),text:k(N.text).replace("\\b_","\\b_| {2,}\\n").replace(/\{2,\}/g,"*").getRegex()},B={normal:K,gfm:qe,pedantic:ve},z={normal:X,gfm:N,breaks:pt,pedantic:ut};var ct={"&":"&","<":"<",">":">",'"':""","'":"'"},ge=l=>ct[l];function O(l,e){if(e){if(m.escapeTest.test(l))return l.replace(m.escapeReplace,ge)}else if(m.escapeTestNoEncode.test(l))return l.replace(m.escapeReplaceNoEncode,ge);return l}function J(l){try{l=encodeURI(l).replace(m.percentDecode,"%")}catch{return null}return l}function V(l,e){let t=l.replace(m.findPipe,(i,s,a)=>{let o=!1,u=s;for(;--u>=0&&a[u]==="\\";)o=!o;return o?"|":" |"}),n=t.split(m.splitPipe),r=0;if(n[0].trim()||n.shift(),n.length>0&&!n.at(-1)?.trim()&&n.pop(),e)if(n.length>e)n.splice(e);else for(;n.length<e;)n.push("");for(;r<n.length;r++)n[r]=n[r].trim().replace(m.slashPipe,"|");return n}function E(l,e,t){let n=l.length;if(n===0)return"";let r=0;for(;r<n;){let i=l.charAt(n-r-1);if(i===e&&!t)r++;else if(i!==e&&t)r++;else break}return l.slice(0,n-r)}function fe(l,e){if(l.indexOf(e[1])===-1)return-1;let t=0;for(let n=0;n<l.length;n++)if(l[n]==="\\")n++;else if(l[n]===e[0])t++;else if(l[n]===e[1]&&(t--,t<0))return n;return t>0?-2:-1}function me(l,e=0){let t=e,n="";for(let r of l)if(r===" "){let i=4-t%4;n+=" ".repeat(i),t+=i}else n+=r,t++;return n}function xe(l,e,t,n,r){let i=e.href,s=e.title||null,a=l[1].replace(r.other.outputLinkReplace,"$1");n.state.inLink=!0;let o={type:l[0].charAt(0)==="!"?"image":"link",raw:t,href:i,title:s,text:a,tokens:n.inlineTokens(a)};return n.state.inLink=!1,o}function ht(l,e,t){let n=l.match(t.other.indentCodeCompensation);if(n===null)return e;let r=n[1];return e.split(`
`).map(i=>{let s=i.match(t.other.beginningSpace);if(s===null)return i;let[a]=s;return a.length>=r.length?i.slice(r.length):i}).join(`
`)}var w=class{options;rules;lexer;constructor(e){this.options=e||R}space(e){let t=this.rules.block.newline.exec(e);if(t&&t[0].length>0)return{type:"space",raw:t[0]}}code(e){let t=this.rules.block.code.exec(e);if(t){let n=t[0].replace(this.rules.other.codeRemoveIndent,"");return{type:"code",raw:t[0],codeBlockStyle:"indented",text:this.options.pedantic?n:E(n,`
`)}}}fences(e){let t=this.rules.block.fences.exec(e);if(t){let n=t[0],r=ht(n,t[3]||"",this.rules);return{type:"code",raw:n,lang:t[2]?t[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):t[2],text:r}}}heading(e){let t=this.rules.block.heading.exec(e);if(t){let n=t[2].trim();if(this.rules.other.endingHash.test(n)){let r=E(n,"#");(this.options.pedantic||!r||this.rules.other.endingSpaceChar.test(r))&&(n=r.trim())}return{type:"heading",raw:t[0],depth:t[1].length,text:n,tokens:this.lexer.inline(n)}}}hr(e){let t=this.rules.block.hr.exec(e);if(t)return{type:"hr",raw:E(t[0],`
`)}}blockquote(e){let t=this.rules.block.blockquote.exec(e);if(t){let n=E(t[0],`
`).split(`
`),r="",i="",s=[];for(;n.length>0;){let a=!1,o=[],u;for(u=0;u<n.length;u++)if(this.rules.other.blockquoteStart.test(n[u]))o.push(n[u]),a=!0;else if(!a)o.push(n[u]);else break;n=n.slice(u);let p=o.join(`
`),c=p.replace(this.rules.other.blockquoteSetextReplace,`
$1`).replace(this.rules.other.blockquoteSetextReplace2,"");r=r?`${r}
${p}`:p,i=i?`${i}
${c}`:c;let d=this.lexer.state.top;if(this.lexer.state.top=!0,this.lexer.blockTokens(c,s,!0),this.lexer.state.top=d,n.length===0)break;let h=s.at(-1);if(h?.type==="code")break;if(h?.type==="blockquote"){let T=h,f=T.raw+`
`+n.join(`
`),$=this.blockquote(f);s[s.length-1]=$,r=r.substring(0,r.length-T.raw.length)+$.raw,i=i.substring(0,i.length-T.text.length)+$.text;break}else if(h?.type==="list"){let T=h,f=T.raw+`
`+n.join(`
`),$=this.list(f);s[s.length-1]=$,r=r.substring(0,r.length-h.raw.length)+$.raw,i=i.substring(0,i.length-T.raw.length)+$.raw,n=f.substring(s.at(-1).raw.length).split(`
`);continue}}return{type:"blockquote",raw:r,tokens:s,text:i}}}list(e){let t=this.rules.block.list.exec(e);if(t){let n=t[1].trim(),r=n.length>1,i={type:"list",raw:"",ordered:r,start:r?+n.slice(0,-1):"",loose:!1,items:[]};n=r?`\\d{1,9}\\${n.slice(-1)}`:`\\${n}`,this.options.pedantic&&(n=r?n:"[*+-]");let s=this.rules.other.listItemRegex(n),a=!1;for(;e;){let u=!1,p="",c="";if(!(t=s.exec(e))||this.rules.block.hr.test(e))break;p=t[0],e=e.substring(p.length);let d=me(t[2].split(`
`,1)[0],t[1].length),h=e.split(`
`,1)[0],T=!d.trim(),f=0;if(this.options.pedantic?(f=2,c=d.trimStart()):T?f=t[1].length+1:(f=d.search(this.rules.other.nonSpaceChar),f=f>4?1:f,c=d.slice(f),f+=t[1].length),T&&this.rules.other.blankLine.test(h)&&(p+=h+`
`,e=e.substring(h.length+1),u=!0),!u){let $=this.rules.other.nextBulletRegex(f),Y=this.rules.other.hrRegex(f),ee=this.rules.other.fencesBeginRegex(f),te=this.rules.other.headingBeginRegex(f),be=this.rules.other.htmlBeginRegex(f),Re=this.rules.other.blockquoteBeginRegex(f);for(;e;){let H=e.split(`
`,1)[0],A;if(h=H,this.options.pedantic?(h=h.replace(this.rules.other.listReplaceNesting," "),A=h):A=h.replace(this.rules.other.tabCharGlobal," "),ee.test(h)||te.test(h)||be.test(h)||Re.test(h)||$.test(h)||Y.test(h))break;if(A.search(this.rules.other.nonSpaceChar)>=f||!h.trim())c+=`
`+A.slice(f);else{if(T||d.replace(this.rules.other.tabCharGlobal," ").search(this.rules.other.nonSpaceChar)>=4||ee.test(d)||te.test(d)||Y.test(d))break;c+=`
`+h}T=!h.trim(),p+=H+`
`,e=e.substring(H.length+1),d=A.slice(f)}}i.loose||(a?i.loose=!0:this.rules.other.doubleBlankLine.test(p)&&(a=!0)),i.items.push({type:"list_item",raw:p,task:!!this.options.gfm&&this.rules.other.listIsTask.test(c),loose:!1,text:c,tokens:[]}),i.raw+=p}let o=i.items.at(-1);if(o)o.raw=o.raw.trimEnd(),o.text=o.text.trimEnd();else return;i.raw=i.raw.trimEnd();for(let u of i.items){if(this.lexer.state.top=!1,u.tokens=this.lexer.blockTokens(u.text,[]),u.task){if(u.text=u.text.replace(this.rules.other.listReplaceTask,""),u.tokens[0]?.type==="text"||u.tokens[0]?.type==="paragraph"){u.tokens[0].raw=u.tokens[0].raw.replace(this.rules.other.listReplaceTask,""),u.tokens[0].text=u.tokens[0].text.replace(this.rules.other.listReplaceTask,"");for(let c=this.lexer.inlineQueue.length-1;c>=0;c--)if(this.rules.other.listIsTask.test(this.lexer.inlineQueue[c].src)){this.lexer.inlineQueue[c].src=this.lexer.inlineQueue[c].src.replace(this.rules.other.listReplaceTask,"");break}}let p=this.rules.other.listTaskCheckbox.exec(u.raw);if(p){let c={type:"checkbox",raw:p[0]+" ",checked:p[0]!=="[ ]"};u.checked=c.checked,i.loose?u.tokens[0]&&["paragraph","text"].includes(u.tokens[0].type)&&"tokens"in u.tokens[0]&&u.tokens[0].tokens?(u.tokens[0].raw=c.raw+u.tokens[0].raw,u.tokens[0].text=c.raw+u.tokens[0].text,u.tokens[0].tokens.unshift(c)):u.tokens.unshift({type:"paragraph",raw:c.raw,text:c.raw,tokens:[c]}):u.tokens.unshift(c)}}if(!i.loose){let p=u.tokens.filter(d=>d.type==="space"),c=p.length>0&&p.some(d=>this.rules.other.anyLine.test(d.raw));i.loose=c}}if(i.loose)for(let u of i.items){u.loose=!0;for(let p of u.tokens)p.type==="text"&&(p.type="paragraph")}return i}}html(e){let t=this.rules.block.html.exec(e);if(t)return{type:"html",block:!0,raw:t[0],pre:t[1]==="pre"||t[1]==="script"||t[1]==="style",text:t[0]}}def(e){let t=this.rules.block.def.exec(e);if(t){let n=t[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal," "),r=t[2]?t[2].replace(this.rules.other.hrefBrackets,"$1").replace(this.rules.inline.anyPunctuation,"$1"):"",i=t[3]?t[3].substring(1,t[3].length-1).replace(this.rules.inline.anyPunctuation,"$1"):t[3];return{type:"def",tag:n,raw:t[0],href:r,title:i}}}table(e){let t=this.rules.block.table.exec(e);if(!t||!this.rules.other.tableDelimiter.test(t[2]))return;let n=V(t[1]),r=t[2].replace(this.rules.other.tableAlignChars,"").split("|"),i=t[3]?.trim()?t[3].replace(this.rules.other.tableRowBlankLine,"").split(`
`):[],s={type:"table",raw:t[0],header:[],align:[],rows:[]};if(n.length===r.length){for(let a of r)this.rules.other.tableAlignRight.test(a)?s.align.push("right"):this.rules.other.tableAlignCenter.test(a)?s.align.push("center"):this.rules.other.tableAlignLeft.test(a)?s.align.push("left"):s.align.push(null);for(let a=0;a<n.length;a++)s.header.push({text:n[a],tokens:this.lexer.inline(n[a]),header:!0,align:s.align[a]});for(let a of i)s.rows.push(V(a,s.header.length).map((o,u)=>({text:o,tokens:this.lexer.inline(o),header:!1,align:s.align[u]})));return s}}lheading(e){let t=this.rules.block.lheading.exec(e);if(t)return{type:"heading",raw:t[0],depth:t[2].charAt(0)==="="?1:2,text:t[1],tokens:this.lexer.inline(t[1])}}paragraph(e){let t=this.rules.block.paragraph.exec(e);if(t){let n=t[1].charAt(t[1].length-1)===`
`?t[1].slice(0,-1):t[1];return{type:"paragraph",raw:t[0],text:n,tokens:this.lexer.inline(n)}}}text(e){let t=this.rules.block.text.exec(e);if(t)return{type:"text",raw:t[0],text:t[0],tokens:this.lexer.inline(t[0])}}escape(e){let t=this.rules.inline.escape.exec(e);if(t)return{type:"escape",raw:t[0],text:t[1]}}tag(e){let t=this.rules.inline.tag.exec(e);if(t)return!this.lexer.state.inLink&&this.rules.other.startATag.test(t[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(t[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(t[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(t[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:t[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:t[0]}}link(e){let t=this.rules.inline.link.exec(e);if(t){let n=t[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(n)){if(!this.rules.other.endAngleBracket.test(n))return;let s=E(n.slice(0,-1),"\\");if((n.length-s.length)%2===0)return}else{let s=fe(t[2],"()");if(s===-2)return;if(s>-1){let o=(t[0].indexOf("!")===0?5:4)+t[1].length+s;t[2]=t[2].substring(0,s),t[0]=t[0].substring(0,o).trim(),t[3]=""}}let r=t[2],i="";if(this.options.pedantic){let s=this.rules.other.pedanticHrefTitle.exec(r);s&&(r=s[1],i=s[3])}else i=t[3]?t[3].slice(1,-1):"";return r=r.trim(),this.rules.other.startAngleBracket.test(r)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(n)?r=r.slice(1):r=r.slice(1,-1)),xe(t,{href:r&&r.replace(this.rules.inline.anyPunctuation,"$1"),title:i&&i.replace(this.rules.inline.anyPunctuation,"$1")},t[0],this.lexer,this.rules)}}reflink(e,t){let n;if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){let r=(n[2]||n[1]).replace(this.rules.other.multipleSpaceGlobal," "),i=t[r.toLowerCase()];if(!i){let s=n[0].charAt(0);return{type:"text",raw:s,text:s}}return xe(n,i,n[0],this.lexer,this.rules)}}emStrong(e,t,n=""){let r=this.rules.inline.emStrongLDelim.exec(e);if(!r||r[3]&&n.match(this.rules.other.unicodeAlphaNumeric))return;if(!(r[1]||r[2]||"")||!n||this.rules.inline.punctuation.exec(n)){let s=[...r[0]].length-1,a,o,u=s,p=0,c=r[0][0]==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(c.lastIndex=0,t=t.slice(-1*e.length+s);(r=c.exec(t))!=null;){if(a=r[1]||r[2]||r[3]||r[4]||r[5]||r[6],!a)continue;if(o=[...a].length,r[3]||r[4]){u+=o;continue}else if((r[5]||r[6])&&s%3&&!((s+o)%3)){p+=o;continue}if(u-=o,u>0)continue;o=Math.min(o,o+u+p);let d=[...r[0]][0].length,h=e.slice(0,s+r.index+d+o);if(Math.min(s,o)%2){let f=h.slice(1,-1);return{type:"em",raw:h,text:f,tokens:this.lexer.inlineTokens(f)}}let T=h.slice(2,-2);return{type:"strong",raw:h,text:T,tokens:this.lexer.inlineTokens(T)}}}}codespan(e){let t=this.rules.inline.code.exec(e);if(t){let n=t[2].replace(this.rules.other.newLineCharGlobal," "),r=this.rules.other.nonSpaceChar.test(n),i=this.rules.other.startingSpaceChar.test(n)&&this.rules.other.endingSpaceChar.test(n);return r&&i&&(n=n.substring(1,n.length-1)),{type:"codespan",raw:t[0],text:n}}}br(e){let t=this.rules.inline.br.exec(e);if(t)return{type:"br",raw:t[0]}}del(e,t,n=""){let r=this.rules.inline.delLDelim.exec(e);if(!r)return;if(!(r[1]||"")||!n||this.rules.inline.punctuation.exec(n)){let s=[...r[0]].length-1,a,o,u=s,p=this.rules.inline.delRDelim;for(p.lastIndex=0,t=t.slice(-1*e.length+s);(r=p.exec(t))!=null;){if(a=r[1]||r[2]||r[3]||r[4]||r[5]||r[6],!a||(o=[...a].length,o!==s))continue;if(r[3]||r[4]){u+=o;continue}if(u-=o,u>0)continue;o=Math.min(o,o+u);let c=[...r[0]][0].length,d=e.slice(0,s+r.index+c+o),h=d.slice(s,-s);return{type:"del",raw:d,text:h,tokens:this.lexer.inlineTokens(h)}}}}autolink(e){let t=this.rules.inline.autolink.exec(e);if(t){let n,r;return t[2]==="@"?(n=t[1],r="mailto:"+n):(n=t[1],r=n),{type:"link",raw:t[0],text:n,href:r,tokens:[{type:"text",raw:n,text:n}]}}}url(e){let t;if(t=this.rules.inline.url.exec(e)){let n,r;if(t[2]==="@")n=t[0],r="mailto:"+n;else{let i;do i=t[0],t[0]=this.rules.inline._backpedal.exec(t[0])?.[0]??"";while(i!==t[0]);n=t[0],t[1]==="www."?r="http://"+t[0]:r=t[0]}return{type:"link",raw:t[0],text:n,href:r,tokens:[{type:"text",raw:n,text:n}]}}}inlineText(e){let t=this.rules.inline.text.exec(e);if(t){let n=this.lexer.state.inRawBlock;return{type:"text",raw:t[0],text:t[0],escaped:n}}}};var x=class l{tokens;options;state;inlineQueue;tokenizer;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||R,this.options.tokenizer=this.options.tokenizer||new w,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let t={other:m,block:B.normal,inline:z.normal};this.options.pedantic?(t.block=B.pedantic,t.inline=z.pedantic):this.options.gfm&&(t.block=B.gfm,this.options.breaks?t.inline=z.breaks:t.inline=z.gfm),this.tokenizer.rules=t}static get rules(){return{block:B,inline:z}}static lex(e,t){return new l(t).lex(e)}static lexInline(e,t){return new l(t).inlineTokens(e)}lex(e){e=e.replace(m.carriageReturn,`
`),this.blockTokens(e,this.tokens);for(let t=0;t<this.inlineQueue.length;t++){let n=this.inlineQueue[t];this.inlineTokens(n.src,n.tokens)}return this.inlineQueue=[],this.tokens}blockTokens(e,t=[],n=!1){for(this.options.pedantic&&(e=e.replace(m.tabCharGlobal," ").replace(m.spaceLine,""));e;){let r;if(this.options.extensions?.block?.some(s=>(r=s.call({lexer:this},e,t))?(e=e.substring(r.raw.length),t.push(r),!0):!1))continue;if(r=this.tokenizer.space(e)){e=e.substring(r.raw.length);let s=t.at(-1);r.raw.length===1&&s!==void 0?s.raw+=`
`:t.push(r);continue}if(r=this.tokenizer.code(e)){e=e.substring(r.raw.length);let s=t.at(-1);s?.type==="paragraph"||s?.type==="text"?(s.raw+=(s.raw.endsWith(`
`)?"":`
`)+r.raw,s.text+=`
`+r.text,this.inlineQueue.at(-1).src=s.text):t.push(r);continue}if(r=this.tokenizer.fences(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.heading(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.hr(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.blockquote(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.list(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.html(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.def(e)){e=e.substring(r.raw.length);let s=t.at(-1);s?.type==="paragraph"||s?.type==="text"?(s.raw+=(s.raw.endsWith(`
`)?"":`
`)+r.raw,s.text+=`
`+r.raw,this.inlineQueue.at(-1).src=s.text):this.tokens.links[r.tag]||(this.tokens.links[r.tag]={href:r.href,title:r.title},t.push(r));continue}if(r=this.tokenizer.table(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.lheading(e)){e=e.substring(r.raw.length),t.push(r);continue}let i=e;if(this.options.extensions?.startBlock){let s=1/0,a=e.slice(1),o;this.options.extensions.startBlock.forEach(u=>{o=u.call({lexer:this},a),typeof o=="number"&&o>=0&&(s=Math.min(s,o))}),s<1/0&&s>=0&&(i=e.substring(0,s+1))}if(this.state.top&&(r=this.tokenizer.paragraph(i))){let s=t.at(-1);n&&s?.type==="paragraph"?(s.raw+=(s.raw.endsWith(`
`)?"":`
`)+r.raw,s.text+=`
`+r.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=s.text):t.push(r),n=i.length!==e.length,e=e.substring(r.raw.length);continue}if(r=this.tokenizer.text(e)){e=e.substring(r.raw.length);let s=t.at(-1);s?.type==="text"?(s.raw+=(s.raw.endsWith(`
`)?"":`
`)+r.raw,s.text+=`
`+r.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=s.text):t.push(r);continue}if(e){let s="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(s);break}else throw new Error(s)}}return this.state.top=!0,t}inline(e,t=[]){return this.inlineQueue.push({src:e,tokens:t}),t}inlineTokens(e,t=[]){let n=e,r=null;if(this.tokens.links){let o=Object.keys(this.tokens.links);if(o.length>0)for(;(r=this.tokenizer.rules.inline.reflinkSearch.exec(n))!=null;)o.includes(r[0].slice(r[0].lastIndexOf("[")+1,-1))&&(n=n.slice(0,r.index)+"["+"a".repeat(r[0].length-2)+"]"+n.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(r=this.tokenizer.rules.inline.anyPunctuation.exec(n))!=null;)n=n.slice(0,r.index)+"++"+n.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);let i;for(;(r=this.tokenizer.rules.inline.blockSkip.exec(n))!=null;)i=r[2]?r[2].length:0,n=n.slice(0,r.index+i)+"["+"a".repeat(r[0].length-i-2)+"]"+n.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);n=this.options.hooks?.emStrongMask?.call({lexer:this},n)??n;let s=!1,a="";for(;e;){s||(a=""),s=!1;let o;if(this.options.extensions?.inline?.some(p=>(o=p.call({lexer:this},e,t))?(e=e.substring(o.raw.length),t.push(o),!0):!1))continue;if(o=this.tokenizer.escape(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.tag(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.link(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(o.raw.length);let p=t.at(-1);o.type==="text"&&p?.type==="text"?(p.raw+=o.raw,p.text+=o.text):t.push(o);continue}if(o=this.tokenizer.emStrong(e,n,a)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.codespan(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.br(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.del(e,n,a)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.autolink(e)){e=e.substring(o.raw.length),t.push(o);continue}if(!this.state.inLink&&(o=this.tokenizer.url(e))){e=e.substring(o.raw.length),t.push(o);continue}let u=e;if(this.options.extensions?.startInline){let p=1/0,c=e.slice(1),d;this.options.extensions.startInline.forEach(h=>{d=h.call({lexer:this},c),typeof d=="number"&&d>=0&&(p=Math.min(p,d))}),p<1/0&&p>=0&&(u=e.substring(0,p+1))}if(o=this.tokenizer.inlineText(u)){e=e.substring(o.raw.length),o.raw.slice(-1)!=="_"&&(a=o.raw.slice(-1)),s=!0;let p=t.at(-1);p?.type==="text"?(p.raw+=o.raw,p.text+=o.text):t.push(o);continue}if(e){let p="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(p);break}else throw new Error(p)}}return t}};var y=class{options;parser;constructor(e){this.options=e||R}space(e){return""}code({text:e,lang:t,escaped:n}){let r=(t||"").match(m.notSpaceStart)?.[0],i=e.replace(m.endingNewline,"")+`
`;return r?'<pre><code class="language-'+O(r)+'">'+(n?i:O(i,!0))+`</code></pre>
`:"<pre><code>"+(n?i:O(i,!0))+`</code></pre>
`}blockquote({tokens:e}){return`<blockquote>
${this.parser.parse(e)}</blockquote>
`}html({text:e}){return e}def(e){return""}heading({tokens:e,depth:t}){return`<h${t}>${this.parser.parseInline(e)}</h${t}>
`}hr(e){return`<hr>
`}list(e){let t=e.ordered,n=e.start,r="";for(let a=0;a<e.items.length;a++){let o=e.items[a];r+=this.listitem(o)}let i=t?"ol":"ul",s=t&&n!==1?' start="'+n+'"':"";return"<"+i+s+`>
`+r+"</"+i+`>
`}listitem(e){return`<li>${this.parser.parse(e.tokens)}</li>
`}checkbox({checked:e}){return"<input "+(e?'checked="" ':"")+'disabled="" type="checkbox"> '}paragraph({tokens:e}){return`<p>${this.parser.parseInline(e)}</p>
`}table(e){let t="",n="";for(let i=0;i<e.header.length;i++)n+=this.tablecell(e.header[i]);t+=this.tablerow({text:n});let r="";for(let i=0;i<e.rows.length;i++){let s=e.rows[i];n="";for(let a=0;a<s.length;a++)n+=this.tablecell(s[a]);r+=this.tablerow({text:n})}return r&&(r=`<tbody>${r}</tbody>`),`<table>
<thead>
`+t+`</thead>
`+r+`</table>
`}tablerow({text:e}){return`<tr>
${e}</tr>
`}tablecell(e){let t=this.parser.parseInline(e.tokens),n=e.header?"th":"td";return(e.align?`<${n} align="${e.align}">`:`<${n}>`)+t+`</${n}>
`}strong({tokens:e}){return`<strong>${this.parser.parseInline(e)}</strong>`}em({tokens:e}){return`<em>${this.parser.parseInline(e)}</em>`}codespan({text:e}){return`<code>${O(e,!0)}</code>`}br(e){return"<br>"}del({tokens:e}){return`<del>${this.parser.parseInline(e)}</del>`}link({href:e,title:t,tokens:n}){let r=this.parser.parseInline(n),i=J(e);if(i===null)return r;e=i;let s='<a href="'+e+'"';return t&&(s+=' title="'+O(t)+'"'),s+=">"+r+"</a>",s}image({href:e,title:t,text:n,tokens:r}){r&&(n=this.parser.parseInline(r,this.parser.textRenderer));let i=J(e);if(i===null)return O(n);e=i;let s=`<img src="${e}" alt="${O(n)}"`;return t&&(s+=` title="${O(t)}"`),s+=">",s}text(e){return"tokens"in e&&e.tokens?this.parser.parseInline(e.tokens):"escaped"in e&&e.escaped?e.text:O(e.text)}};var S=class{strong({text:e}){return e}em({text:e}){return e}codespan({text:e}){return e}del({text:e}){return e}html({text:e}){return e}text({text:e}){return e}link({text:e}){return""+e}image({text:e}){return""+e}br(){return""}checkbox({raw:e}){return e}};var b=class l{options;renderer;textRenderer;constructor(e){this.options=e||R,this.options.renderer=this.options.renderer||new y,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new S}static parse(e,t){return new l(t).parse(e)}static parseInline(e,t){return new l(t).parseInline(e)}parse(e){let t="";for(let n=0;n<e.length;n++){let r=e[n];if(this.options.extensions?.renderers?.[r.type]){let s=r,a=this.options.extensions.renderers[s.type].call({parser:this},s);if(a!==!1||!["space","hr","heading","code","table","blockquote","list","html","def","paragraph","text"].includes(s.type)){t+=a||"";continue}}let i=r;switch(i.type){case"space":{t+=this.renderer.space(i);break}case"hr":{t+=this.renderer.hr(i);break}case"heading":{t+=this.renderer.heading(i);break}case"code":{t+=this.renderer.code(i);break}case"table":{t+=this.renderer.table(i);break}case"blockquote":{t+=this.renderer.blockquote(i);break}case"list":{t+=this.renderer.list(i);break}case"checkbox":{t+=this.renderer.checkbox(i);break}case"html":{t+=this.renderer.html(i);break}case"def":{t+=this.renderer.def(i);break}case"paragraph":{t+=this.renderer.paragraph(i);break}case"text":{t+=this.renderer.text(i);break}default:{let s='Token with "'+i.type+'" type was not found.';if(this.options.silent)return console.error(s),"";throw new Error(s)}}}return t}parseInline(e,t=this.renderer){let n="";for(let r=0;r<e.length;r++){let i=e[r];if(this.options.extensions?.renderers?.[i.type]){let a=this.options.extensions.renderers[i.type].call({parser:this},i);if(a!==!1||!["escape","html","link","image","strong","em","codespan","br","del","text"].includes(i.type)){n+=a||"";continue}}let s=i;switch(s.type){case"escape":{n+=t.text(s);break}case"html":{n+=t.html(s);break}case"link":{n+=t.link(s);break}case"image":{n+=t.image(s);break}case"checkbox":{n+=t.checkbox(s);break}case"strong":{n+=t.strong(s);break}case"em":{n+=t.em(s);break}case"codespan":{n+=t.codespan(s);break}case"br":{n+=t.br(s);break}case"del":{n+=t.del(s);break}case"text":{n+=t.text(s);break}default:{let a='Token with "'+s.type+'" type was not found.';if(this.options.silent)return console.error(a),"";throw new Error(a)}}}return n}};var P=class{options;block;constructor(e){this.options=e||R}static passThroughHooks=new Set(["preprocess","postprocess","processAllTokens","emStrongMask"]);static passThroughHooksRespectAsync=new Set(["preprocess","postprocess","processAllTokens"]);preprocess(e){return e}postprocess(e){return e}processAllTokens(e){return e}emStrongMask(e){return e}provideLexer(){return this.block?x.lex:x.lexInline}provideParser(){return this.block?b.parse:b.parseInline}};var I=class{defaults=_();options=this.setOptions;parse=this.parseMarkdown(!0);parseInline=this.parseMarkdown(!1);Parser=b;Renderer=y;TextRenderer=S;Lexer=x;Tokenizer=w;Hooks=P;constructor(...e){this.use(...e)}walkTokens(e,t){let n=[];for(let r of e)switch(n=n.concat(t.call(this,r)),r.type){case"table":{let i=r;for(let s of i.header)n=n.concat(this.walkTokens(s.tokens,t));for(let s of i.rows)for(let a of s)n=n.concat(this.walkTokens(a.tokens,t));break}case"list":{let i=r;n=n.concat(this.walkTokens(i.items,t));break}default:{let i=r;this.defaults.extensions?.childTokens?.[i.type]?this.defaults.extensions.childTokens[i.type].forEach(s=>{let a=i[s].flat(1/0);n=n.concat(this.walkTokens(a,t))}):i.tokens&&(n=n.concat(this.walkTokens(i.tokens,t)))}}return n}use(...e){let t=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach(n=>{let r={...n};if(r.async=this.defaults.async||r.async||!1,n.extensions&&(n.extensions.forEach(i=>{if(!i.name)throw new Error("extension name required");if("renderer"in i){let s=t.renderers[i.name];s?t.renderers[i.name]=function(...a){let o=i.renderer.apply(this,a);return o===!1&&(o=s.apply(this,a)),o}:t.renderers[i.name]=i.renderer}if("tokenizer"in i){if(!i.level||i.level!=="block"&&i.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");let s=t[i.level];s?s.unshift(i.tokenizer):t[i.level]=[i.tokenizer],i.start&&(i.level==="block"?t.startBlock?t.startBlock.push(i.start):t.startBlock=[i.start]:i.level==="inline"&&(t.startInline?t.startInline.push(i.start):t.startInline=[i.start]))}"childTokens"in i&&i.childTokens&&(t.childTokens[i.name]=i.childTokens)}),r.extensions=t),n.renderer){let i=this.defaults.renderer||new y(this.defaults);for(let s in n.renderer){if(!(s in i))throw new Error(`renderer '${s}' does not exist`);if(["options","parser"].includes(s))continue;let a=s,o=n.renderer[a],u=i[a];i[a]=(...p)=>{let c=o.apply(i,p);return c===!1&&(c=u.apply(i,p)),c||""}}r.renderer=i}if(n.tokenizer){let i=this.defaults.tokenizer||new w(this.defaults);for(let s in n.tokenizer){if(!(s in i))throw new Error(`tokenizer '${s}' does not exist`);if(["options","rules","lexer"].includes(s))continue;let a=s,o=n.tokenizer[a],u=i[a];i[a]=(...p)=>{let c=o.apply(i,p);return c===!1&&(c=u.apply(i,p)),c}}r.tokenizer=i}if(n.hooks){let i=this.defaults.hooks||new P;for(let s in n.hooks){if(!(s in i))throw new Error(`hook '${s}' does not exist`);if(["options","block"].includes(s))continue;let a=s,o=n.hooks[a],u=i[a];P.passThroughHooks.has(s)?i[a]=p=>{if(this.defaults.async&&P.passThroughHooksRespectAsync.has(s))return(async()=>{let d=await o.call(i,p);return u.call(i,d)})();let c=o.call(i,p);return u.call(i,c)}:i[a]=(...p)=>{if(this.defaults.async)return(async()=>{let d=await o.apply(i,p);return d===!1&&(d=await u.apply(i,p)),d})();let c=o.apply(i,p);return c===!1&&(c=u.apply(i,p)),c}}r.hooks=i}if(n.walkTokens){let i=this.defaults.walkTokens,s=n.walkTokens;r.walkTokens=function(a){let o=[];return o.push(s.call(this,a)),i&&(o=o.concat(i.call(this,a))),o}}this.defaults={...this.defaults,...r}}),this}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,t){return x.lex(e,t??this.defaults)}parser(e,t){return b.parse(e,t??this.defaults)}parseMarkdown(e){return(n,r)=>{let i={...r},s={...this.defaults,...i},a=this.onError(!!s.silent,!!s.async);if(this.defaults.async===!0&&i.async===!1)return a(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));if(typeof n>"u"||n===null)return a(new Error("marked(): input parameter is undefined or null"));if(typeof n!="string")return a(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(n)+", string expected"));if(s.hooks&&(s.hooks.options=s,s.hooks.block=e),s.async)return(async()=>{let o=s.hooks?await s.hooks.preprocess(n):n,p=await(s.hooks?await s.hooks.provideLexer():e?x.lex:x.lexInline)(o,s),c=s.hooks?await s.hooks.processAllTokens(p):p;s.walkTokens&&await Promise.all(this.walkTokens(c,s.walkTokens));let h=await(s.hooks?await s.hooks.provideParser():e?b.parse:b.parseInline)(c,s);return s.hooks?await s.hooks.postprocess(h):h})().catch(a);try{s.hooks&&(n=s.hooks.preprocess(n));let u=(s.hooks?s.hooks.provideLexer():e?x.lex:x.lexInline)(n,s);s.hooks&&(u=s.hooks.processAllTokens(u)),s.walkTokens&&this.walkTokens(u,s.walkTokens);let c=(s.hooks?s.hooks.provideParser():e?b.parse:b.parseInline)(u,s);return s.hooks&&(c=s.hooks.postprocess(c)),c}catch(o){return a(o)}}}onError(e,t){return n=>{if(n.message+=`
Please report this to https://github.com/markedjs/marked.`,e){let r="<p>An error occurred:</p><pre>"+O(n.message+"",!0)+"</pre>";return t?Promise.resolve(r):r}if(t)return Promise.reject(n);throw n}}};var M=new I;function g(l,e){return M.parse(l,e)}g.options=g.setOptions=function(l){return M.setOptions(l),g.defaults=M.defaults,Z(g.defaults),g};g.getDefaults=_;g.defaults=R;g.use=function(...l){return M.use(...l),g.defaults=M.defaults,Z(g.defaults),g};g.walkTokens=function(l,e){return M.walkTokens(l,e)};g.parseInline=M.parseInline;g.Parser=b;g.parser=b.parse;g.Renderer=y;g.TextRenderer=S;g.Lexer=x;g.lexer=x.lex;g.Tokenizer=w;g.Hooks=P;g.parse=g;var kt=g.options,dt=g.setOptions,gt=g.use,ft=g.walkTokens,mt=g.parseInline,xt=g,bt=b.parse,Rt=x.lex;
if(__exports != exports)module.exports = exports;return module.exports}));
//# sourceMappingURL=marked.umd.js.map