# EFTL Language Extension for VS Code

Syntax highlighting and language support for **EFTL (ElixForms Template Language)**.

## Features

- **Syntax Highlighting** for all EFTL constructs
- **Code Snippets** for common patterns
- **Bracket Matching** for EFTL blocks
- **Code Folding** for block structures

## Supported Syntax

### Block Delimiters

- `[EFTL]...[/EFTL]` - Main EFTL block
- `[VAR name="..." type="..."]...[/VAR]` - Variable declarations
- `[IF]...[/IF]` - Conditionals
- `[WHILE]...[/WHILE]` - Loops

### Expressions

- `[% expression %]` - Execute expression
- `[%= expression %]` - Output expression value

### Data Tags

- `[TAG]GETVALUEBYTAG,TAG_NAME,REQUEST,IUQOID[/TAG]`
- `[TAG]SCHEMAID,schemaId,COL0001,IUQOID, , [/TAG]`

### Functions

- `[SPLIT regex="..."]...[/SPLIT]` - Split string
- `[TRIM]...[/TRIM]` - Trim whitespace
- `[VALUE_OF varname="..." index="..." /]` - Get array element
- `[SIZE_OF varname="..." /]` - Get array size
- `[CONTAINS varname="..."]...[/CONTAINS]` - Check containment
- `[FORMAT type="..." pattern="..."]...[/FORMAT]` - Format values

### Control Structures

- `[IF]`, `[CONDITION]`, `[THEN]`, `[ELSE]`, `[ELSE IF]`
- `[WHILE]`, `[DO]`

### Comments

- `[!-- comment --]`

## Building and Installation

### 1. Build from Source

To compile the extension, you need [Node.js](https://nodejs.org/) installed.

1. Open a terminal in the project root.
2. Install dependencies:

    ```bash
    npm install
    ```

3. Compile the TypeScript code:

    ```bash
    npm run compile
    ```

    *Alternatively, use `npm run watch` to automatically recompile on changes.*

### 2. Manual Installation (for testing)

To make the extension available in your VS Code without packaging it as a VSIX:

#### Windows

1. Open a command prompt (as Administrator for symlinks) or PowerShell.
2. Create a link to this folder in your VS Code extensions directory:

    ```powershell
    # PowerShell
    New-Item -ItemType Junction -Path "$env:USERPROFILE\.vscode\extensions\eftl-language" -Value "D:\__Git\vscode-eftl-language"
    ```

    *Note: Replace the value path with the actual absolute path to your project folder if it differs.*

#### Linux / macOS

1. Create a symbolic link:

    ```bash
    ln -s "$(pwd)" ~/.vscode/extensions/eftl-language
    ```

2. **Restart VS Code**. The extension will now be loaded.

### 3. Development Mode (Debugging)

If you want to debug the extension or the language server:

1. Open the project folder in VS Code.
2. Ensure you have run `npm install` and `npm run compile`.
3. Press `F5` (or go to the **Run and Debug** view and click **Launch Extension**).
4. A new **Extension Development Host** window will open.
5. In that window, open any `.eftl` file to test syntax highlighting and the language server.

## Snippets

| Prefix      | Description            |
| ----------- | ---------------------- |
| `eftl`      | EFTL block with header |
| `var`       | Variable declaration   |
| `vartag`    | Variable from TAG      |
| `varschema` | Variable from SCHEMAID |
| `if`        | IF statement           |
| `ifelse`    | IF-ELSE statement      |
| `while`     | WHILE loop             |
| `split`     | Split function         |
| `trim`      | Trim function          |
| `valueof`   | VALUE_OF function      |
| `sizeof`    | SIZE_OF function       |
| `contains`  | CONTAINS function      |
| `formatnum` | Format number          |
| `tag`       | GETVALUEBYTAG tag      |
| `schema`    | SCHEMAID tag           |
| `out`       | Output expression      |
| `comment`   | Comment block          |

## Example

```eftl
[EFTL][HEADER name="trimDocument" value="true" type="boolean" /]
[VAR name="total" type="number"][% total = 0; %][/VAR]
[VAR name="items" type="iterable"][SPLIT regex=";"][TAG]GETVALUEBYTAG,ITEMS,REQUEST,IUQOID[/TAG][/SPLIT][/VAR]

[!-- Calculate total --]
[VAR name="count" type="number"][SIZE_OF varname="items" /][/VAR]

[IF]
    [CONDITION][% count > 0 %][/CONDITION]
    [THEN][%= count %] items found[/THEN]
    [ELSE]No items[/ELSE]
[/IF]
[/EFTL]
```

## License

MIT
