FileBrowser Cursor !
This commit is contained in:
@@ -1,8 +1,12 @@
|
||||
/**
|
||||
* Datei-basierte Persistenz der Programme:
|
||||
* <id>.<ext> — G-Code (Grad), standardnah, Zeitstempel/Cursor im Kommentar
|
||||
* <id>.<ext> — G-Code (Grad), standardnah; Zeitstempel als ;<epoch>-Kommentar,
|
||||
* Cursor-Zeile zusätzlich mit '!' (z. B. ;1234567890!)
|
||||
* <id>.json — Sidecar mit Metadaten (Name, Zeiten, lineCount, angleUnit)
|
||||
*
|
||||
* Cursor-Primärquelle ist das ';!'-Marker im .gcode (lesbar, portierbar).
|
||||
* Der Sidecar enthält cursor als Fallback und für schnellen Zugriff.
|
||||
*
|
||||
* Nach außen werden Programme NUR über die id angesprochen — niemals über Pfade.
|
||||
* Storage-Details bleiben hier gekapselt (Konzept §8/§10).
|
||||
*/
|
||||
@@ -70,20 +74,21 @@ async function read(id) {
|
||||
} catch {
|
||||
/* Sidecar ist optional */
|
||||
}
|
||||
// Migration: alter '!'-Cursor-Marker in .gcode → Cursor liegt jetzt im .json.
|
||||
let legacyCursor = null;
|
||||
// Primärquelle: ';!'-Marker im .gcode (genau einer pro Datei).
|
||||
// Fallback: cursor aus .json (ältere Dateien ohne Marker).
|
||||
let fileCursor = null;
|
||||
const lines = splitLines(text).map((line, i) => {
|
||||
if (units.hasCursorMarker(line)) { legacyCursor = i; return units.removeCursorMarker(line); }
|
||||
if (units.hasCursorMarker(line)) { fileCursor = i; return units.removeCursorMarker(line); }
|
||||
return line;
|
||||
});
|
||||
const cursor = meta.cursor ?? legacyCursor ?? 0;
|
||||
const cursor = fileCursor ?? meta.cursor ?? 0;
|
||||
return { id, name: meta.name || id, cursor, lines, meta };
|
||||
}
|
||||
|
||||
/**
|
||||
* Schreibt .gcode + .json.
|
||||
* lines = saubere G-Code-Zeilen (Grad, ohne '!'-Cursor-Marker).
|
||||
* cursor = Cursor-Index (landet im .json, nicht in .gcode).
|
||||
* lines = saubere G-Code-Zeilen (Grad, ohne '!'-Marker) — der Marker wird hier gesetzt.
|
||||
* cursor = Cursor-Index: die entsprechende Zeile bekommt im .gcode ein '!' angehängt.
|
||||
*/
|
||||
async function write(id, { name, lines, cursor = 0 }) {
|
||||
assertValidId(id);
|
||||
@@ -105,7 +110,11 @@ async function write(id, { name, lines, cursor = 0 }) {
|
||||
createdAt,
|
||||
updatedAt: now,
|
||||
};
|
||||
const body = lines.join('\n') + (lines.length ? '\n' : '');
|
||||
// Cursor-Zeile im .gcode mit ';!'-Marker — sichtbar in jedem Text-Editor.
|
||||
const withCursor = lines.map((line, i) =>
|
||||
i === cursor && line.length > 0 ? units.addCursorMarker(line) : line
|
||||
);
|
||||
const body = withCursor.join('\n') + (withCursor.length ? '\n' : '');
|
||||
await fsp.writeFile(gcodePath(id), body, 'utf8');
|
||||
await fsp.writeFile(jsonPath(id), JSON.stringify(meta, null, 2) + '\n', 'utf8');
|
||||
log.info(`write ${gcodePath(id)} (${lines.length} Zeilen, cursor ${cursor})`);
|
||||
|
||||
Reference in New Issue
Block a user