Skip to content

Commit 61834b8

Browse files
committed
Merge branch 'upstream/main' into feat/ui-tweaks
2 parents 685692b + cc0fa9c commit 61834b8

File tree

60 files changed

+7447
-372
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+7447
-372
lines changed

.gitignore

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,5 +76,7 @@ OBSIDIAN-SERVER-README.md
7676
obsidian-help
7777
obsidian-api
7878
.clump
79-
tasknotes-e2e-vault/.obsidian/workspace.json
80-
.obsidian-config-e2e
79+
tasknotes-e2e-vault/.obsidian/workspace.json
80+
.obsidian-config-e2e
81+
# Generated calendar files
82+
tasknotes-e2e-vault/*.ics

docs/releases/unreleased.md

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,48 @@ Example:
2424
2525
-->
2626

27+
## Changed
28+
29+
- (#1437) Unified template variable syntax and available variables across filename and body templates
30+
- Both systems now use double-brace `{{variable}}` syntax consistently
31+
- Single-brace `{variable}` syntax remains supported for backwards compatibility but is deprecated
32+
- Settings UI shows a warning when deprecated single-brace syntax is detected
33+
- Filename templates gain body template variables: `{{contexts}}`, `{{tags}}`, `{{hashtags}}`, `{{timeEstimate}}`, `{{details}}`, `{{parentNote}}`
34+
- Body templates gain filename template variables: `{{zettel}}`, `{{nano}}`, and all extended date/time variables
35+
36+
## Added
37+
38+
- (#1361) Option to disable inline task overlay for aliased wikilinks
39+
- New setting in Features → Inline Tasks: "Disable overlay for aliased links"
40+
- When enabled, links with aliases like `[[Task|Check Status]]` render as plain links
41+
- Links without aliases continue to show the interactive task widget
42+
- Useful when embedding tasks in prose where the widget would be disruptive
43+
- Thanks to @diegomarzaa for the contribution and @jldiaz for proposing this feature in #1117
44+
45+
- (#1205) Google Calendar export for tasks
46+
- Sync tasks to Google Calendar based on scheduled or due dates
47+
- Automatic sync on task create, update, complete, and delete
48+
- Configurable event title templates with placeholders (`{{title}}`, `{{status}}`, `{{priority}}`, etc.)
49+
- Event descriptions include task metadata and optional Obsidian deep link
50+
- Support for all-day or timed events with customizable duration
51+
- Event color customization using Google Calendar's color palette
52+
- Default reminder setting for popup notifications
53+
- Bulk sync and unlink actions in settings
54+
- Task-event linking stored in frontmatter (`googleCalendarEventId`)
55+
56+
## Fixed
57+
58+
- (#1413) Fixed angle-bracket links and project title display
59+
- Angle-bracket links like `[Spec](<Projects/Client X/Spec.md>)` now resolve correctly
60+
- Project links display frontmatter `title` instead of raw filename/path when available
61+
- Dependency values normalize consistently across wikilinks, markdown links, and angle-bracket variants
62+
- Many thanks to @normenmueller for the contribution
63+
64+
- (#1414) Kanban column headers now display configured priority labels instead of raw values
65+
- Many thanks to @normenmueller for the contribution
66+
67+
- (#1416) Fixed property-based task identification mutating tags unexpectedly
68+
- Tags are only written when explicitly changed by the user
69+
- Task tag is only added in tag-based identification mode
70+
- Fixes #1391
71+
- Many thanks to @normenmueller for the contribution

docs/settings/task-defaults.md

Lines changed: 84 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -123,102 +123,111 @@ The system prevents file overwrites by checking for existing files and showing e
123123

124124
When using the **custom** filename format, you can create templates using variables that are replaced with actual values when tasks are created.
125125

126+
> **Recommended syntax:** Use double braces `{{variable}}` for consistency with body templates. Single braces `{variable}` are supported for backwards compatibility but are deprecated.
127+
126128
### Available Filename Variables
127129

128130
**Task Properties:**
129131

130-
- `{title}` - Task title (sanitized for filenames)
131-
- `{priority}` - Task priority (e.g., "high", "medium", "low")
132-
- `{status}` - Task status (e.g., "todo", "in-progress", "done")
133-
- `{dueDate}` - Task due date (YYYY-MM-DD format)
134-
- `{scheduledDate}` - Task scheduled date (YYYY-MM-DD format)
135-
- `{priorityShort}` - First letter of priority in uppercase (e.g., "H")
136-
- `{statusShort}` - First letter of status in uppercase (e.g., "T")
137-
- `{titleLower}` - Task title in lowercase
138-
- `{titleUpper}` - Task title in uppercase
139-
- `{titleSnake}` - Task title in snake_case
140-
- `{titleKebab}` - Task title in kebab-case
141-
- `{titleCamel}` - Task title in camelCase
142-
- `{titlePascal}` - Task title in PascalCase
132+
- `{{title}}` - Task title (sanitized for filenames)
133+
- `{{priority}}` - Task priority (e.g., "high", "medium", "low")
134+
- `{{status}}` - Task status (e.g., "todo", "in-progress", "done")
135+
- `{{dueDate}}` - Task due date (YYYY-MM-DD format)
136+
- `{{scheduledDate}}` - Task scheduled date (YYYY-MM-DD format)
137+
- `{{context}}` - First context from the task's contexts array
138+
- `{{contexts}}` - All contexts joined by `/`
139+
- `{{tags}}` - Task tags (comma-separated)
140+
- `{{hashtags}}` - Task tags as space-separated hashtags (e.g., "#work #urgent")
141+
- `{{timeEstimate}}` - Time estimate in minutes
142+
- `{{details}}` - Task details/description (truncated to 50 characters)
143+
- `{{parentNote}}` - Parent note name where task was created
144+
- `{{priorityShort}}` - First letter of priority in uppercase (e.g., "H")
145+
- `{{statusShort}}` - First letter of status in uppercase (e.g., "T")
146+
- `{{titleLower}}` - Task title in lowercase
147+
- `{{titleUpper}}` - Task title in uppercase
148+
- `{{titleSnake}}` - Task title in snake_case
149+
- `{{titleKebab}}` - Task title in kebab-case
150+
- `{{titleCamel}}` - Task title in camelCase
151+
- `{{titlePascal}}` - Task title in PascalCase
143152

144153
**Date and Time:**
145154

146-
- `{date}` - Full date (YYYY-MM-DD format, e.g., "2025-08-15")
147-
- `{time}` - Time as HHMMSS (e.g., "143502")
148-
- `{timestamp}` - Date and time as YYYY-MM-DD-HHMMSS (e.g., "2025-08-15-143502")
149-
- `{dateTime}` - Date and time as YYYY-MM-DD-HHMM (e.g., "2025-08-15-1435")
150-
- `{year}` - Year (e.g., "2025")
151-
- `{month}` - Month with leading zero (e.g., "08")
152-
- `{day}` - Day with leading zero (e.g., "15")
153-
- `{hour}` - Hour with leading zero (e.g., "14")
154-
- `{minute}` - Minute with leading zero (e.g., "35")
155-
- `{second}` - Second with leading zero (e.g., "02")
156-
- `{shortDate}` - Short date as YYMMDD (e.g., "250815")
157-
- `{shortYear}` - Short year as YY (e.g., "25")
158-
- `{monthName}` - Full month name (e.g., "August")
159-
- `{monthNameShort}` - Short month name (e.g., "Aug")
160-
- `{dayName}` - Full day name (e.g., "Thursday")
161-
- `{dayNameShort}` - Short day name (e.g., "Thu")
162-
- `{week}` - Week number (e.g., "33")
163-
- `{quarter}` - Quarter number (e.g., "3")
164-
- `{time12}` - 12-hour time with AM/PM (e.g., "02:35 PM")
165-
- `{time24}` - 24-hour time (e.g., "14:35")
166-
- `{hourPadded}` - Hour with leading zero (e.g., "14")
167-
- `{hour12}` - 12-hour format hour with leading zero (e.g., "02")
168-
- `{ampm}` - AM/PM indicator (e.g., "PM")
155+
- `{{date}}` - Full date (YYYY-MM-DD format, e.g., "2025-08-15")
156+
- `{{time}}` - Time as HHMMSS (e.g., "143502")
157+
- `{{timestamp}}` - Date and time as YYYY-MM-DD-HHMMSS (e.g., "2025-08-15-143502")
158+
- `{{dateTime}}` - Date and time as YYYY-MM-DD-HHMM (e.g., "2025-08-15-1435")
159+
- `{{year}}` - Year (e.g., "2025")
160+
- `{{month}}` - Month with leading zero (e.g., "08")
161+
- `{{day}}` - Day with leading zero (e.g., "15")
162+
- `{{hour}}` - Hour with leading zero (e.g., "14")
163+
- `{{minute}}` - Minute with leading zero (e.g., "35")
164+
- `{{second}}` - Second with leading zero (e.g., "02")
165+
- `{{shortDate}}` - Short date as YYMMDD (e.g., "250815")
166+
- `{{shortYear}}` - Short year as YY (e.g., "25")
167+
- `{{monthName}}` - Full month name (e.g., "August")
168+
- `{{monthNameShort}}` - Short month name (e.g., "Aug")
169+
- `{{dayName}}` - Full day name (e.g., "Thursday")
170+
- `{{dayNameShort}}` - Short day name (e.g., "Thu")
171+
- `{{week}}` - Week number (e.g., "33")
172+
- `{{quarter}}` - Quarter number (e.g., "3")
173+
- `{{time12}}` - 12-hour time with AM/PM (e.g., "02:35 PM")
174+
- `{{time24}}` - 24-hour time (e.g., "14:35")
175+
- `{{hourPadded}}` - Hour with leading zero (e.g., "14")
176+
- `{{hour12}}` - 12-hour format hour with leading zero (e.g., "02")
177+
- `{{ampm}}` - AM/PM indicator (e.g., "PM")
169178

170179
**Advanced:**
171180

172-
- `{unix}` - Unix timestamp in seconds (e.g., "1692106502")
173-
- `{unixMs}` - Unix timestamp in milliseconds (e.g., "1692106502123")
174-
- `{milliseconds}` - Milliseconds (e.g., "123")
175-
- `{ms}` - Milliseconds (e.g., "123")
176-
- `{timezone}` - Timezone offset (e.g., "+10:00")
177-
- `{timezoneShort}` - Short timezone offset (e.g., "+1000")
178-
- `{utcOffset}` - UTC offset (e.g., "+10:00")
179-
- `{utcOffsetShort}` - Short UTC offset (e.g., "+1000")
180-
- `{utcZ}` - UTC Z indicator (always "Z")
181-
- `{zettel}` - Zettelkasten ID (e.g., "250815abc")
182-
- `{nano}` - Nano ID with timestamp and random string
181+
- `{{unix}}` - Unix timestamp in seconds (e.g., "1692106502")
182+
- `{{unixMs}}` - Unix timestamp in milliseconds (e.g., "1692106502123")
183+
- `{{milliseconds}}` - Milliseconds (e.g., "123")
184+
- `{{ms}}` - Milliseconds (e.g., "123")
185+
- `{{timezone}}` - Timezone offset (e.g., "+10:00")
186+
- `{{timezoneShort}}` - Short timezone offset (e.g., "+1000")
187+
- `{{utcOffset}}` - UTC offset (e.g., "+10:00")
188+
- `{{utcOffsetShort}}` - Short UTC offset (e.g., "+1000")
189+
- `{{utcZ}}` - UTC Z indicator (always "Z")
190+
- `{{zettel}}` - Zettelkasten ID (e.g., "250815abc")
191+
- `{{nano}}` - Nano ID with timestamp and random string
183192

184193
### Filename Template Examples
185194

186195
**Date-based with title:**
187196
```
188-
{year}-{month}-{day} {title}
197+
{{year}}-{{month}}-{{day}} {{title}}
189198
```
190199
Result: `2025-08-15 Complete documentation.md`
191200

192201
**Zettelkasten with title:**
193202
```
194-
{zettel} {title}
203+
{{zettel}} {{title}}
195204
```
196205
Result: `250815abc Complete documentation.md`
197206

198207
**Priority and status prefix:**
199208
```
200-
[{priorityShort}] {title}
209+
[{{priorityShort}}] {{title}}
201210
```
202211
Result: `[H] Complete documentation.md`
203212

204213
**Custom timestamp:**
205214
```
206-
{timestamp}-{titleKebab}
215+
{{timestamp}}-{{titleKebab}}
207216
```
208217
Result: `2025-08-15-143502-complete-documentation.md`
209218

210219
### ICS Event Filename Variables
211220

212221
For ICS event notes, additional variables are available:
213222

214-
- `{icsEventTitle}` - Event title from ICS calendar
215-
- `{icsEventLocation}` - Event location
216-
- `{icsEventDescription}` - Event description (truncated to 50 characters)
217-
- `{icsEventTitleWithDate}` - Event title with formatted date
223+
- `{{icsEventTitle}}` - Event title from ICS calendar
224+
- `{{icsEventLocation}}` - Event location
225+
- `{{icsEventDescription}}` - Event description (truncated to 50 characters)
226+
- `{{icsEventTitleWithDate}}` - Event title with formatted date
218227

219228
### Important Notes
220229

221-
- **Single Braces**: Filename variables use single braces `{variable}` while folder variables use double braces `{{variable}}`
230+
- **Unified Syntax**: Both filename and body templates now use double braces `{{variable}}`. Single braces `{variable}` are supported for backwards compatibility but deprecated.
222231
- **Sanitization**: All variables are automatically sanitized to be safe for filenames (invalid characters removed)
223232
- **Empty Values**: If a property doesn't have a value, the variable is replaced with an empty string
224233
- **Character Limits**: Filenames are limited to 255 characters on most systems
@@ -264,6 +273,25 @@ For detailed reminder documentation, see [Task Reminders](../features/task-manag
264273

265274
TaskNotes supports **Templates** for both the YAML frontmatter and the body of your task notes. You can use templates to pre-fill common values, add boilerplate text, and create a consistent structure for your tasks. Templates can also include variables, such as `{{title}}`, `{{date}}`, and `{{parentNote}}`, which will be automatically replaced with the appropriate values when a new task is created.
266275

276+
### Unified Template Variables
277+
278+
Body templates now support the same variables as filename templates. All variables listed in the [Filename Template Variables](#filename-template-variables) section above are available in body templates, including:
279+
280+
- All date/time variables (`{{year}}`, `{{month}}`, `{{timestamp}}`, etc.)
281+
- All title variations (`{{titleKebab}}`, `{{titleSnake}}`, etc.)
282+
- Task property variations (`{{priorityShort}}`, `{{statusShort}}`)
283+
- Unique identifiers (`{{zettel}}`, `{{nano}}`)
284+
- Advanced variables (`{{unix}}`, `{{unixMs}}`, etc.)
285+
286+
### Body-Specific Variables
287+
288+
- `{{contexts}}` - Task contexts (comma-separated)
289+
- `{{tags}}` - Task tags (comma-separated)
290+
- `{{hashtags}}` - Task tags as space-separated hashtags
291+
- `{{timeEstimate}}` - Time estimate in minutes
292+
- `{{details}}` - User-provided details/description
293+
- `{{parentNote}}` - Parent note name/path (properly quoted for YAML)
294+
267295
The `{{parentNote}}` variable is particularly useful for project organization. It inserts the parent note as a properly formatted markdown link.
268296

269297
### Basic Usage

0 commit comments

Comments
 (0)