'mdtask', 'short_name' => 'mdtask', 'description' => 'Task management app for markdown files', 'start_url' => './', 'display' => 'standalone', 'background_color' => '#4A90E2', 'theme_color' => '#4A90E2', 'orientation' => 'portrait', 'icons' => [ [ 'src' => 'data:image/svg+xml,', 'sizes' => '192x192', 'type' => 'image/svg+xml' ], [ 'src' => 'data:image/svg+xml,', 'sizes' => '512x512', 'type' => 'image/svg+xml' ] ] ]); exit; } // Serve service worker if (isset($_GET['sw'])) { header('Content-Type: application/javascript'); ?> const CACHE_NAME = 'mdtask-v1'; const urlsToCache = [ './', 'https://unpkg.com/vue@3/dist/vue.global.js' ]; self.addEventListener('install', event => { event.waitUntil( caches.open(CACHE_NAME) .then(cache => cache.addAll(urlsToCache)) ); }); self.addEventListener('fetch', event => { event.respondWith( caches.match(event.request) .then(response => response || fetch(event.request)) ); }); self.addEventListener('activate', event => { event.waitUntil( caches.keys().then(cacheNames => { return Promise.all( cacheNames.map(cacheName => { if (cacheName !== CACHE_NAME) { return caches.delete(cacheName); } }) ); }) ); }); 'File not found']); exit; } $content = file_get_contents($path); $mtime = filemtime($path); echo json_encode(['content' => $content, 'mtime' => $mtime]); break; case 'writeFile': $path = $input['path']; $content = $input['content']; $expectedMtime = $input['mtime']; // Check if file was modified externally if (file_exists($path)) { $currentMtime = filemtime($path); if ($currentMtime != $expectedMtime) { echo json_encode(['error' => 'File was modified externally', 'reload' => true]); exit; } } // Create directory if it doesn't exist $dir = dirname($path); if (!is_dir($dir)) { mkdir($dir, 0755, true); } file_put_contents($path, $content); $newMtime = filemtime($path); echo json_encode(['success' => true, 'mtime' => $newMtime]); break; case 'listFiles': $dir = $input['dir']; $pattern = $input['pattern'] ?? null; if (!is_dir($dir)) { echo json_encode(['files' => []]); exit; } $files = []; $items = scandir($dir); foreach ($items as $item) { if ($item === '.' || $item === '..') continue; $fullPath = $dir . '/' . $item; if (is_file($fullPath) && pathinfo($item, PATHINFO_EXTENSION) === 'md') { if ($pattern === null || preg_match($pattern, $item)) { $files[] = [ 'name' => $item, 'path' => $fullPath ]; } } } echo json_encode(['files' => $files]); break; default: echo json_encode(['error' => 'Unknown action']); } } catch (Exception $e) { echo json_encode(['error' => $e->getMessage()]); } exit; } // HTML/JavaScript application ?>