diff --git a/.gitignore b/.gitignore index 7bf89f1..256a2df 100644 --- a/.gitignore +++ b/.gitignore @@ -20,6 +20,10 @@ package.json # App localStorage tilstand (lagres pr nettleser) .cache/ +# app/notes opprettes av launcherne per plattform (symlink på unix, kopi på Windows). +# Committes IKKE — git-symlinks materialiseres som ødelagte tekstfiler på Windows. +/app/notes + # Verifikasjons-skjermbilder /screenshots/ .claude/ diff --git a/Start.bat b/Start.bat index 2bda713..ba9ce0c 100644 --- a/Start.bat +++ b/Start.bat @@ -120,19 +120,24 @@ if not exist "%VENDOR_DIR%\marked.min.js" ( echo [v] marked.js OK ) -rem --- Verify notes/ exists in app/ ------------------------------------ -if not exist "%APP_DIR%\notes\uke17-eksamen.md" ( - echo [.] Notes mangler i app/ - kopierer ... - if exist "%APP_DIR%\notes" rmdir /s /q "%APP_DIR%\notes" 2>nul - mkdir "%APP_DIR%\notes" 2>nul - xcopy /Y /Q "%SCRIPT_DIR%notes\*.md" "%APP_DIR%\notes\" >nul - if exist "%APP_DIR%\notes\uke17-eksamen.md" ( - echo [v] Notes kopiert - ) else ( - echo [x] Klarte ikke kopiere notes/ - pause - exit /b 1 - ) +rem --- Ensure app\notes is a real directory with current notes -------- +rem Git lagrer app/notes som en symlink. Pa Windows uten symlink-stotte +rem materialiseres den som en STRAY TEKSTFIL (innhold: "../notes"), som +rem bryter appen. Vi normaliserer alltid: fjern fil, lag mappe, kopier. +rem ("if exist sti\" med etterfolgende backslash er sant kun for mapper.) +if exist "%APP_DIR%\notes" if not exist "%APP_DIR%\notes\" ( + echo [.] Fjerner ugyldig notes-fil ^(git-symlink pa Windows^) ... + del /f /q "%APP_DIR%\notes" >nul 2>&1 +) +if not exist "%APP_DIR%\notes\" mkdir "%APP_DIR%\notes" >nul 2>&1 +xcopy /Y /Q "%SCRIPT_DIR%notes\*.md" "%APP_DIR%\notes\" >nul 2>&1 +if exist "%APP_DIR%\notes\fast-track.md" ( + echo [v] Notes OK +) else ( + echo [x] Klarte ikke kopiere notes/ fra "%SCRIPT_DIR%notes" + echo Sjekk at notes-mappen finnes i prosjektroten. + pause + exit /b 1 ) rem --- Find a free port ----------------------------------------------- @@ -168,5 +173,18 @@ start "" /min cmd /c "timeout /t 2 >nul & start http://localhost:%PORT%" rem --- Start server ---------------------------------------------------- cd /d "%APP_DIR%" %SERVER_CMD% +set "SERVER_EXIT=%errorlevel%" + +rem --- Server stoppet: hold vinduet apent sa feil kan leses ----------- +echo. +if not "%SERVER_EXIT%"=="0" ( + echo [x] Serveren avsluttet med feilkode %SERVER_EXIT%. + echo Les meldingen over. Vanlige arsaker: porten var opptatt, + echo eller runtime ^(%SERVER_NAME%^) mangler rettigheter. +) else ( + echo Serveren ble stoppet. +) +echo Trykk en tast for a lukke vinduet ... +pause >nul endlocal diff --git a/Start.sh b/Start.sh index 3f18277..ac7b6ef 100755 --- a/Start.sh +++ b/Start.sh @@ -177,10 +177,14 @@ for f in "${required_files[@]}"; do fi done -# Notes-mappen er en symlink — sjekk at den peker rett +# app/notes opprettes per plattform (gitignorert). Den skal være en symlink +# til ../notes. Håndter ødelagt symlink ELLER en git-materialisert tekstfil. if [ -L "$APP_DIR/notes" ] && [ ! -e "$APP_DIR/notes" ]; then warn "notes-symlink er ødelagt — gjenoppretter …" rm -f "$APP_DIR/notes" +elif [ -f "$APP_DIR/notes" ]; then + warn "app/notes er en vanlig fil (git-symlink fra Windows) — erstatter med symlink …" + rm -f "$APP_DIR/notes" fi if [ ! -d "$APP_DIR/notes" ]; then if [ -d "$SCRIPT_DIR/notes" ]; then diff --git a/server.ps1 b/server.ps1 index 45aaa3d..c6496cb 100644 --- a/server.ps1 +++ b/server.ps1 @@ -9,16 +9,36 @@ param( [string]$Root = "." ) -Add-Type -AssemblyName System.Web +# Krasj ikke stille: vis full feil og stopp pent. +$ErrorActionPreference = "Stop" + +# Merk: vi bruker [System.Uri]::UnescapeDataString for URL-dekoding i stedet +# for System.Web.HttpUtility. System.Web er ikke tilgjengelig i PowerShell 7 +# (.NET Core) og kan faile pa enkelte oppsett — det var en kilde til at +# vinduet "krasjet umiddelbart". System.Uri finnes i bade PS 5.1 og PS 7. + +try { + $RootAbs = (Resolve-Path -LiteralPath $Root -ErrorAction Stop).Path +} catch { + Write-Host "Fant ikke app-mappen: $Root" -ForegroundColor Red + exit 1 +} + +if (-not ([System.Net.HttpListener]::IsSupported)) { + Write-Host "HttpListener stottes ikke pa denne maskinen." -ForegroundColor Red + exit 1 +} -$RootAbs = (Resolve-Path -LiteralPath $Root).Path $listener = New-Object System.Net.HttpListener $listener.Prefixes.Add("http://127.0.0.1:$Port/") try { $listener.Start() } catch { - Write-Host "Klarte ikke starte server pa port ${Port}: $($_.Exception.Message)" -ForegroundColor Red + Write-Host "" + Write-Host " Klarte ikke starte server pa port ${Port}:" -ForegroundColor Red + Write-Host " $($_.Exception.Message)" -ForegroundColor Red + Write-Host " Tips: porten kan vaere opptatt, eller en brannmur/policy blokkerer." -ForegroundColor DarkGray exit 1 } @@ -57,7 +77,7 @@ try { $res = $context.Response try { - $path = [System.Web.HttpUtility]::UrlDecode($req.Url.LocalPath) + $path = [System.Uri]::UnescapeDataString($req.Url.LocalPath) if ([string]::IsNullOrEmpty($path) -or $path -eq '/') { $path = '/index.html' } # Strip leading slash and normalize