102 lines
2.7 KiB
TypeScript
102 lines
2.7 KiB
TypeScript
/**
|
|
* Piece bookmarks management (separate from config.yaml)
|
|
*
|
|
* Bookmarks are stored in a configurable location (default: ~/.takt/preferences/bookmarks.yaml)
|
|
*/
|
|
|
|
import { readFileSync, existsSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
import { join, dirname } from 'node:path';
|
|
import { parse as parseYaml, stringify as stringifyYaml } from 'yaml';
|
|
import { getGlobalConfigDir } from '../paths.js';
|
|
import { loadGlobalConfig } from './globalConfig.js';
|
|
|
|
interface BookmarksFile {
|
|
pieces: string[];
|
|
}
|
|
|
|
function getDefaultBookmarksPath(): string {
|
|
return join(getGlobalConfigDir(), 'preferences', 'bookmarks.yaml');
|
|
}
|
|
|
|
function getBookmarksPath(): string {
|
|
try {
|
|
const config = loadGlobalConfig();
|
|
if (config.bookmarksFile) {
|
|
return config.bookmarksFile;
|
|
}
|
|
} catch {
|
|
// Ignore errors, use default
|
|
}
|
|
return getDefaultBookmarksPath();
|
|
}
|
|
|
|
function loadBookmarksFile(): BookmarksFile {
|
|
const bookmarksPath = getBookmarksPath();
|
|
if (!existsSync(bookmarksPath)) {
|
|
return { pieces: [] };
|
|
}
|
|
|
|
try {
|
|
const content = readFileSync(bookmarksPath, 'utf-8');
|
|
const parsed = parseYaml(content);
|
|
if (parsed && typeof parsed === 'object' && 'pieces' in parsed && Array.isArray(parsed.pieces)) {
|
|
return { pieces: parsed.pieces };
|
|
}
|
|
} catch {
|
|
// Ignore parse errors
|
|
}
|
|
|
|
return { pieces: [] };
|
|
}
|
|
|
|
function saveBookmarksFile(bookmarks: BookmarksFile): void {
|
|
const bookmarksPath = getBookmarksPath();
|
|
const dir = dirname(bookmarksPath);
|
|
if (!existsSync(dir)) {
|
|
mkdirSync(dir, { recursive: true });
|
|
}
|
|
const content = stringifyYaml(bookmarks, { indent: 2 });
|
|
writeFileSync(bookmarksPath, content, 'utf-8');
|
|
}
|
|
|
|
/** Get bookmarked piece names */
|
|
export function getBookmarkedPieces(): string[] {
|
|
const bookmarks = loadBookmarksFile();
|
|
return bookmarks.pieces;
|
|
}
|
|
|
|
/**
|
|
* Add a piece to bookmarks.
|
|
* Persists to ~/.takt/bookmarks.yaml and returns the updated bookmarks list.
|
|
*/
|
|
export function addBookmark(pieceName: string): string[] {
|
|
const bookmarks = loadBookmarksFile();
|
|
if (!bookmarks.pieces.includes(pieceName)) {
|
|
bookmarks.pieces.push(pieceName);
|
|
saveBookmarksFile(bookmarks);
|
|
}
|
|
return bookmarks.pieces;
|
|
}
|
|
|
|
/**
|
|
* Remove a piece from bookmarks.
|
|
* Persists to ~/.takt/bookmarks.yaml and returns the updated bookmarks list.
|
|
*/
|
|
export function removeBookmark(pieceName: string): string[] {
|
|
const bookmarks = loadBookmarksFile();
|
|
const index = bookmarks.pieces.indexOf(pieceName);
|
|
if (index >= 0) {
|
|
bookmarks.pieces.splice(index, 1);
|
|
saveBookmarksFile(bookmarks);
|
|
}
|
|
return bookmarks.pieces;
|
|
}
|
|
|
|
/**
|
|
* Check if a piece is bookmarked.
|
|
*/
|
|
export function isBookmarked(pieceName: string): boolean {
|
|
const bookmarks = loadBookmarksFile();
|
|
return bookmarks.pieces.includes(pieceName);
|
|
}
|