Notion Down, python tools that convert Notion blog pages into Markdown files, along with integration to build static webpages such as Hexo. Its inspiration and goal is to avoid separation of writing by keep writing drafts or posts within notion.so and then publish them into MD webpages automatically.
- Notion Down
- Examples
- Features
- Hot It Works
- Basic usage
- Advanced usage
- Getting Started
- Prepare
- Run NotionDown
- CI Build Script
- Showcase Jobs
- UnitTest Examples
kaedea.com
hexo.kaedea.com
基于 Notion 的笔记写作和博客分享自动化方案
What can NotionDown do now:
- Notion pages to MarkDown files
Basic Notion PageBlocks parsingNotion images refer & downloadNotion nested list blocksNotion obfuscated-links parsingNotion table block (Collection)- Notion subpage / alias link parsing
- Advanced Notion PageBlocks support
Pullquote Blocks (Notion ColumnList)- Image source replacing
Replace notion image url with image file- Replace notion image url with other CDN urls
- Notion page embed blocks
- Writing optimized integration
Noton customShortCode
blocks that control parametered MD files generatingMixed CN-EN text separation format(by pangu)Spelling inspect(by pycorrector)
- HEXO Integration
HEXO page properties configHEXO generate- HEXO tags plugin
- PyPI Publish
- Notion APIs
notion-py (3rd party)- notion-sdk (official)
NotionDown read Notion pages data using notion-py, and then write pages into MD files.
notion-down >> Notion APIs (notion-py) >> Notion pages data >> generating MD files
WebHook >> notion-down >> Notion APIs (notion-py) >> Notion pages data >> generating MD files >> Copy into Hexo source >> generating webpages >> push to GitHub pages
To get started with NotionDown, you should:
- Prepare your Notion username(email) and password, or directly use
notion_token_v2
. - Prepare
public notion blog_url
as root post for NotionDown to get the pages you want to handle. - Run
notion-down/main.py
with your configs.
Check here to get notion_token_v2
.
Duplicate NotionDown Posts Template to your own notion and take it as blog_url
(or you can just use your existing blog post url). Note that, for now the root page should be public as well as placed in root path of notion workspace.
Basically just run notion-down/main.py
:
# Run with cli cmd
PYTHONPATH=./ python main.py \
--blog_url <Notion Post Url> \
--token_v2 <token_v2>
--username <username> # Only when token_v2 is not presented
--password <password> # Only when token_v2 is not presented
# or
PYTHONPATH=./ python main.py \
--config_file '.config_file.json'
# Your can configure notion-down args by cli-args, config_file or SysEnv parameters
# Priority: cli args > config_file > SysEnv parameters > NotionDown default
For custom configurations in details, see Custom Configurations.
Also check the following procedures as showcase usages for NotionDown.
See building script at /.circleci/config.yaml
.
test-build-readme
: CircleCI jobs generating README for this repo.test-build-hexo
: CircleCI jobs generating Hexo posts for https://github.com/kaedea/notion-down-hexo-showcase.test-run-pycorrector
: CircleCI jobs that executing spelling check for the test posts.
See the usage showcase jobs at /jobs, and jobs outputs at /dist.
- README generating
- Notion sample post generating
- HEXO public generating
- Notion image page source replacing (WIP)
See unittest cases at test/
.
This page is generated by notion-down from notion.so NotionDown-README.