Forge
markdowndeeb25a2
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
651. Выбрать или собрать пакет грамматики (папка с `package.json` + `syntaxes/*.tmLanguage.json`).
662. Положить папку в известное место (например рядом с exe: `Grammars/toml/`, или в настройках пользователя).
673. При инициализации редактора: после создания `RegistryOptions(ThemeName.LightPlus)` и **до** `InstallTextMate(registryOptions)` вызвать `registryOptions.LoadFromLocalDir(pathToGrammarsFolder)`. В `LoadFromLocalDir` каждая подпапка считается пакетом (по имени папки ищется `package.json` внутри).
684. Добавить новые расширения в `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
View only · write via MCP/CIDE