Skip to main content

This repository is build for Bi - directional conversion Notion ⇄ Markdown

Project description

Notion Markdown Converter (Python)

A toolkit to convert Markdown content into Notion API block structures with high-fidelity formatting and block-type mapping.


Project Objective

Develop a Python package that parses Markdown and outputs a list of Notion API-compatible block objects, faithfully preserving:

  • All supported Notion block types (basic, media, advanced, etc.)
  • Rich text formatting (bold, italic, code, links, color, equations)
  • Inline and block equations (LaTeX)
  • Nested structures (lists, toggles, columns, etc.)
  • Annotation context splitting (bold + inline math, code in list items, etc.)

Core Features

1. Markdown to Notion Block Conversion

  • Parse Markdown and generate an ordered list of Notion API blocks (dict format).
  • Preserve structure and nesting as per Markdown input.

2. Rich Text Segmentation

  • Segment text runs by formatting boundary:
    • Bold, italic, underline, code, color
    • Inline equations ($...$)
    • Inline code (`...`)
  • Mixing formats:
    • Example: **States ($S$):** All possible situations...
      • Must become:
        • "States (" (bold)
        • "S" (equation + bold)
        • "):" (bold)
        • " All possible situations..." (normal)

3. Block Type Coverage

Support the following block types (with example input → output mapping):

Basic Blocks

Markdown Example Notion Block Type Notes
Text paragraph
# Heading 1 heading_1
## Heading 2 heading_2
### Heading 3 heading_3
- List item bulleted_list_item
1. List item numbered_list_item

Toggle Blocks

Markdown Example Notion Block Type Notes
<details><summary>Summary</summary>Content</details> or ??? Toggle toggle Toggle heading 1/2/3, Toggle list

Quote / Callout

Markdown Example Notion Block Type Notes
> Quote quote
> [!NOTE] Callout callout Custom icon/color support

Dividers and Tables

Markdown Example Notion Block Type Notes
--- divider
Markdown Table table

Media Blocks

Markdown Example Notion Block Type Notes
![Alt](url) image
[video](url) video
[audio](url) audio
[File](url) file
[Bookmark](url) bookmark Web bookmarks

Code

Markdown Example Notion Block Type Notes
```python ... ``` code Language support, code caption
`inline code` Inline text annotations.code = true

Equations

Markdown Example Notion Block Type Notes
$$ ... $$ equation (block)
$...$ (inline) Inline equation Must be in .text array with context

Columns

Markdown Example Notion Block Type Notes
:::columns ... ::: column_list Nested blocks as column children

Synced, Breadcrumb, Button, Table of Contents, AI Block

  • Allow simple syntax or special markers for:
    • Synced block (:::synced)
    • Breadcrumb (:::breadcrumb)
    • Button ([Button](action))
    • Table of Contents ([TOC])
    • AI Block (:::ai-block)
    • Mermaid code block for diagrams

Rich Text Handling and Edge Cases

  • Split any block into multiple text runs as needed:
    • Example:
      Markdown: **States ($S$):** ...
      Notion:
      [
        {"type": "text", "text": {"content": "States ("}, "annotations": {"bold": true}},
        {"type": "equation", "equation": {"expression": "S"}, "annotations": {"bold": true}},
        {"type": "text", "text": {"content": "):"}, "annotations": {"bold": true}},
        {"type": "text", "text": {"content": " All possible situations..."}, "annotations": {"bold": false}}
      ]
      
  • Handle multiple annotations (bold+italic+code) per segment.
  • Support hyperlinks, mentions (with special markdown syntax or tag).

Nested & Complex Structures

  • Nested lists:
    Markdown’s nested lists → children in Notion block structure
  • Toggle blocks, column blocks, table blocks:
    Parse and create nested children lists as per Notion API.

Examples for Each Block

Paragraph with Mixed Content

Markdown:

  • States ($S$): All possible situations… Output:
  • bulleted_list_item with 4 text segments, including inline equation.

Heading with Inline Equation

Markdown: Policy ($\pi$) Output:

  • heading_2 with rich text: "Policy (", equation "\\pi", ")"

Code Block

Markdown: python print("Hello") Output:

  • code block, language = python, content = print("Hello")

Image

Markdown: Alt Output:

  • image block with external URL

Table

Markdown: | A | B | |---|---| | 1 | 2 | Output:

  • table block, rows/columns parsed accordingly

Inline Code

Markdown: Here is inline code. Output:

  • paragraph with text run (normal), text run (code), text run (normal)

Advanced Features

  • Customizable mapping:
    Allow user to define/extend block type mapping or handle unknown blocks gracefully.
  • Extensible:
    Support for new Notion block types as Notion updates API.

Non-Goals

  • Does not attempt to round-trip Notion → Markdown (unless explicitly developed for this).
  • Does not handle Notion database pages (just blocks/pages for content).

Summary

This package should serve as a high-fidelity Markdown-to-Notion converter with fine-grained control over rich text and block types, designed for programmatic page building via the Notion API. All text formatting, equations, code, lists, tables, and advanced block types (AI, Mermaid, columns, etc.) are supported.


Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ledu-0.1.1.tar.gz (3.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ledu-0.1.1-py3-none-any.whl (4.1 kB view details)

Uploaded Python 3

File details

Details for the file ledu-0.1.1.tar.gz.

File metadata

  • Download URL: ledu-0.1.1.tar.gz
  • Upload date:
  • Size: 3.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.4 CPython/3.12.7 Darwin/23.6.0

File hashes

Hashes for ledu-0.1.1.tar.gz
Algorithm Hash digest
SHA256 1c87e48963c7ab78f86e63097aacbdf60713661c03cc32082264f90ee57f2537
MD5 f5709be0aa3390c3e8a4297521333e78
BLAKE2b-256 37a8387a6bd7bf92f047e22bf3e8629a2f34cbb9e04194a3e9d1f929b4f8799d

See more details on using hashes here.

File details

Details for the file ledu-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: ledu-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 4.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.4 CPython/3.12.7 Darwin/23.6.0

File hashes

Hashes for ledu-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 9fe4bcae5e918b58ababa118345f195e4d00410d5a2285cd53245974d76ba84a
MD5 7fac4385435a3282036ee4eccddae15e
BLAKE2b-256 62fddf13e70b3154219e99c2567a1e1dc9cba162d87de9a27776443dd80f500c

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page