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.

npm version python version Build Status Coverage Status Documentation Status 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 npm: `npm 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

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.0.tar.gz (21.7 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.0-py3-none-any.whl (19.2 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: blockdoc-1.0.0.tar.gz
  • Upload date:
  • Size: 21.7 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.0.tar.gz
Algorithm Hash digest
SHA256 c432fb9ad7f88f181895d560a037a2cf55878bedd845603735737c2108d7a600
MD5 5f4a28b4b2d1b2f88fee4fb128762e1c
BLAKE2b-256 8b959585715882afe864e138b9ed6493be253fcab6b4e6b2006ab5c7fd7a2120

See more details on using hashes here.

File details

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

File metadata

  • Download URL: blockdoc-1.0.0-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.0-py3-none-any.whl
Algorithm Hash digest
SHA256 7c2a8a9d4d7f5a244bbc1ecd02aab474fe20edf7804f9e8dbe414a274ade5fdb
MD5 f2259b561725b53503f047fd60045cfc
BLAKE2b-256 a77a55a05b9b92fdb899b4aaee3a48b16e7c016568fd2b30dcb913ba60ca0fda

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