Skip to main content

A simple, powerful standard for structured content that works beautifully with LLMs, humans, and modern editors

Project description

BlockDoc

A simple, powerful standard for structured content that works beautifully with LLMs, humans, and modern editors.

PyPI version Python versions License: MIT

Why BlockDoc?

BlockDoc provides a lightweight, flexible format for structured content that is:

  • LLM-friendly: Optimized for AI generation and targeted modifications
  • Simple: Flat structure with semantic IDs and minimal nesting
  • Extensible: Core block types with room for custom extensions
  • Framework-agnostic: Works with any frontend or backend technology
  • Database-ready: Easy to store and query in SQL or NoSQL databases

Core Concepts

BlockDoc is based on a block-based architecture where content is organized into discrete, individually addressable blocks. Each block has:

  • A semantic ID (like 'intro', 'section-1')
  • A block type ('text', 'heading', 'image', 'code')
  • Content (in Markdown for text-based blocks)
  • Optional metadata

This architecture enables:

  • Targeted updates to specific sections
  • Better organization of content
  • Easy integration with LLMs
  • Flexible rendering in different formats

Core Block Types

  1. Text - Standard paragraphs with Markdown support
  2. Heading - Section headers with configurable levels
  3. Image - Pictures with src, alt text, and optional caption
  4. Code - Code blocks with syntax highlighting
  5. List - Ordered or unordered lists
  6. Quote - Blockquote content
  7. Embed - Embedded content (videos, social media posts)
  8. Divider - Horizontal rule/separator

Design Principles

  1. Simplicity: Minimal structure with only necessary properties
  2. LLM-Friendly: Optimized for AI content generation and modification
  3. Human-Editable: Clear, readable format for direct editing
  4. Database-Ready: Easily stored in SQL or NoSQL databases
  5. Extensible: Core types with support for custom block types
  6. Semantic: Meaningful IDs for blocks rather than auto-generated IDs
  7. Portable: Framework-agnostic with multiple render targets
{
  "article": {
    "title": "Getting Started with BlockDoc",
    "blocks": [
      {
        "id": "intro",
        "type": "text",
        "content": "BlockDoc makes structured content **simple**."
      },
      {
        "id": "first-steps",
        "type": "heading",
        "level": 2,
        "content": "First Steps"
      },
      {
        "id": "step-one",
        "type": "text",
        "content": "Install BlockDoc using pip: `pip install blockdoc`"
      }
    ]
  }
}

Installation

Install BlockDoc from PyPI:

pip install blockdoc

Usage

from blockdoc import BlockDocDocument, Block

# Create a new document
doc = BlockDocDocument({
    "title": "My First BlockDoc Post",
})

# Add blocks using factory methods
doc.add_block(Block.text("intro", "Welcome to my first post!"))
doc.add_block(Block.heading("section-1", 2, "Getting Started"))
doc.add_block(Block.text("content-1", "This is **formatted** content with [links](https://example.com)."))

# Render to HTML
html = doc.render_to_html()
print(html)

# Render to Markdown
markdown = doc.render_to_markdown()
print(markdown)

# Export to JSON
json_str = doc.to_json()
print(json_str)

Working with LLMs

BlockDoc shines when generating or modifying content with LLMs:

from blockdoc import BlockDocDocument
import openai

# Update a specific section using an LLM
async def update_section(document, block_id, prompt):
    block = document.get_block(block_id)
    
    response = await openai.chat.completions.create(
        model="gpt-4",
        messages=[
            {
                "role": "system",
                "content": f"Update the following content to {prompt}. Return only the updated content."
            },
            {
                "role": "user",
                "content": block["content"],
            },
        ],
    )
    
    document.update_block(block_id, {
        "content": response.choices[0].message.content,
    })
    
    return document

Documentation

Specification

API Reference

Tutorials

Examples

Development

Installation

# Clone the repository
git clone https://github.com/berrydev-ai/blockdoc-python.git
cd blockdoc-python

# Create a virtual environment
python -m venv venv
source venv/bin/activate  # On Windows: venv\Scripts\activate

# Install development dependencies
pip install -e ".[dev]"

Testing

BlockDoc uses pytest for testing. To run the tests:

# Run tests
pytest

# Run tests with coverage report
pytest --cov=blockdoc

# Run a specific test file
pytest tests/core/test_block.py

Contributing

We welcome contributions! See CONTRIBUTING.md for details on how to contribute, including our testing guidelines.

License

MIT

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

blockdoc-1.0.1.tar.gz (57.8 kB view details)

Uploaded Source

Built Distribution

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

blockdoc-1.0.1-py3-none-any.whl (19.2 kB view details)

Uploaded Python 3

File details

Details for the file blockdoc-1.0.1.tar.gz.

File metadata

  • Download URL: blockdoc-1.0.1.tar.gz
  • Upload date:
  • Size: 57.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.8

File hashes

Hashes for blockdoc-1.0.1.tar.gz
Algorithm Hash digest
SHA256 77f67b2dc9179011909f9bf20e5d7d3569393f2b7c61ad6d70494137bfc1a0fb
MD5 f63c0b91070da24724885288caf2c815
BLAKE2b-256 d6b0d045cc292ae30811cffa9dd96e4b4b2febd42a28c3964533db590e221eb0

See more details on using hashes here.

File details

Details for the file blockdoc-1.0.1-py3-none-any.whl.

File metadata

  • Download URL: blockdoc-1.0.1-py3-none-any.whl
  • Upload date:
  • Size: 19.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.8

File hashes

Hashes for blockdoc-1.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 5f5367833622a8b6ca840b241ae8bbb1e424cdd04902ad0e5f5c2cca068d11f9
MD5 3c8a539c2f46758c8fc873d648296ccb
BLAKE2b-256 819072fef824f2cdd74f9056661fb1ed3223e94234ef93d081a4712edaf97d6c

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