A Python library for creating and manipulating ADF (Atlassian Document Format) documents
Project description
ADF Library
Overview
ADF Library is a Python package for creating and manipulating ADF (Atlassian Document Format) documents. It provides a clean, type-safe API for building structured documents with support for headings, paragraphs, tables, and rich text formatting.
Installation
pip install adf_lib
Quick Start
from adf_lib import ADF, Text, Table, Link
from adf_lib.constants.enums import HeadingLevel
# Create a new document
doc = ADF()
# Add a heading
doc.add(Text("My Document").heading(HeadingLevel.H1))
# Add a paragraph with formatting
doc.add(Text("This is a formatted paragraph", "strong", "em").paragraph())
# Export as dictionary
adf_dict = doc.to_dict()
Core Components
Document Structure
The ADF document is composed of various content types organized in a hierarchical structure:
{
"version": 1,
"type": "doc",
"content": [
# Content elements go here
]
}
Content Types
The library supports the following content types:
class ContentType(Enum):
TEXT = "text"
TABLE = "table"
Text Types
Text content can be formatted as:
class TextType(Enum):
HEADING = "heading"
PARAGRAPH = "paragraph"
Detailed API Reference
ADF Class
The main document class that serves as a container for all content.
class ADF:
def __init__(self, version: int = 1, type: str = "doc")
def add(self, content: dict) -> None
def to_dict(self) -> dict
Parameters:
version: Document version (default: 1)type: Document type (default: "doc")
Methods:
add(content): Adds a content element to the documentto_dict(): Converts the document to a dictionary format
Text Class
Handles text content with formatting.
class Text:
def __init__(self, text: str, *marks: Union[str, dict])
def heading(self, level: Union[int, HeadingLevel] = HeadingLevel.H1,
local_id: Optional[str] = None) -> dict
def paragraph(self, local_id: Optional[str] = None) -> dict
Parameters:
text: The text contentmarks: Optional formatting marks
Methods:
heading(): Creates a heading elementparagraph(): Creates a paragraph element
Table Class
Handles table creation and manipulation.
class Table:
def __init__(
self,
width: int,
is_number_column_enabled: bool = False,
layout: Union[str, TableLayout] = TableLayout.CENTER,
display_mode: Union[str, TableDisplayMode] = TableDisplayMode.DEFAULT
)
def header(self, content: List[dict], col_span: int = 1,
row_span: int = 1) -> dict
def cell(self, content: List[dict], col_span: int = 1,
row_span: int = 1) -> dict
def add_row(self, cells: List[dict]) -> None
def to_dict(self) -> dict
Parameters:
width: Table width (percentage)is_number_column_enabled: Enable numbered columnslayout: Table layout styledisplay_mode: Display mode
Methods:
header(): Creates a header cellcell(): Creates a regular celladd_row(): Adds a row to the tableto_dict(): Converts table to dictionary format
Link Class
Handles hyperlinks in the document.
@dataclass
class Link:
href: str
title: Optional[str] = None
collection: Optional[str] = None
id: Optional[str] = None
occurrence_key: Optional[str] = None
Methods:
to_mark(): Converts link to mark format
Text Formatting
The library supports various text formatting options through the MarkType enum:
class MarkType(Enum):
CODE = "code" # Code formatting
EM = "em" # Emphasis (italic)
LINK = "link" # Hyperlink
STRIKE = "strike" # Strikethrough
STRONG = "strong" # Bold
SUBSUP = "subsup" # Subscript/Superscript
UNDERLINE = "underline" # Underline
TEXT_COLOR = "textColor" # Text color
Tables
Tables can be configured with different layouts and display modes:
class TableLayout(Enum):
CENTER = "center"
ALIGN_START = "align-start"
class TableDisplayMode(Enum):
DEFAULT = "default"
FIXED = "fixed"
Examples
Creating a Document with Multiple Elements
from adf_lib import ADF, Text, Table, Link
from adf_lib.constants.enums import HeadingLevel, TableLayout
# Create document
doc = ADF()
# Add heading
doc.add(Text("Project Report").heading(HeadingLevel.H1))
# Add paragraph with formatting
doc.add(Text("Executive Summary", "strong").paragraph())
# Add link
link = Link(href="https://example.com", title="More Info")
doc.add(Text("See details here", link.to_mark()).paragraph())
# Create table
table = Table(
width=100,
is_number_column_enabled=True,
layout=TableLayout.CENTER
)
# Add table header
table.add_row([
table.header([Text("Category").paragraph()]),
table.header([Text("Value").paragraph()])
])
# Add table data
table.add_row([
table.cell([Text("Revenue").paragraph()]),
table.cell([Text("$100,000").paragraph()])
])
# Add table to document
doc.add(table.to_dict())
# Convert to dictionary
result = doc.to_dict()
Advanced Text Formatting
# Multiple formatting marks
doc.add(Text("Important Notice", "strong", "underline").paragraph())
# Colored text
doc.add(Text("Warning", {"type": "textColor", "attrs": {"color": "#FF0000"}}).paragraph())
# Combined formatting
doc.add(Text("Critical Update", "strong", "em", {"type": "textColor", "attrs": {"color": "#FF0000"}}).paragraph())
Error Handling
The library includes custom exceptions for validation:
from adf_lib.exceptions.validation import ValidationError, RequiredFieldError, InvalidMarkError
try:
Text("").paragraph() # Empty text
except RequiredFieldError:
print("Text content is required")
try:
Text("Hello", "invalid_mark").paragraph() # Invalid mark
except InvalidMarkError:
print("Invalid mark type")
Best Practices
-
Document Structure
- Start documents with a heading
- Use appropriate heading levels (H1 -> H6)
- Group related content in sections
-
Text Formatting
- Use semantic formatting (e.g.,
strongfor importance) - Avoid overusing text colors
- Combine marks judiciously
- Use semantic formatting (e.g.,
-
Tables
- Use headers for better structure
- Keep tables simple and readable
- Use appropriate widths for content
-
Error Handling
- Always handle potential exceptions
- Validate user input before creating elements
- Check required fields
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file adf_lib-0.2.1.tar.gz.
File metadata
- Download URL: adf_lib-0.2.1.tar.gz
- Upload date:
- Size: 12.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a719772dfc0fb66d842dad223d36201d436190d413ad39f2d9aa8b2e3a49b73c
|
|
| MD5 |
377d4bb679e3e4ced415eb86e9d0286b
|
|
| BLAKE2b-256 |
1f9414c06fc09138a87781622219485a880b93652772c146c3204d7d87f24535
|
Provenance
The following attestation bundles were made for adf_lib-0.2.1.tar.gz:
Publisher:
ci.yml on Lakmal98/adf-lib
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
adf_lib-0.2.1.tar.gz -
Subject digest:
a719772dfc0fb66d842dad223d36201d436190d413ad39f2d9aa8b2e3a49b73c - Sigstore transparency entry: 166079842
- Sigstore integration time:
-
Permalink:
Lakmal98/adf-lib@852031bcf52d503818df499b14b546c2b3f0cab2 -
Branch / Tag:
refs/tags/v0.2.1 - Owner: https://github.com/Lakmal98
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yml@852031bcf52d503818df499b14b546c2b3f0cab2 -
Trigger Event:
push
-
Statement type:
File details
Details for the file adf_lib-0.2.1-py3-none-any.whl.
File metadata
- Download URL: adf_lib-0.2.1-py3-none-any.whl
- Upload date:
- Size: 10.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cf22c4392a56740fa5f1fbc213692fb24d79f47d87cb6399fe408e374f58e0d6
|
|
| MD5 |
5fea2e15601471c510d5e6712a4ccb16
|
|
| BLAKE2b-256 |
23d2dfad036dd86b4d40c6a10bd002dc970ae85a9570357d4268aadf78b3980f
|
Provenance
The following attestation bundles were made for adf_lib-0.2.1-py3-none-any.whl:
Publisher:
ci.yml on Lakmal98/adf-lib
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
adf_lib-0.2.1-py3-none-any.whl -
Subject digest:
cf22c4392a56740fa5f1fbc213692fb24d79f47d87cb6399fe408e374f58e0d6 - Sigstore transparency entry: 166079843
- Sigstore integration time:
-
Permalink:
Lakmal98/adf-lib@852031bcf52d503818df499b14b546c2b3f0cab2 -
Branch / Tag:
refs/tags/v0.2.1 - Owner: https://github.com/Lakmal98
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yml@852031bcf52d503818df499b14b546c2b3f0cab2 -
Trigger Event:
push
-
Statement type: