# Functions Reference ## 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 |