* Process template variables for YAML frontmatter with proper quoting * This version ensures that values that could break YAML parsing are properly quoted
( template: string, taskData: TemplateData | ICSTemplateData )
| 154 | * This version ensures that values that could break YAML parsing are properly quoted |
| 155 | */ |
| 156 | function processTemplateVariablesForYaml( |
| 157 | template: string, |
| 158 | taskData: TemplateData | ICSTemplateData |
| 159 | ): string { |
| 160 | let result = template; |
| 161 | const now = new Date(); |
| 162 | |
| 163 | // {{title}} - Task title (quote if contains special characters) |
| 164 | const title = taskData.title || ""; |
| 165 | result = replaceYamlTemplateVariable(result, "title", title); |
| 166 | |
| 167 | // {{priority}} - Task priority |
| 168 | result = result.replace(/\{\{priority\}\}/g, taskData.priority || ""); |
| 169 | |
| 170 | // {{status}} - Task status |
| 171 | result = result.replace(/\{\{status\}\}/g, taskData.status || ""); |
| 172 | |
| 173 | // {{contexts}} - Task contexts (comma-separated) |
| 174 | const contexts = Array.isArray(taskData.contexts) ? taskData.contexts.join(", ") : ""; |
| 175 | result = result.replace(/\{\{contexts\}\}/g, contexts); |
| 176 | |
| 177 | // {{tags}} - Task tags (comma-separated) |
| 178 | const tags = Array.isArray(taskData.tags) ? taskData.tags.join(", ") : ""; |
| 179 | result = result.replace(/\{\{tags\}\}/g, tags); |
| 180 | |
| 181 | // {{hashtags}} - Task tags as space-separated hashtags |
| 182 | const hashtags = Array.isArray(taskData.tags) |
| 183 | ? taskData.tags.map((tag) => `#${tag}`).join(" ") |
| 184 | : ""; |
| 185 | result = result.replace(/\{\{hashtags\}\}/g, hashtags); |
| 186 | |
| 187 | // {{timeEstimate}} - Time estimate in minutes |
| 188 | result = result.replace(/\{\{timeEstimate\}\}/g, taskData.timeEstimate?.toString() || ""); |
| 189 | |
| 190 | // {{dueDate}} - Due date |
| 191 | result = result.replace(/\{\{dueDate\}\}/g, taskData.dueDate || ""); |
| 192 | |
| 193 | // {{scheduledDate}} - Scheduled date |
| 194 | result = result.replace(/\{\{scheduledDate\}\}/g, taskData.scheduledDate || ""); |
| 195 | |
| 196 | // {{details}} - User-provided details/description |
| 197 | result = result.replace(/\{\{details\}\}/g, taskData.details || ""); |
| 198 | |
| 199 | // {{parentNote}} - Parent note name/path - ALWAYS quote for YAML safety |
| 200 | const parentNote = taskData.parentNote || ""; |
| 201 | result = replaceYamlTemplateVariable(result, "parentNote", parentNote, { alwaysQuote: true }); |
| 202 | |
| 203 | // {{date}} - Current date (basic format only) |
| 204 | result = result.replace(/\{\{date\}\}/g, format(now, "yyyy-MM-dd")); |
| 205 | |
| 206 | // {{time}} - Current time (basic format only) |
| 207 | result = result.replace(/\{\{time\}\}/g, format(now, "HH:mm")); |
| 208 | |
| 209 | // Extended date/time variables (consistent with filename templates) |
| 210 | result = result.replace(/\{\{year\}\}/g, format(now, "yyyy")); |
| 211 | result = result.replace(/\{\{month\}\}/g, format(now, "MM")); |
| 212 | result = result.replace(/\{\{day\}\}/g, format(now, "dd")); |
| 213 | result = result.replace(/\{\{hour\}\}/g, format(now, "HH")); |
no test coverage detected