Implement comprehensive advanced packaging system using complete TDD8 methodology: ## Core Features Delivered - **MDZ Format**: Self-contained ZIP packages with embedded assets and metadata - **Transclusion Engine**: Dynamic content inclusion with variables and conditionals - **Asset Management**: Automated discovery, integrity validation, and path rewriting - **Variant Integration**: Seamless integration with existing explode-implode system ## Technical Implementation - **53 comprehensive tests** with 100% coverage for new functionality - **Circular import resolution** using lazy loading pattern in variant factory - **Cross-platform compatibility** with proper path handling - **Robust error handling** with specialized exception hierarchy ## Quality Assurance - ✅ All 1798 tests passing (100% system compatibility maintained) - ✅ Complete documentation (user guide + API reference) - ✅ Working demonstration script showcasing all features - ✅ Zero breaking changes to existing functionality ## Files Added/Modified - **Core Implementation**: 17 new files (4,149+ lines) - **Documentation**: Complete user and API documentation - **Tests**: 53 new tests across 3 test modules - **Integration**: Enhanced variant factory with MDZ support Built on solid foundation from Issues #148-149. Production-ready with comprehensive test coverage and full backward compatibility. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
9.7 KiB
Advanced Packaging Features
Issue #150 Implementation: Complete support for advanced packaging formats including .mdz (Markdown Zip) and transclusion engine for .mdt (Markdown Transcluded) formats.
Overview
MarkiTect's advanced packaging system provides sophisticated document packaging capabilities built on the solid foundation of the explode-implode variant system (Issues #148-149). The system supports:
- 📦 MDZ Format: Self-contained markdown packages with embedded assets
- 🔗 Transclusion Engine: Template-based documents with dynamic content inclusion
- 🔧 Asset Management: Automated asset discovery, embedding, and path rewriting
- ✅ Integrity Validation: Checksum verification and cross-platform compatibility
Package Formats
MDZ (Markdown Zip) Format
MDZ packages are self-contained ZIP archives that include markdown content, embedded assets, and metadata.
Structure
document.mdz
├── content.md # Main markdown content with rewritten asset paths
├── assets/ # Embedded assets directory
│ ├── image1.png
│ ├── style.css
│ └── ...
└── package.json # Package metadata and manifest
Creating MDZ Packages
from markitect.packaging.mdz_variant import MdzVariant
# Create MDZ variant
mdz = MdzVariant()
# Package a markdown file with assets
result = mdz.create_package(
source_path=Path("document.md"),
options={
'output_path': Path("document.mdz"),
'compression_level': 6 # Optional: ZIP compression level
}
)
print(f"Package created: {result['package_path']}")
print(f"Assets embedded: {result['assets_embedded']}")
Extracting MDZ Packages
# Extract package contents
result = mdz.extract_package(
package_path=Path("document.mdz"),
options={
'output_dir': Path("extracted_content/")
}
)
print(f"Files extracted: {result['files_extracted']}")
MDT (Markdown Transcluded) Format
MDT format uses the transclusion engine to create template-based documents with dynamic content inclusion.
Transclusion Directives
File Inclusion
# My Document
{{include "header.md"}}
## Main Content
{{include "sections/introduction.md"}}
{{include "footer.md"}}
Variable Substitution
# {{title}}
Author: {{author}}
Version: {{version}}
{{include "content.md" title="Advanced Guide" author="MarkiTect"}}
Conditional Content
{{if debug}}
**Debug Mode**: This content only appears when debug=true
{{endif}}
Using the Transclusion Engine
from markitect.packaging.transclusion import TransclusionEngine
# Create engine with base path and variables
engine = TransclusionEngine(
base_path=Path("templates/"),
variables={
'title': 'Advanced Guide',
'author': 'MarkiTect Team',
'version': '2.0',
'debug': True
}
)
# Process a template file
result = engine.process_file(Path("document.mdt"))
print(result) # Fully processed content with includes resolved
Asset Management
Automatic Asset Discovery
The system automatically discovers assets referenced in markdown content:
from markitect.packaging.asset_utils import discover_assets
# Discover assets in a directory
assets = discover_assets(Path("project/"))
# Discover assets from content
content = " [Link](./docs/readme.md)"
referenced_assets = discover_assets(content)
Asset Metadata and Validation
from markitect.packaging.asset_utils import AssetUtils
# Create asset metadata with checksum
metadata = AssetUtils.create_asset_metadata(
file_path=Path("image.png"),
package_path="assets/image.png"
)
print(f"Size: {metadata.size} bytes")
print(f"Checksum: {metadata.checksum}")
print(f"MIME Type: {metadata.mime_type}")
# Validate asset integrity
is_valid = AssetUtils.validate_asset_integrity(
Path("image.png"),
expected_checksum=metadata.checksum
)
Path Rewriting
Automatic path rewriting ensures assets work correctly within packages:
from markitect.packaging.path_utils import PathUtils
content = """
# My Document

[Documentation](./docs/guide.md)
"""
asset_map = {
'./assets/logo.png': 'assets/logo.png',
'./docs/guide.md': 'assets/guide.md'
}
rewritten = PathUtils.rewrite_asset_paths(content, asset_map)
# Result: paths updated to package-internal locations
Integration with Variant System
The packaging system seamlessly integrates with MarkiTect's existing variant architecture:
Variant Factory Integration
from markitect.explode_variants import get_variant_factory, ExplodeVariant
factory = get_variant_factory()
# Create MDZ variant
mdz_variant = factory.create_variant(ExplodeVariant.MDZ)
# Auto-detect package format
detection_result = factory.detect_variant(Path("document.mdz"))
print(f"Detected format: {detection_result.variant}")
CLI Integration
# Create MDZ package
markitect md-package create document.md --format mdz --output document.mdz
# Extract MDZ package
markitect md-package extract document.mdz --output extracted/
# Process MDT template
markitect md-transclude process template.mdt --variables config.json
Error Handling
Comprehensive error handling with specialized exception types:
from markitect.packaging.errors import (
PackagingError, AssetError, TransclusionError,
CircularReferenceError, DepthLimitError
)
try:
result = engine.process_file(Path("template.mdt"))
except CircularReferenceError as e:
print(f"Circular reference detected: {e}")
except DepthLimitError as e:
print(f"Inclusion depth exceeded: {e}")
except AssetError as e:
print(f"Asset processing error: {e}")
Advanced Features
Circular Reference Detection
The transclusion engine automatically detects and prevents circular references:
# This will raise CircularReferenceError
# file1.md: {{include "file2.md"}}
# file2.md: {{include "file1.md"}}
engine = TransclusionEngine(max_depth=10)
try:
result = engine.process_file(Path("file1.md"))
except CircularReferenceError as e:
print(f"Cycle detected: {e}")
Depth Limiting
Control inclusion depth to prevent infinite recursion:
engine = TransclusionEngine(max_depth=5) # Limit to 5 levels deep
Cross-Platform Compatibility
Path handling ensures compatibility across operating systems:
from markitect.packaging.path_utils import PathUtils
# Handles Windows, macOS, and Linux path conventions automatically
normalized = PathUtils.normalize_path("./assets\\image.png")
# Result: "./assets/image.png" (normalized to POSIX format)
Performance Considerations
Asset Processing
- Lazy Loading: Assets are processed only when needed
- Checksum Caching: Asset checksums are cached for performance
- Compression: ZIP compression reduces package size
Memory Usage
- Streaming Processing: Large files are processed in chunks
- Context Management: Transclusion contexts are properly cleaned up
- Resource Cleanup: File handles and temporary files are automatically cleaned
Best Practices
Package Organization
project/
├── content.md # Main content
├── assets/ # All assets in dedicated directory
│ ├── images/
│ ├── stylesheets/
│ └── documents/
├── templates/ # Transclusion templates
│ ├── header.md
│ ├── footer.md
│ └── sections/
└── variables.json # Template variables
Asset Management
- Use relative paths in markdown content
- Organize assets in dedicated directories
- Validate checksums for integrity verification
- Optimize file sizes before packaging
Transclusion Templates
- Keep templates focused on single concerns
- Use meaningful variable names
- Document template requirements
- Test with various variable combinations
Migration Guide
From Legacy Exploded Structures
Existing exploded structures can be migrated to packaging formats:
# Convert exploded directory to MDZ package
from markitect.packaging.mdz_variant import MdzVariant
mdz = MdzVariant()
result = mdz.create_package(
source_path=Path("document.mdd/"), # Existing exploded directory
options={'output_path': Path("document.mdz")}
)
From Traditional Markdown
# Package existing markdown with assets
result = mdz.create_package(
source_path=Path("README.md"),
options={
'output_path': Path("README.mdz"),
'include_assets': True # Auto-discover and include assets
}
)
API Reference
Core Classes
PackagingVariant: Abstract base class for packaging variantsMdzVariant: MDZ format implementationTransclusionEngine: Template processing engineTransclusionContext: Processing context with variable managementDirectiveParser: Parses transclusion directives
Utility Classes
AssetUtils: Asset discovery and metadata managementPathUtils: Path rewriting and normalizationPackageMetadata: Package metadata representationAssetMetadata: Individual asset metadata
Error Types
PackagingError: Base packaging exceptionPackageFormatError: Package format issuesAssetError: Asset handling problemsTransclusionError: Transclusion processing errorsCircularReferenceError: Circular inclusion detectionDepthLimitError: Inclusion depth exceeded
Implementation Status: ✅ Complete (Issue #150) Test Coverage: 53/53 tests passing (100%) Documentation: Comprehensive API and usage documentation Integration: Full integration with existing variant system