--- Create / Rename / Delete ---
(folder NoteFolder, title, subpath string)
| 1397 | // --- Create / Rename / Delete --- |
| 1398 | |
| 1399 | func (v *Vault) CreateNote(folder NoteFolder, title, subpath string) (NoteMeta, error) { |
| 1400 | v.mu.Lock() |
| 1401 | defer v.mu.Unlock() |
| 1402 | if !IsValidFolder(folder) { |
| 1403 | return NoteMeta{}, fmt.Errorf("invalid folder: %s", folder) |
| 1404 | } |
| 1405 | if title == "" { |
| 1406 | title = defaultTitle() |
| 1407 | } |
| 1408 | title = sanitizeFileStem(title) |
| 1409 | dir, err := v.folderRoot(folder) |
| 1410 | if err != nil { |
| 1411 | return NoteMeta{}, err |
| 1412 | } |
| 1413 | if subpath != "" { |
| 1414 | sub, err := SafeJoin(dir, subpath) |
| 1415 | if err != nil { |
| 1416 | return NoteMeta{}, err |
| 1417 | } |
| 1418 | dir = sub |
| 1419 | } |
| 1420 | if err := os.MkdirAll(dir, v.dirMode); err != nil { |
| 1421 | return NoteMeta{}, err |
| 1422 | } |
| 1423 | abs := uniquePath(dir, title, ".md") |
| 1424 | if err := os.WriteFile(abs, []byte(""), v.fileMode); err != nil { |
| 1425 | return NoteMeta{}, err |
| 1426 | } |
| 1427 | v.invalidateTextSearchCache() |
| 1428 | return v.readMeta(folder, abs) |
| 1429 | } |
| 1430 | |
| 1431 | // CreateExcalidraw writes a new empty `.excalidraw` drawing under folder/subpath |
| 1432 | // and returns its meta. Mirrors CreateNote but seeds an empty Excalidraw scene. |
no test coverage detected