' . "\n"; } // Preload imports foreach ($chunk['imports'] ?? [] as $importKey) { $imp = $manifest[$importKey] ?? null; if ($imp) { echo '' . "\n"; } } // Main entry echo '' . "\n"; } // Dev fallback: keine Manifest-Datei → direkte TS-Referenz (Vite Dev Server) } /** Session-Kontext als JS-Variable injizieren */ function injectSessionContext(): void { $ctx = [ 'sessionId' => Session::studentId(), 'teacherId' => Session::teacherId(), 'baseUrl' => BASE_URL, 'basePath' => BASE_PATH, ]; echo '' . "\n"; } /** * Plattform-Live-Client in eine Sim-Render-HTML einfügen. * * Stellt sicher, dass `window.__GGS__` mit `sessionId`, `simId`, `baseUrl`, * `basePath`, `apiUrl` belegt ist (Sim-eigene Werte gewinnen) und lädt * danach `assets/js/live-client.js`. Der Live-Client kümmert sich dann um * Heartbeat / Pause-Polling / Spectator-Mode. * * In jedem Sim-Wrapper kurz vor `echo $html` aufrufen: * $html = ggs_inject_live($html, 'logistik'); */ function ggs_inject_live(string $html, string $simId): string { $bp = BASE_PATH; $bu = BASE_URL; $sid = Session::studentId() ?? ''; $ctx = [ 'sessionId' => $sid, 'simId' => $simId, 'baseUrl' => $bu, 'basePath' => $bp, 'apiUrl' => $bu . '/php/api', ]; $ctxJson = json_encode($ctx, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); // Sim-eigene __GGS__-Felder gewinnen — wir ergänzen nur Plattform-Felder. $bootstrap = ''; $tag = ''; $injection = $bootstrap . "\n" . $tag . "\n"; // Sicheres Inject: vor dem letzten . Falls keines, einfach anhängen. $pos = strrpos($html, ''); if ($pos === false) return $html . "\n" . $injection; return substr($html, 0, $pos) . $injection . substr($html, $pos); } /** Seite rendern: HTML laden, Session-Kontext + Favicon injizieren, ausgeben. * * Härtung: str_replace('', ...) wäre zerstörerisch, wenn der String * '' in einem JavaScript-Literal vorkommt (z.B. teacher.html nutzt * w.document.write('…') — die Replace würde mitten in * den JS-String injizieren und den Parser zerschießen, der Rest des * '; // Vor LETZTEM einfügen (nicht in JS-Strings injizieren) $bodyPos = strrpos($html, ''); if ($bodyPos !== false) { $html = substr($html, 0, $bodyPos) . $ctx . "\n" . substr($html, $bodyPos); } else { $html .= "\n" . $ctx; } echo $html; }