a self-taught passionate Frontend developer from China.
- 💼 Frontend Engineer at Mingyuanyun in ShenZhen, China 🇨🇳
Markdown 批量导出工具、开放式跨平台博客解决方案,随意组合写作平台(语雀/Notion/FlowUs/飞书/我来Wolai)和博客平台(Hexo/Vitepress/Halo/Confluence/WordPress等)
Home Page: https://elog.1874.cool
License: MIT License
0.13.0
module.exports = {
write: {
platform: 'flowus',
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,
},
notion: {
token: process.env.NOTION_TOKEN,
databaseId: process.env.NOTION_DATABASE_ID,
filter: false, // {property: 'status', select: {equals: '已发布'}}
catalog: true,
},
feishu: {
type: 'space',
wikiId: process.env.FEISHU_WIKI_ID,
folderToken: process.env.FEISHU_FOLDER_TOKEN,
appId: process.env.FEISHU_APP_ID,
appSecret: process.env.FEISHU_APP_SECRET,
},
flowus: {
// tablePageId: process.env.FLOWUS_TABLE_PAGE_ID,
// 用此id报错,用其他账号的tablePageId是可以的
tablePageId: '43928f20-296b-4db9-b7bb-af11fbb27e85',
filter: {property: 'status', value: '已发布'},
catalog: true,
}
},
deploy: {
platform: 'local',
local: {
outputDir: './docs/mds',
// filename: 'urlname',
filename: 'title',
format: 'markdown',
catalog: true,
frontMatter: {
enable: true,
exclude: ['cover'] // 文档属性排除 cover 字段
}
},
halo: {
endpoint: process.env.HALO_ENDPOINT,
token: process.env.HALO_TOKEN,
policyName: process.env.HALO_POLICY_NAME,
rowType: 'html',
needUploadImage: true,
},
confluence: {
user: process.env.CONFLUENCE_USER,
password: process.env.WORDPRESS_PASSWORD,
endpoint: process.env.WORDPRESS_ENDPOINT,
spaceKey: process.env.CONFLUENCE_SPACE_KEY,
rootPageId: process.env.CONFLUENCE_ROOT_PAGE_ID, // 可选
},
wordpress: {
username: process.env.WORDPRESS_USERNAME,
password: process.env.WORDPRESS_PASSWORD,
endpoint: process.env.WORDPRESS_ENDPOINT,
}
},
image: {
enable: true,
platform: 'local',
local: {
outputDir: './docs/public/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: '',
},
cos: {
secretId: process.env.COS_SECRET_ID,
secretKey: process.env.COS_SECRET_KEY,
bucket: process.env.COS_BUCKET,
region: process.env.COS_REGION,
host: process.env.COS_HOST,
prefixKey: '',
},
qiniu: {
secretId: process.env.QINIU_SECRET_ID,
secretKey: process.env.QINIU_SECRET_KEY,
bucket: process.env.QINIU_BUCKET,
region: process.env.QINIU_REGION,
host: process.env.QINIU_HOST,
prefixKey: '',
},
upyun: {
user: process.env.UPYUN_USER,
password: process.env.UPYUN_PASSWORD,
bucket: process.env.UPYUN_BUCKET,
host: process.env.UPYUN_HOST,
prefixKey: '',
},
github: {
user: process.env.GITHUB_USER,
token: process.env.GITHUB_TOKEN,
repo: process.env.GITHUB_REPO,
prefixKey: '',
}
}
}
No response
No response
0.13.2
目前使用FlowUs+Hexo+Vercel进行部署,在FlowUs中我将文章状态从已发布改成进行中之后,重新sync,发现文章并没有被删除。
write部分配置如下:
write: {
platform: 'flowus',
flowus: {
tablePageId: process.env.FLOWUS_TABLE_PAGE_ID,
filter: { property: 'status', value: '已发布' }
}
},
No response
v0.13.3
Hello Elog developers, I am very happy to find such an excellent project that makes it easier for everyone to write blogs. However, I found that this project currently does not support publishing articles to typecho, a popular blogging platform.
Typecho is a lightweight blogging platform similar to wordpress. It has a complete documentation and plug-in mechanism and should be well connected with the elog project.
I hope to add new features in elog to output markdown documents to the typecho blog. Thanks in advance!
No response
0.13.2
module.exports = {
write: {
platform: 'yuque-pwd',
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,
},
notion: {
token: process.env.NOTION_TOKEN,
databaseId: process.env.NOTION_DATABASE_ID,
filter: false, // {property: 'status', select: {equals: '已发布'}}
},
feishu: {
type: 'space',
wikiId: process.env.FEISHU_WIKI_ID,
folderToken: process.env.FEISHU_FOLDER_TOKEN,
appId: process.env.FEISHU_APP_ID,
appSecret: process.env.FEISHU_APP_SECRET,
},
flowus: {
tablePageId: process.env.FLOWUS_TABLE_PAGE_ID,
filter: false, // {property: 'status',value: '已发布'}
}
},
deploy: {
platform: 'local',
local: {
outputDir: './source/_posts/elogs',
filename: 'title',
format: 'markdown',
frontMatter: {
enable: true,
include: [], // 只输出include包含的属性
exclude: [], // 不输出exclude包含的属性
},
catalog: true,
},
halo: {
endpoint: process.env.HALO_ENDPOINT,
token: process.env.HALO_TOKEN,
policyName: process.env.HALO_POLICY_NAME,
rowType: 'html',
needUploadImage: true,
},
confluence: {
user: process.env.CONFLUENCE_USER,
password: process.env.WORDPRESS_PASSWORD,
endpoint: process.env.WORDPRESS_ENDPOINT,
spaceKey: process.env.CONFLUENCE_SPACE_KEY,
rootPageId: process.env.CONFLUENCE_ROOT_PAGE_ID, // 可选
},
wordpress: {
username: process.env.WORDPRESS_USERNAME,
password: process.env.WORDPRESS_PASSWORD,
endpoint: process.env.WORDPRESS_ENDPOINT,
}
},
image: {
enable: true,
platform: 'local',
local: {
outputDir: './source/images/elogs',
prefixKey: '/source/images/elogs',
pathFollowDoc: true,
},
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: '',
},
cos: {
secretId: process.env.COS_SECRET_ID,
secretKey: process.env.COS_SECRET_KEY,
bucket: process.env.COS_BUCKET,
region: process.env.COS_REGION,
host: process.env.COS_HOST,
prefixKey: '',
},
qiniu: {
secretId: process.env.QINIU_SECRET_ID,
secretKey: process.env.QINIU_SECRET_KEY,
bucket: process.env.QINIU_BUCKET,
region: process.env.QINIU_REGION,
host: process.env.QINIU_HOST,
prefixKey: '',
},
upyun: {
user: process.env.UPYUN_USER,
password: process.env.UPYUN_PASSWORD,
bucket: process.env.UPYUN_BUCKET,
host: process.env.UPYUN_HOST,
prefixKey: '',
},
github: {
token: process.env.GITHUB_TOKEN,
user: process.env.ELOG_GITHUB_USER,
repo: process.env.ELOG_GITHUB_REPO,
prefixKey: '',
}
}
}
在windows下使用本地图床(其他target没有测试过)的时候,发现blog的content中图片的格式如下:
这会导致hexo在解析的时候使用urlencode转换图片的uri,导致图片无法正确访问
而将图片地址改为unix格式以后,hexo可以正常渲染
No response
No response
0.13.1
上传失败:a4e6d6bb79f6f4f5af7e31d115f6144b.jpeg 请检查图床配置
请求失败 unable to verify the first certificate, PUT https://api.github.com/repos/xinkeji/hexo/contents/71c3ca0f6d6211c
b427f50ae354471a0.jpeg -1 (connected: true, keepalive socket: false, socketHandledRequests: 1, socketHandledRe
sponses: 0)
headers: {}
已经配置好github变量之后还是上传不了,怎么办呀
module.exports = {
write: {
platform: 'yuque-pwd',
"yuque-pwd": {
username: process.env.YUQUE_USERNAME,
password: process.env.YUQUE_PWD,
host: '',
login: process.env.YUQUE_LOGIN,
repo: process.env.YUQUE_REPO,
linebreak: false
}
},
deploy: {
platform: "local",
local: {
outputDir: "./source/_posts/语雀/",
filename: "title",
format: "matter-markdown",
catalog: true,
formatExt: "",
}
},
image: {
enable: true,
platform: 'github',
github: {
user: process.env.LGH_USER,
token: process.env.GITHUB_TOKEN,
repo: process.env.LGH_REPO,
prefixKey: '',
host: 'cdn.jsdelivr.net'
}
},
}
1
当开启了deploy.local.catalog=true时,文档已经按目录创建存放了。但是在npx @elog/cli clean时,命令提示清空了缓存、图片、文档。可是目录的文档还在
虽然通过一些配置可做到 Notion编辑->自动拉取->自动更新,但是这个配置的过程依然会耗费一些时间,以及有一定的学习门槛。这阻止了很多想先浅尝一下的用户。
可以参考NotionNext的配置方式:直接 github fork 模版仓库->连接到一个新的 Vercel,配置一下id到环境变量即可直接使用。只需点两三下按钮,非常快速且方便。
0.12.4
module.exports = {
write: {
platform: 'yuque-pwd',
// Token 模式(需要语雀超级会员)
yuque: {
token: process.env.YUQUE_TOKEN,
login: process.env.YUQUE_LOGIN,
repo: process.env.YUQUE_REPO,
onlyPublic: true,
onlyPublished: true,
},
// 账号密码模式
"yuque-pwd": {
username: process.env.YUQUE_USERNAME,
password: process.env.YUQUE_PASSWORD,
login: process.env.YUQUE_LOGIN,
repo: process.env.YUQUE_REPO,
}
},
deploy: {
platform: 'local',
local: {
outputDir: './docs/',
filename: 'title',
format: 'markdown',
catalog: true,
formatExt: './elog.format.js',
frontMatter: {
enable: true,
include: [], // 只输出include包含的属性
exclude: [], // 不输出exclude包含的属性
}
}
},
image: {
enable: true,
platform: 'local',
local: {
outputDir: './docs/images',
pathFollowDoc: true,
}
}
}
使用语雀账号密码模式同步frontMatter出现问题,
front-matter解析失败,将返回预定义属性incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line at line 1, column 40:
... Blogging with Elog<br />classify: 关于Elog<br />description:xxx ...
预定义属性:https://elog.1874.cool/notion/raqyleng501h23p1#预定义属性
No response
要在markdown中完成换行需要在行尾添加2个空格
我并不想发布草稿, 但语雀又没有明确的提示哪些文章已发布或未发布, 所以需要一个方式来快速查看文章状态
也许可以通过一个命令将文章状态输出; 也许可以在语雀文章标题上加一个前缀表示文章状态;
q
q
q
0.13.0-beta.4
module.exports = {
write: {
platform: 'notion',
notion: {
token: process.env.NOTION_TOKEN,
databaseId: process.env.NOTION_DATABASE_ID,
filter: { property: 'status', select: { equals: '已发布' }}
}
},
deploy: {
platform: 'local',
local: {
outputDir: './source/_posts',
filename: 'title',
format: 'markdown',
catalog: false,
frontMatter: {
enable: true,
include: ['categories', 'tags', 'title', 'date', 'updated', 'permalink', 'cover', 'description'],
},
formatExt: './format-image.js',
}
},
image: {
enable: true,
platform: 'local',
local: {
outputDir: './source/images',
prefixKey: '/images'
}
},
}
测试
测试
测试
文档写得真好,加油加油
如图,刚开始下载就出错了,换了多个语雀的仓库也不行。
最新
在notion中删除文章,下一次构建时也能删除网站里的文章。
No response
typora非常好用,可否支持,谢谢!
C:\WorkSpace\elog>elog sync -e .elog.env
环境变量 已指定读取env文件为:C:\WorkSpace\elog.elog.env
全量更新 未获取到缓存,将全量更新文档
正在获取文档列表,请稍等...
node:internal/process/promises:288
triggerUncaughtException(err, true /* fromPromise */);
^
Error: Client network socket disconnected before secure TLS connection was established
at connResetException (node:internal/errors:720:14)
at TLSSocket.onConnectEnd (node:_tls_wrap:1655:19)
at TLSSocket.emit (node:events:529:35)
at endReadableNT (node:internal/streams/readable:1368:12)
at process.processTicksAndRejections (node:internal/process/task_queues:82:21) {
code: 'ECONNRESET',
path: '/api/v2/repos/z*n/ot/toc',
host: 'www.yuque.com',
port: 443,
localAddress: undefined,
name: 'ResponseError',
data: undefined,
status: -1,
headers: {},
res: {
status: -1,
statusCode: -1,
statusMessage: null,
headers: {},
size: 0,
aborted: false,
rt: 244,
keepAliveSocket: false,
data: undefined,
requestUrls: [ 'https://www.yuque.com/api/v2/repos/z*n/ot/toc' ],
timing: null,
remoteAddress: '139.224.214.226',
remotePort: 443,
socketHandledRequests: 1,
socketHandledResponses: 0
}
}
Node.js v18.18.0
docusaurus支持文档和博客两种形式:
https://docusaurus.io/zh-CN/docs/blog
默认情况下我将所有正式文章抓取到本地docs目录, 但同时我希望将某个特定目录内的语雀文章抓取到本地blog目录以发布一些不那么正式的短内容, 比如动态, 照片, 视频等
详情请查看 #72
最佳实践征集,以下条件 3 选 2 即可,正常的我会手动添加到 README,你也可以手动 PR 来添加
No response
astro类似与hexo,可以生成静态化博客网站
https://github.com/satnaing/astro-paper
No response
docusaurus支持在front matter中添加sidebar_position属性来给文章排序:
https://docusaurus.io/zh-CN/docs/sidebar/autogenerated#doc-item-metadata
不加排序的情况下会按照文章首字母自动排序, 在中英文混合的情况下会比较混乱, 希望能够自动生成sidebar_position (甚至是_category_.json) 以匹配语雀的排序
目前我的博客部署环境在K8s中,容器启动时会自动从git下载hexo博客源码,然后使用elog同步语雀文档,然后执行hexo生成内容并部署网站。由于语雀webhook的缺失,导致整个流程的触发是缺失的。因此有以下一个想法:
启动一个后台进程,定时的去使用类似elog check的功能,对比缓存文件检查文档是否有更新,如果有,则重新部署容器完成博客的重新部署。这样,整个环境的搭建和运行就只有K8s和语雀服务,架构上更简洁。
求评估下这个elog check的特性是否可以支持?
通过阮一峰博客看到作者的项目,我在使用语雀的时候也有类似的想法,借助一个成熟的软件实现跨平台数据同步,不过目前只做了语雀的导出。语雀的token权限从一开始的普通用户到专业会员用户再到现在的超级会员才有,虽然我也是深度使用者但觉得他格局越来越小了。
所以我自己开发了一个无需token的导出工具,看作者要不要考虑一下我的思路,同时采用语雀自己的导出操作可以很好的解决#6 这个问题。
已在我的 Telegram 频道推荐。
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.