Story 3.3 done

This commit is contained in:
2026-05-25 10:32:49 +02:00
parent 7b56d62563
commit 748c7d7f85
12 changed files with 451 additions and 105 deletions
+6 -3
View File
@@ -106,10 +106,11 @@ export class PresetImportExportManager {
* @returns {string} Generated filename.
*/
generateExportFilename(worldName, includeTimestamp = true) {
const name = worldName ?? this._adapter.scenes.current?.()?.name ?? 'world';
const currentScene = this._adapter.scenes.current?.();
const name = worldName ?? currentScene?.parent?.name ?? currentScene?.name ?? 'world';
// Sanitize name: replace any non-alphanumeric, dash, or underscore with underscore
// Also handle empty string by using 'world' as fallback
const safeName = name.replace(/[^a-zA-Z0-9-_]/g, '_').toLowerCase() || 'world';
const safeName = name.replace(/[^a-zA-Z0-9\-_]/g, '_').toLowerCase() || 'world';
const timestamp = includeTimestamp ? `_${Date.now()}` : '';
return `scrying-pool-presets-${safeName}${timestamp}.json`;
}
@@ -235,7 +236,7 @@ export class PresetImportExportManager {
}
// Validate preset name characters (alphanumeric, dash, underscore, space, dot)
if (!/^[a-zA-Z0-9\s._-]+$/.test(name)) {
if (!/^[a-zA-Z0-9 ._-]+$/.test(name)) {
results.push({ name, preset: null, error: `Preset "${name}": name contains invalid characters (only alphanumeric, space, dot, dash, underscore allowed)` });
continue;
}
@@ -339,11 +340,13 @@ export class PresetImportExportManager {
const result = await this._replacePresets(data, validPresets, existingCount);
// Merge extraction errors with replace errors
result.errors = [...errors, ...result.errors];
result.success = result.errors.length === 0;
return result;
}
const result = await this._mergePresets(data, validPresets, existingPresetNames);
// Merge extraction errors with merge errors
result.errors = [...errors, ...result.errors];
result.success = result.errors.length === 0;
return result;
}