Global Functions
| Function | Signature | Description |
|----------|-----------|-------------|
| date() | date(string): date | Parse string to date. Format: YYYY-MM-DD HH:mm:ss |
| duration() | duration(string): duration | Parse duration string |
| now() | now(): date | Current date and time |
| today() | today(): date | Current date (time = 00:00:00) |
| if() | if(condition, trueResult, falseResult?) | Conditional |
| min() | min(n1, n2, ...): number | Smallest number |
| max() | max(n1, n2, ...): number | Largest number |
| number() | number(any): number | Convert to number |
| link() | link(path, display?): Link | Create a link |
| list() | list(element): List | Wrap in list if not already |
| file() | file(path): file | Get file object |
| image() | image(path): image | Create image for rendering |
| icon() | icon(name): icon | Lucide icon by name |
| html() | html(string): html | Render as HTML |
| escapeHTML() | escapeHTML(string): string | Escape HTML characters |
Any Type Functions
| Function | Signature | Description |
|----------|-----------|-------------|
| isTruthy() | any.isTruthy(): boolean | Coerce to boolean |
| isType() | any.isType(type): boolean | Check type |
| toString() | any.toString(): string | Convert to string |
Date Functions & Fields
Fields: date.year, date.month, date.day, date.hour, date.minute, date.second, date.millisecond
| Function | Signature | Description |
|----------|-----------|-------------|
| date() | date.date(): date | Remove time portion |
| format() | date.format(string): string | Format with Moment.js pattern |
| time() | date.time(): string | Get time as string |
| relative() | date.relative(): string | Human-readable relative time |
| isEmpty() | date.isEmpty(): boolean | Always false for dates |
Duration Type
When subtracting two dates, the result is a Duration type (not a number). Duration has its own properties and methods.
Duration Fields:
| Field | Type | Description |
|-------|------|-------------|
| duration.days | Number | Total days in duration |
| duration.hours | Number | Total hours in duration |
| duration.minutes | Number | Total minutes in duration |
| duration.seconds | Number | Total seconds in duration |
| duration.milliseconds | Number | Total milliseconds in duration |
IMPORTANT: Duration does NOT support .round(), .floor(), .ceil() directly. You must access a numeric field first (like .days), then apply number functions.
```yaml
# CORRECT: Calculate days between dates
"(date(due_date) - today()).days" # Returns number of days
"(now() - file.ctime).days" # Days since created
# CORRECT: Round the numeric result if needed
"(date(due_date) - today()).days.round(0)" # Rounded days
"(now() - file.ctime).hours.round(0)" # Rounded hours
# WRONG - will cause error:
# "((date(due) - today()) / 86400000).round(0)" # Duration doesn't support division then round
```
Date Arithmetic
```yaml
# Duration units: y/year/years, M/month/months, d/day/days,
# w/week/weeks, h/hour/hours, m/minute/minutes, s/second/seconds
# Add/subtract durations
"date + \"1M\"" # Add 1 month
"date - \"2h\"" # Subtract 2 hours
"now() + \"1 day\"" # Tomorrow
"today() + \"7d\"" # A week from today
# Subtract dates returns Duration type
"now() - file.ctime" # Returns Duration
"(now() - file.ctime).days" # Get days as number
"(now() - file.ctime).hours" # Get hours as number
# Complex duration arithmetic
"now() + (duration('1d') * 2)"
```
String Functions
Field: string.length
| Function | Signature | Description |
|----------|-----------|-------------|
| contains() | string.contains(value): boolean | Check substring |
| containsAll() | string.containsAll(...values): boolean | All substrings present |
| containsAny() | string.containsAny(...values): boolean | Any substring present |
| startsWith() | string.startsWith(query): boolean | Starts with query |
| endsWith() | string.endsWith(query): boolean | Ends with query |
| isEmpty() | string.isEmpty(): boolean | Empty or not present |
| lower() | string.lower(): string | To lowercase |
| title() | string.title(): string | To Title Case |
| trim() | string.trim(): string | Remove whitespace |
| replace() | string.replace(pattern, replacement): string | Replace pattern |
| repeat() | string.repeat(count): string | Repeat string |
| reverse() | string.reverse(): string | Reverse string |
| slice() | string.slice(start, end?): string | Substring |
| split() | string.split(separator, n?): list | Split to list |
Number Functions
| Function | Signature | Description |
|----------|-----------|-------------|
| abs() | number.abs(): number | Absolute value |
| ceil() | number.ceil(): number | Round up |
| floor() | number.floor(): number | Round down |
| round() | number.round(digits?): number | Round to digits |
| toFixed() | number.toFixed(precision): string | Fixed-point notation |
| isEmpty() | number.isEmpty(): boolean | Not present |
List Functions
Field: list.length
| Function | Signature | Description |
|----------|-----------|-------------|
| contains() | list.contains(value): boolean | Element exists |
| containsAll() | list.containsAll(...values): boolean | All elements exist |
| containsAny() | list.containsAny(...values): boolean | Any element exists |
| filter() | list.filter(expression): list | Filter by condition (uses value, index) |
| map() | list.map(expression): list | Transform elements (uses value, index) |
| reduce() | list.reduce(expression, initial): any | Reduce to single value (uses value, index, acc) |
| flat() | list.flat(): list | Flatten nested lists |
| join() | list.join(separator): string | Join to string |
| reverse() | list.reverse(): list | Reverse order |
| slice() | list.slice(start, end?): list | Sublist |
| sort() | list.sort(): list | Sort ascending |
| unique() | list.unique(): list | Remove duplicates |
| isEmpty() | list.isEmpty(): boolean | No elements |
File Functions
| Function | Signature | Description |
|----------|-----------|-------------|
| asLink() | file.asLink(display?): Link | Convert to link |
| hasLink() | file.hasLink(otherFile): boolean | Has link to file |
| hasTag() | file.hasTag(...tags): boolean | Has any of the tags |
| hasProperty() | file.hasProperty(name): boolean | Has property |
| inFolder() | file.inFolder(folder): boolean | In folder or subfolder |
Link Functions
| Function | Signature | Description |
|----------|-----------|-------------|
| asFile() | link.asFile(): file | Get file object |
| linksTo() | link.linksTo(file): boolean | Links to file |
Object Functions
| Function | Signature | Description |
|----------|-----------|-------------|
| isEmpty() | object.isEmpty(): boolean | No properties |
| keys() | object.keys(): list | List of keys |
| values() | object.values(): list | List of values |
Regular Expression Functions
| Function | Signature | Description |
|----------|-----------|-------------|
| matches() | regexp.matches(string): boolean | Test if matches |