| 1 | # Языки редактора: список и поддержка |
| 2 | |
| 3 | Список проверен вызовом `GetLanguageByExtension` + `GetScopeByLanguageId` (TextMateSharp.Grammars 1.0.56). Исходники: [danipen/TextMateSharp](https://github.com/danipen/TextMateSharp) — имена грамматик в `src/TextMateSharp.Grammars/GrammarNames.cs`, расширения по языкам в `package.json` каждого пакета в `Resources/Grammars/`. В редакторе используются только расширения из этого списка. |
| 4 | |
| 5 | ## Что есть в бандле (проверено) |
| 6 | |
| 7 | **Поддерживаются** (28 расширений): |
| 8 | `.bat`, `.cjs`, `.cs`, `.cshtml`, `.css`, `.go`, `.htm`, `.html`, `.js`, `.json`, `.less`, `.markdown`, `.md`, `.mjs`, `.ps1`, `.psd1`, `.psm1`, `.py`, `.razor`, `.rs`, `.scss`, `.sh`, `.sql`, `.ts`, `.tsx`, `.xml`, `.yaml`, `.yml`. |
| 9 | |
| 10 | **Не поддерживаются** (GetLanguageByExtension даёт исключение): |
| 11 | `.txt`, `.toml`, `.mts`, `.cts` (для `.mts`/`.cts` в IDE маппим на грамматику `.ts` — это расширения TypeScript 5+ для явного типа модуля: ESM и CommonJS). |
| 12 | |
| 13 | ## Поддержка в Cascade IDE |
| 14 | |
| 15 | Единый источник правды — `Services/EditorLanguageSupport`: списки `Supported` и `ExtensionToGrammarExtension`. Подсветка применяется только для расширений из словаря; при неизвестном расширении грамматика не меняется (остаётся от предыдущего файла). |
| 16 | |
| 17 | | Язык | Расширения в IDE | |
| 18 | |-------------|-------------------| |
| 19 | | C# | `.cs` | |
| 20 | | Markdown | `.md`, `.markdown` | |
| 21 | | XML / XAML | `.xml`, `.axaml`, `.xaml`, `.csproj`, `.config`, `.props`, `.targets` | |
| 22 | | JSON | `.json` | |
| 23 | | SQL | `.sql` | |
| 24 | | HTML | `.html`, `.htm` | |
| 25 | | CSS / SCSS / Less | `.css`, `.scss`, `.less` | |
| 26 | | JavaScript | `.js`, `.mjs`, `.cjs` | |
| 27 | | TypeScript | `.ts`, `.tsx`, `.mts`, `.cts` (последние два → грамматика `.ts`) | |
| 28 | | YAML | `.yml`, `.yaml` | |
| 29 | | PowerShell | `.ps1`, `.psm1`, `.psd1` | |
| 30 | | Razor | `.razor`, `.cshtml` | |
| 31 | | Batch | `.bat` | |
| 32 | | Bash | `.sh` | |
| 33 | | Python | `.py` | |
| 34 | | Go | `.go` | |
| 35 | | Rust | `.rs` | |
| 36 | |
| 37 | ## Что не добавляли |
| 38 | |
| 39 | - **.txt** — в бандле нет грамматики «plain text»; для неизвестных расширений подсветка не переключается. |
| 40 | - **.toml** — в бандле нет. |
| 41 | - **Dockerfile / .editorconfig / .ini / .gitignore** — не проверялись; при появлении в бандле можно добавить в `EditorLanguageSupport`. |
| 42 | |
| 43 | ## Как добавить синтаксис другого языка |
| 44 | |
| 45 | ### Язык уже есть в бандле TextMateSharp.Grammars |
| 46 | |
| 47 | Добавить расширения в `Services/EditorLanguageSupport.cs`: в список `Supported` и в словарь `ExtensionToGrammarExtension`. Ключ — расширение файла (например `.csx`), значение — то расширение, которое принимает `GetLanguageByExtension` (в репо смотреть в `Resources/Grammars/<имя>/package.json` → `contributes.languages[].extensions`). |
| 48 | |
| 49 | ### Языка нет в бандле (TOML, Dockerfile, свой язык) |
| 50 | |
| 51 | В `RegistryOptions` (исходники TextMateSharp) есть методы **`LoadFromLocalDir`** и **`LoadFromLocalFile`**: они подгружают грамматику из локальной папки/файла в тот же реестр, после чего `GetLanguageByExtension` начнёт находить новые расширения. |
| 52 | |
| 53 | **Формат пакета грамматики** (как в VS Code / TextMate): |
| 54 | |
| 55 | - Папка с именем грамматики (латиница, например `toml`). |
| 56 | - Внутри — **`package.json`** с полем `contributes`: |
| 57 | - `contributes.languages[]`: `id`, **`extensions`** (массив строк, например `[".toml"]`), опционально `aliases`, `configuration` (путь к language-configuration.json). |
| 58 | - `contributes.grammars[]`: `language` (тот же id), **`scopeName`** (например `source.toml`), **`path`** — путь к `.tmLanguage.json` или `.tmLanguage` (TextMate grammar). |
| 59 | - В той же папке — файл грамматики по пути из `path` (например `syntaxes/toml.tmLanguage.json`). |
| 60 | |
| 61 | Грамматики в формате TextMate (`.tmLanguage.json`) можно брать из расширений VS Code или с [Open VSX](https://open-vsx.org/) / GitHub (например [vscode-toml](https://github.com/toml-lang/toml/blob/main/code/toml.tmLanguage.json)). |
| 62 | |
| 63 | **Шаги в Cascade IDE:** |
| 64 | |
| 65 | 1. Выбрать или собрать пакет грамматики (папка с `package.json` + `syntaxes/*.tmLanguage.json`). |
| 66 | 2. Положить папку в известное место (например рядом с exe: `Grammars/toml/`, или в настройках пользователя). |
| 67 | 3. При инициализации редактора: после создания `RegistryOptions(ThemeName.LightPlus)` и **до** `InstallTextMate(registryOptions)` вызвать `registryOptions.LoadFromLocalDir(pathToGrammarsFolder)`. В `LoadFromLocalDir` каждая подпапка считается пакетом (по имени папки ищется `package.json` внутри). |
| 68 | 4. Добавить новые расширения в `EditorLanguageSupport` (`Supported` и `ExtensionToGrammarExtension`), чтобы по ним выбиралась грамматика. |
| 69 | |
| 70 | Сейчас в коде вызов `LoadFromLocalDir` не делается — при добавлении первого «внешнего» языка нужно в `MainWindow.axaml.cs` в `SetupEditorAndTextMate()` после `_registryOptions = new RegistryOptions(...)` добавить проверку: если есть папка с грамматиками (например `Path.Combine(AppContext.BaseDirectory, "Grammars")`), вызвать `_registryOptions.LoadFromLocalDir(thatPath)`. |
| 71 | |
| 72 | ## Где менять |
| 73 | |
| 74 | - **Список языков и маппинг:** `Services/EditorLanguageSupport.cs` (`Supported`, `ExtensionToGrammarExtension`). |
| 75 | - **Применение грамматики:** `Views/MainWindow.axaml.cs`, метод `ApplyGrammarByFilePath`. |
| 76 | - **Подгрузка внешних грамматик:** там же, в `SetupEditorAndTextMate()`, после создания `_registryOptions` — вызов `LoadFromLocalDir` (когда появится папка с пакетами). |
| 77 | - **Проверка бандла:** при необходимости — отдельная консольная программа с `RegistryOptions(ThemeName.LightPlus)` и перебором расширений через `GetLanguageByExtension`. |
| 78 | - **Сверка с исходниками:** расширения из нашего списка совпадают с объявленными в package.json репо (csharp, razor, javascript, typescriptbasics, html, powershell, shellscript, sql и т.д.). В репо есть дополнительные расширения (напр. .csx, .cake для C#; .pssc, .psrc для PowerShell; .dsql для SQL), при желании их можно добавить в EditorLanguageSupport. |
| 79 | |