Analyze a file format of a song. ## Spec File: ./Test.pro (file ext are always .pro) - every song contains parts (name group here) (here: Verse 1, Verse 2, Chorus, ...) but could be any name - every group contains 1-x slides - every song contains different arrangements (here normal and test2) that defines the existence and the order of the groups - every slide CAN have another textbox which contains a translated version of the first textbox ## Status 1. [x] Analyse the file structure and find all of the described specs. 2. [x] Test and verify if the definition is correct - there is a `all-songs` directory with lot of examples. 3. [x] Describe the structure for future AI prompts to use these files in `spec/pp_song_spec.md` and describe the usage in the `AGENTS.md` (replace obsolete commands) 4. [x] Write a PHP module (is later used in laravel) in `./php` which can parse a song and let get/set every aspect of structure. Use Objects here (Song, Group, Slide, Arrangement, etc) 5. [x] Create a simple PHP cli tool, which receive a param with a song file and show the structure of the song. ## PHP Module Usage The ProPresenter song parser is available as a PHP module in `./php`. Use it to read, parse, and modify .pro song files. ### Reading a Song ```php use ProPresenter\Parser\ProFileReader; use ProPresenter\Parser\ProFileWriter; $song = ProFileReader::read('path/to/song.pro'); ``` ### Accessing Song Structure ```php // Basic song info echo $song->getName(); // Song name echo $song->getUuid(); // Song UUID // Groups (song parts like Verse 1, Chorus, etc.) foreach ($song->getGroups() as $group) { echo $group->getName(); // "Verse 1", "Chorus", etc. $slides = $song->getSlidesForGroup($group); foreach ($slides as $slide) { echo $slide->getPlainText(); if ($slide->hasTranslation()) { echo $slide->getTranslation()->getPlainText(); } } } // Arrangements (different song orderings) foreach ($song->getArrangements() as $arr) { $groups = $song->getGroupsForArrangement($arr); // Groups in arrangement order } ``` ### Modifying and Writing ```php $song->setName("New Name"); ProFileWriter::write($song, 'output.pro'); ``` ## CLI Tool Parse and display song structure from the command line: ```bash php php/bin/parse-song.php path/to/song.pro ``` ## Format Specification For detailed information about the .pro file format, see `spec/pp_song_spec.md`. ## Key Files - `php/src/Song.php` — Top-level song wrapper - `php/src/Group.php` — Group (song part) wrapper - `php/src/Slide.php` — Slide wrapper with text access - `php/src/TextElement.php` — Text element with label + plain text - `php/src/Arrangement.php` — Arrangement wrapper - `php/src/RtfExtractor.php` — RTF to plain text converter - `php/src/ProFileReader.php` — Reads .pro files - `php/src/ProFileWriter.php` — Writes .pro files - `php/bin/parse-song.php` — CLI tool - `spec/pp_song_spec.md` — Format specification