]> git.localhorst.tv Git - alttp.git/commitdiff
partial cms guide interpretation
authorDaniel Karbach <daniel.karbach@localhorst.tv>
Tue, 4 Nov 2025 15:22:18 +0000 (16:22 +0100)
committerDaniel Karbach <daniel.karbach@localhorst.tv>
Tue, 4 Nov 2025 15:22:18 +0000 (16:22 +0100)
app/Console/Commands/SyncMfnsMap.php

index a39efb668f49ece1918553924e6c3402f31d9a42..554e0ece1a1e92c8404d1639b2100764d764a728 100644 (file)
@@ -6,6 +6,8 @@ use App\Models\Technique;
 use App\Models\TechniqueMap;
 use Illuminate\Console\Command;
 use Illuminate\Support\Facades\Http;
+use Illuminate\Support\Facades\Storage;
+use Illuminate\Support\Str;
 
 class SyncMfnsMap extends Command {
 
@@ -43,6 +45,7 @@ class SyncMfnsMap extends Command {
                        $tech->ext_id = $ext_id;
                        $tech->attribution = 'Imported from Muffins Glitch Maps';
                        $tech->halt_sync = false;
+                       $tech->name = Str::slug($entry['Title'], '-');
                }
                if ($tech->halt_sync) {
                        return;
@@ -74,11 +77,53 @@ class SyncMfnsMap extends Command {
        protected function convertGuide($guide): string {
                $html = '';
                foreach ($guide as $part) {
-                       $html .= '<p>'.$part['type'].'</p>'."\n";
+                       $html .= $this->partToString($part)."\n";
                }
                return $html;
        }
 
+       protected function partToString($part): string {
+               switch ($part['type']) {
+                       case 'heading':
+                               $l = isset($part['level']) ? $part['level'] : '3';
+                               return '<h'.$l.'>'.$this->childrenToString($part).'</h'.$l.'>';
+                       case 'image':
+                               $url = $this->storeImage($part['image']);
+                               return '<img src="'.htmlspecialchars($url)
+                                       .'" alt="'.htmlspecialchars($part['image']['alternativeText'])
+                                       .'">';
+                       case 'link':
+                               return '<a href="'.htmlspecialchars($part['url']).'">'.$this->childrenToString($part).'</a>';
+                       case 'paragraph':
+                               return '<p>'.$this->childrenToString($part).'</p>';
+                       case 'text':
+                               return isset($part['text']) ? htmlspecialchars($part['text']) : '';
+                       default:
+                               $this->line('unknown part type '.$part['type']);
+                               return '';
+               }
+       }
+
+       protected function childrenToString($part): string {
+               $str = '';
+               if (isset($part['children'])) {
+                       foreach ($part['children'] as $child) {
+                               $str .= $this->partToString($child);
+                       }
+               }
+               return $str;
+       }
+
+       protected function storeImage($image): string {
+               $disk = Storage::disk('media');
+               $path = 'alttp/mfns/'.$image['hash'].$image['ext'];
+               if (!$disk->exists($path)) {
+                       $rsp = Http::get($image['url']);
+                       $disk->put($path, $rsp->body());
+               }
+               return $disk->url($path);
+       }
+
        protected function syncMap($entry, TechniqueMap $map): void {
                $tile_x = 0;
                $tile_y = 0;