( template: string, taskData: TemplateData | ICSTemplateData )
| 391 | * This is the core variable replacement function used by both frontmatter and body processing |
| 392 | */ |
| 393 | export function processTemplateVariables( |
| 394 | template: string, |
| 395 | taskData: TemplateData | ICSTemplateData |
| 396 | ): string { |
| 397 | let result = template; |
| 398 | const now = new Date(); |
| 399 | |
| 400 | // {{title}} - Task title |
| 401 | result = result.replace(/\{\{title\}\}/g, taskData.title || ""); |
| 402 | |
| 403 | // {{priority}} - Task priority |
| 404 | result = result.replace(/\{\{priority\}\}/g, taskData.priority || ""); |
| 405 | |
| 406 | // {{status}} - Task status |
| 407 | result = result.replace(/\{\{status\}\}/g, taskData.status || ""); |
| 408 | |
| 409 | // {{contexts}} - Task contexts (comma-separated) |
| 410 | const contexts = Array.isArray(taskData.contexts) ? taskData.contexts.join(", ") : ""; |
| 411 | result = result.replace(/\{\{contexts\}\}/g, contexts); |
| 412 | |
| 413 | // {{tags}} - Task tags (comma-separated) |
| 414 | const tags = Array.isArray(taskData.tags) ? taskData.tags.join(", ") : ""; |
| 415 | result = result.replace(/\{\{tags\}\}/g, tags); |
| 416 | |
| 417 | // {{hashtags}} - Task tags as space-separated hashtags |
| 418 | const hashtags = Array.isArray(taskData.tags) |
| 419 | ? taskData.tags.map((tag) => `#${tag}`).join(" ") |
| 420 | : ""; |
| 421 | result = result.replace(/\{\{hashtags\}\}/g, hashtags); |
| 422 | |
| 423 | // {{timeEstimate}} - Time estimate in minutes |
| 424 | result = result.replace(/\{\{timeEstimate\}\}/g, taskData.timeEstimate?.toString() || ""); |
| 425 | |
| 426 | // {{dueDate}} - Due date |
| 427 | result = result.replace(/\{\{dueDate\}\}/g, taskData.dueDate || ""); |
| 428 | |
| 429 | // {{scheduledDate}} - Scheduled date |
| 430 | result = result.replace(/\{\{scheduledDate\}\}/g, taskData.scheduledDate || ""); |
| 431 | |
| 432 | // {{details}} - User-provided details/description |
| 433 | result = result.replace(/\{\{details\}\}/g, taskData.details || ""); |
| 434 | |
| 435 | // {{parentNote}} - Parent note name/path where task was created |
| 436 | result = result.replace(/\{\{parentNote\}\}/g, taskData.parentNote || ""); |
| 437 | |
| 438 | // {{date}} - Current date (basic format only) |
| 439 | result = result.replace(/\{\{date\}\}/g, format(now, "yyyy-MM-dd")); |
| 440 | |
| 441 | // {{time}} - Current time (basic format only) |
| 442 | result = result.replace(/\{\{time\}\}/g, format(now, "HH:mm")); |
| 443 | |
| 444 | // Extended date/time variables (consistent with filename templates) |
| 445 | result = result.replace(/\{\{year\}\}/g, format(now, "yyyy")); |
| 446 | result = result.replace(/\{\{month\}\}/g, format(now, "MM")); |
| 447 | result = result.replace(/\{\{day\}\}/g, format(now, "dd")); |
| 448 | result = result.replace(/\{\{hour\}\}/g, format(now, "HH")); |
| 449 | result = result.replace(/\{\{minute\}\}/g, format(now, "mm")); |
| 450 | result = result.replace(/\{\{second\}\}/g, format(now, "ss")); |
no test coverage detected