lindesbs / supersonic-bundle
Symfony Bundle zur programmatischen Erstellung von ODT-Dokumenten gemäß OASIS OpenDocument 1.2 Spezifikation
Installs: 1
Dependents: 0
Suggesters: 0
Security: 0
Type:symfony-bundle
pkg:composer/lindesbs/supersonic-bundle
Requires
- php: >=8.4
- ext-xmlwriter: *
- ext-zip: *
- league/commonmark: ^2.4
- symfony/console: ^6.0|^7.0|^8.0
- symfony/framework-bundle: ^6.0|^7.0|^8.0
- symfony/yaml: ^6.0|^7.0|^8.0
Requires (Dev)
- phpunit/phpunit: ^10.0|^11.0
- rector/rector: ^1.0
- symplify/easy-coding-standard: ^12.0
This package is auto-updated.
Last update: 2025-12-07 16:44:52 UTC
README
Ein Symfony-Bundle zur programmatischen Erstellung von ODT-Dokumenten gemäß OASIS OpenDocument 1.2 Spezifikation.
Vollständig ODF 1.2-konform - Erzeugt gültige ODT-Dateien, die von LibreOffice, OpenOffice und allen ODF-kompatiblen Anwendungen korrekt geöffnet und bearbeitet werden können.
🚀 Features
- ✅ ODF 1.2 konforme ODT-Dokumente - Vollständig kompatibel mit LibreOffice, OpenOffice und anderen ODF-Anwendungen
- ✅ Einfache API - Intuitive PHP-Objekte für Dokumentenstruktur
- ✅ YAML-zu-ODT Mapper - Konvertierung von YAML-Dateien in ODT-Dokumente
- ✅ Markdown-Unterstützung - CommonMark-Integration für Text-Formatierung
- ✅ Vollständige Test-Abdeckung - 126+ Tests, 346+ Assertions
- ✅ Symfony-Integration - Native Bundle-Integration mit Dependency Injection
- ✅ Code-Qualität - PHPStan Static Analysis und PHP-CS-Fixer konfiguriert
- ✅ Konfigurierbar - Bundle-Konfiguration über
config/packages/supersonic.yaml - ✅ Exception-Hierarchie - Strukturierte Custom Exceptions für besseres Error-Handling
- ✅ Logging-Integration - Optionales Logging für kritische Operationen
- ✅ Validierung - Umfassende Eingabeparameter-Validierung
🎯 Schnellstart
Einfaches Dokument erstellen
use Lindesbs\Supersonic\Odf\Model\Document;
use Lindesbs\Supersonic\Odf\Model\Meta;
use Lindesbs\Supersonic\Odf\Service\OdtGeneratorInterface;
class MyService
{
public function __construct(
private readonly OdtGeneratorInterface $odtGenerator
) {}
public function createDocument(): void
{
$meta = new Meta();
$meta->setTitle('Mein Dokument');
$meta->setCreator('Mein Name');
$document = new Document($meta);
$document->addHeading('Überschrift', 1);
$document->addParagraph('Dies ist ein Absatz.');
$this->odtGenerator->generate($document, '/path/to/output.odt');
}
}
YAML zu ODT konvertieren
php bin/console odt:from-yaml document.yaml --output=document.odt
Markdown-Formatierung
Das Bundle unterstützt Markdown-Formatierung in YAML-Paragraphs:
body:
- type: paragraph
text: "Dieser Text enthält **fett** und *kursiv* Formatierung."
Unterstützte Markdown-Features:
**text**oder__text__→ Fett*text*oder_text_→ Kursiv`code`→ Code (als normaler Text)- Verschachtelte Formatierungen werden unterstützt
📚 Verwendung
Dokument-Struktur
Überschriften
$document->addHeading('Hauptüberschrift', 1);
$document->addHeading('Unterüberschrift', 2);
Absätze mit Formatierung
$paragraph = $document->addParagraph('');
$paragraph->addText('Normaler Text, ');
$paragraph->addText('fetter Text', true);
$paragraph->addText(' und ');
$paragraph->addText('kursiver Text', false, true);
Listen
// Ungeordnete Liste
$list = $document->addList(false);
$list->addItem('Punkt 1');
$list->addItem('Punkt 2');
// Nummerierte Liste
$orderedList = $document->addList(true);
$orderedList->addItem('Schritt 1');
$orderedList->addItem('Schritt 2');
Tabellen
$table = $document->addTable();
$table->addRow(['Header 1', 'Header 2']);
$table->addRow(['Daten 1', 'Daten 2']);
// Mit Spalten-Spanning
$row = $table->addRow();
$cell = $row->addCell('Überschrift über 2 Spalten');
$cell->setColumnSpan(2);
YAML-Format
meta:
title: Dokument-Titel
creator: Autor-Name
date: 2024-12-07 10:00:00
body:
- type: heading
text: Überschrift
level: 1
- type: paragraph
text: Absatz-Text
- type: list
ordered: false
items:
- Punkt 1
- Punkt 2
- type: paragraph
text: "Markdown: **fett**, *kursiv*, `code`"
🧪 Tests
# Alle Tests ausführen
php vendor/bin/phpunit entwicklung/supersonic/tests/
# Mit Testdox-Output
php vendor/bin/phpunit entwicklung/supersonic/tests/ --testdox
Test-Statistik:
- 103+ Tests
- 284+ Assertions
- Alle Tests erfolgreich ✅
📖 Beispiele
Das Bundle enthält umfassende Beispiele im examples/ Verzeichnis:
01-basic-document.php- Einfaches Dokument02-formatted-text.php- Text-Formatierung03-lists.php- Listen (geordnet/ungeordnet)04-complete-document.php- Vollständiges Beispiel05-yaml-to-odt.php- YAML-Konvertierung06-tables.php- Tabellen
cd examples
php 01-basic-document.php
⚙️ Konfiguration
# config/packages/supersonic.yaml
supersonic:
output_dir: '%kernel.project_dir%/var/output'
default_creator: 'Meine Anwendung'
default_title_prefix: 'Dokument: '
markdown_enabled: true
🏗️ Architektur
Model-Layer (Value Objects)
Document- Root-ContainerMeta- MetadatenParagraph,Heading,TextRun- Text-ElementeOdfList,ListItem- ListenTable,TableRow,TableCell- Tabellen
Writer-Layer
ContentXmlWriter- Erzeugtcontent.xmlmit ODF 1.2 ElementenStylesXmlWriter- Erzeugtstyles.xmlmit Style-DefinitionenMetaXmlWriter- Erzeugtmeta.xmlmit Dublin Core MetadatenSettingsXmlWriter- Erzeugtsettings.xmlmit Dokument-EinstellungenManifestXmlWriter- ErzeugtMETA-INF/manifest.xmlmit Paket-Manifest
Alle Writer verwenden die korrekten OASIS OpenDocument 1.2 Namespaces:
urn:oasis:names:tc:opendocument:xmlns:office:1.0urn:oasis:names:tc:opendocument:xmlns:text:1.0urn:oasis:names:tc:opendocument:xmlns:style:1.0urn:oasis:names:tc:opendocument:xmlns:table:1.0urn:oasis:names:tc:opendocument:xmlns:manifest:1.0urn:oasis:names:tc:opendocument:xmlns:meta:1.0http://purl.org/dc/elements/1.1/(Dublin Core)
Service-Layer
OdtGenerator- Orchestriert die ODT-GenerierungYamlDocumentMapper- YAML-zu-Document KonvertierungOdtPackageBuilder- Erstellt das ODT-ZIP-Paket
📋 OASIS OpenDocument 1.2 Konformität
Das Bundle erzeugt vollständig ODF 1.2-konforme Dokumente gemäß der OASIS OpenDocument 1.2 Spezifikation.
Paket-Format (ODF 1.2 Part 3)
- ✅ mimetype als erste Datei im ZIP, unkomprimiert (STORED)
- ✅ Korrekter MIME-Type:
application/vnd.oasis.opendocument.text - ✅ META-INF/manifest.xml mit
manifest:version="1.2" - ✅ Gültige ZIP-Struktur nach OASIS-Spezifikation
XML-Struktur (ODF 1.2 Part 1)
- ✅ Alle Root-Elemente mit
office:version="1.2":office:document-contentoffice:document-stylesoffice:document-metaoffice:document-settings
- ✅ Korrekte Namespace-Deklarationen (OASIS URNs)
- ✅ Vollständige Dublin Core Metadaten
Unterstützte ODF-Elemente
Text-Elemente:
text:p- Absätzetext:h- Überschriften (H1-H6) mittext:outline-leveltext:span- Formatierte Text-Runs (Bold, Italic)
Listen:
text:list/text:list-item- Geordnete und ungeordnete Listen- Verschachtelte Listen unterstützt
Tabellen:
table:table/table:table-row/table:table-cell- Spalten- und Zeilen-Spanning (
table:number-columns-spanned,table:number-rows-spanned)
Styles:
office:automatic-styles- Automatisch generierte Text-Stylesoffice:styles- Dokument-Styles (Default, Heading)- XSL-FO kompatible Formatierungseigenschaften
Metadaten:
dc:title- Dokumenttiteldc:creator- Autor/Erstellermeta:creation-date- Erstellungsdatum (ISO 8601)
Validierung
Die generierten ODT-Dateien wurden erfolgreich getestet mit:
- ✅ LibreOffice (öffnet und bearbeitet korrekt)
- ✅ OpenOffice (kompatibel)
- ✅ Anderen ODF-kompatiblen Anwendungen
Referenzen:
- OASIS OpenDocument 1.2 Part 1: Schema
- OASIS OpenDocument 1.2 Part 3: Packages
- Offizielle OASIS-Seite
🔧 Entwicklung
Dieses Bundle wurde mithilfe von Cursor entwickelt und basiert vollständig auf dem OASIS OpenDocument 1.2 Standard.
Voraussetzungen
- PHP >= 8.1 (mindestens), PHP 8.4 empfohlen
- Symfony >= 6.0 (mindestens), Symfony 8.0 empfohlen
- Composer
Code-Qualität
Das Bundle verwendet verschiedene Tools zur Sicherstellung der Code-Qualität. Alle Commands sind als Composer-Scripts verfügbar:
ECS (Easy Coding Standard)
# Code-Style automatisch korrigieren
composer ecs-fix
# Code-Style prüfen (ohne Änderungen)
composer ecs-check
Rector
# Refactoring-Vorschläge anzeigen (Dry-Run)
composer rector
# Refactoring anwenden
composer rector-fix
PHP-CS-Fixer (Legacy)
# Code-Style automatisch korrigieren (Legacy)
composer cs-fix
# Code-Style prüfen (ohne Änderungen) (Legacy)
composer cs-check
PHPStan
# Static Analysis ausführen
composer phpstan
Tests
# Alle Tests ausführen
composer test
# Tests mit Coverage (benötigt Xdebug/PCOV)
composer test-coverage
Alle Quality-Checks
# Führt ECS, PHPStan und Tests aus
composer qa
Composer-Scripts
Das Bundle enthält folgende Composer-Scripts:
composer test- Führt Tests auscomposer test-coverage- Führt Tests mit Coverage auscomposer ecs-fix- Fixiert Code-Style mit ECScomposer ecs-check- Prüft Code-Style mit ECScomposer rector- Zeigt Refactoring-Vorschläge (Dry-Run)composer rector-fix- Wendet Refactoring ancomposer phpstan- Führt PHPStan Static Analysis auscomposer cs-fix- Fixiert Code-Style mit PHP-CS-Fixer (Legacy)composer cs-check- Prüft Code-Style mit PHP-CS-Fixer (Legacy)composer qa- Führt alle Quality-Checks aus (ECS, PHPStan, Tests)
Projekt-Struktur
src/
├── Odf/
│ ├── Model/ # Value Objects
│ ├── Writer/ # XML-Writer
│ ├── Package/ # ZIP-Builder
│ └── Service/ # Services
├── Command/ # Console Commands
├── DependencyInjection/ # Bundle-Konfiguration
├── Resources/ # Bundle-Ressourcen
└── SupersonicBundle.php # Bundle-Klasse
🔧 Error-Handling und Logging
Exception-Hierarchie
Das Bundle verwendet eine strukturierte Exception-Hierarchie für besseres Error-Handling:
SupersonicException (Basis-Exception)
├── OdtGenerationException // Fehler bei ODT-Generierung
├── InvalidDocumentException // Ungültige Dokument-Daten
├── YamlMappingException // Fehler bei YAML-zu-Document Konvertierung
├── PackageBuilderException // Fehler bei ZIP-Paket-Erstellung
└── ValidationException // Validierungsfehler
Verwendung:
use Lindesbs\Supersonic\Exception\OdtGenerationException;
use Lindesbs\Supersonic\Exception\ValidationException;
use Lindesbs\Supersonic\Odf\Service\OdtGeneratorInterface;
try {
$odtGenerator->generate($document, '/path/to/output.odt');
} catch (ValidationException $e) {
// Validierungsfehler (z.B. ungültiger Pfad)
echo "Validierungsfehler: " . $e->getMessage();
} catch (OdtGenerationException $e) {
// Fehler bei der ODT-Generierung
echo "Generierungsfehler: " . $e->getMessage();
}
Logging
Das Bundle unterstützt optionales Logging über LoggerInterface (PSR-3). Wenn ein Logger im Service-Container verfügbar ist, wird er automatisch injiziert:
use Psr\Log\LoggerInterface;
class MyService
{
public function __construct(
private readonly OdtGeneratorInterface $odtGenerator,
private readonly LoggerInterface $logger
) {}
public function createDocument(): void
{
// Logger wird automatisch von OdtGenerator verwendet
$this->odtGenerator->generate($document, '/path/to/output.odt');
}
}
Geloggte Operationen:
- ODT-Generierung (Start, Erfolg, Fehler)
- YAML-zu-Document Konvertierung
- ZIP-Paket-Erstellung
- Validierungsfehler
Log-Level:
info: Erfolgreiche Operationendebug: Detaillierte Schritte während der Generierungerror: Fehler bei kritischen Operationen
Validierung
Das Bundle validiert automatisch Eingabeparameter:
- OdtGenerator: Prüft, ob
targetPathgültig ist und das Verzeichnis beschreibbar ist - YamlDocumentMapper: Prüft, ob Markdown-Converter vorhanden ist, wenn Markdown aktiviert ist
- OdtPackageBuilder: Prüft ZIP-Archive-Fehler und gibt aussagekräftige Fehlermeldungen
📝 Lizenz
MIT License - siehe LICENSE Datei für Details.
📞 Support
Bei Fragen oder Problemen erstellen Sie bitte ein Issue im Repository.
Version: 0.5.0
Letzte Aktualisierung: 2025-12-06