# LuminaLP A modern, reliable church presentation software built in Rust that just works. ## Overview LuminaLP is designed to be a superior replacement for OpenLP, focusing on: - **Reliability**: No complex global registries or fragile state management - **Performance**: Fast, efficient Rust backend with minimal overhead - **Simplicity**: Clean KISS/DRY architecture that's easy to debug and maintain - **Church-focused**: Built specifically for church service needs ## Features - **Songs Management**: Add, search, and display song lyrics with CCLI support - **Bible Integration**: Verse lookup and display with multiple translations - **Media Support**: Images, videos, and audio with automatic type detection - **Presentations**: PowerPoint/LibreOffice integration with theme preservation - **Service Planning**: Build and navigate through service items - **Plugin Architecture**: Clean trait-based system without global state ## Architecture ### Core Components - **lumina-core**: Database, app state, and plugin traits - **lumina-songs**: Song lyrics and CCLI management - **lumina-bible**: Bible verse search and display - **lumina-media**: Image/video/audio handling - **lumina-presentations**: PowerPoint/ODP rendering via LibreOffice ### Database - SQLite backend with centralized SQL operations - All schemas defined in `core/src/database.rs` - Plugins use database helpers, no raw SQL in plugins ## Requirements - **Rust**: 1.70+ with Cargo - **LibreOffice**: For presentation rendering (headless mode) - **SQLite**: Embedded database (no external setup required) ## Installation ```bash # Clone the repository git clone ssh://rockvilleav@git.rockvilletollandsda.church:10443/RTSDA/LuminaLP.git cd LuminaLP # Build the project cargo build --release # Run tests cargo test ``` ## Development ### Project Structure ``` ├── core/ # Core app logic and traits │ ├── src/ │ │ ├── lib.rs # App struct and plugin traits │ │ └── database.rs # All SQL operations live here ├── plugins/ │ ├── songs/ # Song lyrics plugin │ ├── bible/ # Bible verses plugin │ ├── media/ # Media files plugin │ └── presentations/ # PowerPoint/ODP plugin ├── tests/ │ └── integration_tests.rs # Real integration tests └── src/ └── main.rs # CLI entry point ``` ### Design Principles 1. **KISS (Keep It Simple, Stupid)** - No complex global registries - Simple trait-based plugin system - Centralized database operations 2. **DRY (Don't Repeat Yourself)** - Shared database helpers - Common plugin patterns - Reusable components 3. **Separation of Concerns** - All SQL in `database.rs` - Plugins focus on business logic - Clear boundaries between components ### Adding New Plugins 1. Create plugin crate in `plugins/` directory 2. Implement the `ContentPlugin` trait 3. Use database helpers for data operations 4. Add integration tests 5. Register plugin in main app ### Testing ```bash # Run all tests cargo test # Run specific plugin tests cargo test --package lumina-songs # Run integration tests only cargo test --test integration_tests ``` ## Presentation Integration LuminaLP uses a sophisticated combo approach for PowerPoint rendering: 1. **HTML Export**: LibreOffice exports slide text content and structure 2. **XHTML Export**: LibreOffice exports complete CSS styling and themes 3. **Smart Combining**: Parser merges text content with beautiful styling This preserves the exact look and feel of original presentations including: - Colors, fonts, and spacing - Theme elements and backgrounds - Animation CSS (where supported) - Layout positioning ### LibreOffice Setup Ensure LibreOffice is installed and accessible via command line: ```bash # Test LibreOffice headless mode libreoffice --headless --version ``` ## License MIT License ## Contributing 1. Follow Rust best practices and `cargo fmt` 2. Add tests for new functionality 3. Keep SQL operations in `database.rs` 4. Maintain KISS/DRY principles 5. No global state or complex registries