From 65018dfcc6699301c07f8df1ad5c287ad4c2b492 Mon Sep 17 00:00:00 2001 From: robonen Date: Mon, 1 Sep 2025 03:10:30 +0700 Subject: [PATCH] feat: add QuestLang VS Code extension with syntax highlighting and installation instructions --- README.md | 98 +-------- vscode-extension/.vscode/launch.json | 13 ++ vscode-extension/.vscodeignore | 9 + vscode-extension/INSTALL.md | 108 +++++++++ vscode-extension/README.md | 83 +++++++ vscode-extension/language-configuration.json | 36 +++ vscode-extension/package.json | 46 ++++ .../syntaxes/questlang.tmLanguage.json | 205 ++++++++++++++++++ 8 files changed, 510 insertions(+), 88 deletions(-) create mode 100644 vscode-extension/.vscode/launch.json create mode 100644 vscode-extension/.vscodeignore create mode 100644 vscode-extension/INSTALL.md create mode 100644 vscode-extension/README.md create mode 100644 vscode-extension/language-configuration.json create mode 100644 vscode-extension/package.json create mode 100644 vscode-extension/syntaxes/questlang.tmLanguage.json diff --git a/README.md b/README.md index 07a3bb0..5838821 100644 --- a/README.md +++ b/README.md @@ -14,14 +14,14 @@ A modern TypeScript interpreter for the QuestLang programming language - a domai ## Installation ```bash -npm install questlang-interpreter +npm install questlang ``` Or for development: ```bash git clone -cd questlang-interpreter +cd questlang npm install ``` @@ -36,37 +36,17 @@ QuestLang comes with two CLI variants: # Play a quest questlang play quest.ql -# Validate quest syntax and structure +# Validate quest syntax and structure questlang validate quest.ql # Analyze quest structure and show statistics questlang analyze quest.ql ``` -#### Enhanced Clack CLI (Beautiful Interactive Interface) -```bash -# Interactive mode with file picker and beautiful prompts -questlang-clack - -# Direct commands with enhanced visual output -questlang-clack play quest.ql -questlang-clack validate quest.ql -questlang-clack analyze quest.ql -``` - -The clack CLI features: -- 🎨 Beautiful colored prompts with icons -- πŸ“Š Enhanced visual output -- ⏳ Loading spinners -- 🎯 Interactive file selection -- πŸ”„ "Play again" functionality - -See [CLI_GUIDE.md](./CLI_GUIDE.md) for detailed comparison. - ### Programmatic API ```typescript -import { QuestLang } from 'questlang-interpreter'; +import { QuestLang } from 'questlang'; // Parse quest source code const ast = QuestLang.parse(sourceCode); @@ -76,7 +56,7 @@ const interpreter = QuestLang.interpret(sourceCode); // Get quest information const questInfo = interpreter.getQuestInfo(); -console.log(`Playing: \${questInfo.name}`); +console.log(`Playing: ${questInfo.name}`); // Navigate through the quest const currentNode = interpreter.getCurrentNode(); @@ -107,7 +87,7 @@ QuestLang uses a declarative graph-based syntax for defining interactive quests: описаниС: "You stand before an ancient castle"; ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Ρ‹: [entrance]; } - + entrance: { Ρ‚ΠΈΠΏ: дСйствиС; описаниС: "There are two doors. Which do you choose?"; @@ -116,20 +96,20 @@ QuestLang uses a declarative graph-based syntax for defining interactive quests: ("Enter the right door", right_room) ]; } - + left_room: { Ρ‚ΠΈΠΏ: ΠΊΠΎΠ½Ρ†ΠΎΠ²ΠΊΠ°; Π½Π°Π·Π²Π°Π½ΠΈΠ΅: "Victory!"; описаниС: "You found the treasure!"; } - + right_room: { Ρ‚ΠΈΠΏ: ΠΊΠΎΠ½Ρ†ΠΎΠ²ΠΊΠ°; Π½Π°Π·Π²Π°Π½ΠΈΠ΅: "Defeat"; описаниС: "You fell into a trap"; } } - + Π½Π°Ρ‡Π°Π»ΠΎ: старт; } ΠΊΠΎΠ½Π΅Ρ†; @@ -166,7 +146,7 @@ The interpreter follows best practices for language implementation: - Handles Russian keywords and identifiers - Provides detailed position information for error reporting -### 2. Syntax Analysis (Parser) +### 2. Syntax Analysis (Parser) - Builds Abstract Syntax Tree (AST) from tokens - Implements recursive descent parsing - Comprehensive error handling with meaningful messages @@ -181,54 +161,6 @@ The interpreter follows best practices for language implementation: - Validation and analysis tools - Development utilities -## Development - -```bash -# Install dependencies -npm install - -# Run tests -npm test - -# Run tests with coverage -npm run coverage - -# Type check -npm run type-check - -# Lint code -npm run lint - -# Format code -npm run format - -# Build for production -npm run build - -# Development mode -npm run dev quest.ql -``` - -## Testing - -The project uses Vitest for testing with comprehensive coverage: - -```bash -# Run all tests -npm test - -# Run tests in watch mode -npm run test - -# Generate coverage report -npm run coverage -``` - -Test categories: -- **Unit Tests**: Lexer, Parser, Interpreter components -- **Integration Tests**: Full quest parsing and execution -- **Example Tests**: Real quest scenarios - ## Project Structure ``` @@ -247,16 +179,6 @@ src/ └── integration.test.ts ``` -## Contributing - -1. Fork the repository -2. Create a feature branch: \`git checkout -b feature/amazing-feature\` -3. Make your changes and add tests -4. Run the test suite: \`npm test\` -5. Commit your changes: \`git commit -m 'Add amazing feature'\` -6. Push to the branch: \`git push origin feature/amazing-feature\` -7. Open a Pull Request - ## License MIT License - see LICENSE file for details diff --git a/vscode-extension/.vscode/launch.json b/vscode-extension/.vscode/launch.json new file mode 100644 index 0000000..2a203c9 --- /dev/null +++ b/vscode-extension/.vscode/launch.json @@ -0,0 +1,13 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Extension", + "type": "extensionHost", + "request": "launch", + "args": [ + "--extensionDevelopmentPath=${workspaceFolder}" + ] + } + ] +} diff --git a/vscode-extension/.vscodeignore b/vscode-extension/.vscodeignore new file mode 100644 index 0000000..89be3de --- /dev/null +++ b/vscode-extension/.vscodeignore @@ -0,0 +1,9 @@ +**/.git +**/node_modules +**/.DS_Store +**/Thumbs.db +**/*.log +.vscode-test/ +out/ +dist/ +*.vsix diff --git a/vscode-extension/INSTALL.md b/vscode-extension/INSTALL.md new file mode 100644 index 0000000..55d7c61 --- /dev/null +++ b/vscode-extension/INSTALL.md @@ -0,0 +1,108 @@ +# Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ ΠΏΠΎ установкС ΠΈ использованию Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ QuestLang + +## Бпособы установки + +### 1. Установка ΠΈΠ· исходного ΠΊΠΎΠ΄Π° (для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ) + +1. Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Ρƒ вас установлСн VS Code ΠΈ Node.js +2. УстановитС глобально инструмСнт для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡΠΌΠΈ VS Code: + ```bash + npm install -g @vscode/vsce + ``` +3. ΠŸΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ: + ```bash + cd /Users/robonen/Projects/questlang/vscode-extension + ``` +4. Π£ΠΏΠ°ΠΊΡƒΠΉΡ‚Π΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ Π² Ρ„Π°ΠΉΠ» .vsix: + ```bash + vsce package + ``` +5. УстановитС Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ Π² VS Code: + ```bash + code --install-extension questlang-syntax-1.0.0.vsix + ``` + +### 2. Установка для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ (Π±Π΅Π· ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ) + +1. ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ ΠΏΠ°ΠΏΠΊΡƒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Π² VS Code: + ```bash + code /Users/robonen/Projects/questlang/vscode-extension + ``` +2. НаТмитС F5 для запуска Extension Development Host +3. Π’ Π½ΠΎΠ²ΠΎΠΌ ΠΎΠΊΠ½Π΅ VS Code ΠΎΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ любой Ρ„Π°ΠΉΠ» с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ .ql + +## ВСстированиС подсвСтки синтаксиса + +1. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Ρ„Π°ΠΉΠ» с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ `.ql` +2. Π‘ΠΊΠΎΠΏΠΈΡ€ΡƒΠΉΡ‚Π΅ содСрТимоС ΠΈΠ· `example.ql` ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ· README +3. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ синтаксис подсвСчиваСтся ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ: + - ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π΄Π΅Π»Π΅Π½Ρ‹ Ρ†Π²Π΅Ρ‚ΠΎΠΌ + - Π‘Ρ‚Ρ€ΠΎΠΊΠΈ Π² ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°Ρ… Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ†Π²Π΅Ρ‚Π° + - ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ сСрыми/Π·Π΅Π»Π΅Π½Ρ‹ΠΌΠΈ + - ИмСна ΡƒΠ·Π»ΠΎΠ² (ΠΏΠ΅Ρ€Π΅Π΄ Π΄Π²ΠΎΠ΅Ρ‚ΠΎΡ‡ΠΈΠ΅ΠΌ) Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹Π΄Π΅Π»ΡΡ‚ΡŒΡΡ + +## Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹ подсвСтки + +- **ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова структуры**: `квСст`, `Π³Ρ€Π°Ρ„`, `ΡƒΠ·Π»Ρ‹`, `Π½Π°Ρ‡Π°Π»ΠΎ`, `ΠΊΠΎΠ½Π΅Ρ†` +- **ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова свойств**: `Ρ‚ΠΈΠΏ`, `описаниС`, `ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Ρ‹`, `Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹`, `Π½Π°Π·Π²Π°Π½ΠΈΠ΅` +- **Π’ΠΈΠΏΡ‹ ΡƒΠ·Π»ΠΎΠ²**: `Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ`, `дСйствиС`, `ΠΊΠΎΠ½Ρ†ΠΎΠ²ΠΊΠ°` +- **Π‘Ρ‚Ρ€ΠΎΠΊΠΈ**: тСкст Π² Π΄Π²ΠΎΠΉΠ½Ρ‹Ρ… ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°Ρ… +- **Числа**: Ρ†Π΅Π»Ρ‹Π΅ ΠΈ дСсятичныС числа +- **ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ**: строки, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠ΅ΡΡ с `//` +- **ИмСна ΡƒΠ·Π»ΠΎΠ²**: ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄ Π΄Π²ΠΎΠ΅Ρ‚ΠΎΡ‡ΠΈΠ΅ΠΌ +- **Имя квСста**: Π½Π°Π·Π²Π°Π½ΠΈΠ΅ послС ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова `квСст` + +## Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π° + +- АвтоматичСскоС Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ скобок: `{}`, `[]`, `()` +- АвтоматичСскоС Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ ΠΊΠ°Π²Ρ‹Ρ‡Π΅ΠΊ: `""` +- АвтоматичСскиС отступы Π² Π±Π»ΠΎΠΊΠ°Ρ… +- Π‘Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΎΠ² ΠΊΠΎΠ΄Π° +- ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π² (Ctrl+/) + +## Настройка Ρ†Π²Π΅Ρ‚ΠΎΠ²ΠΎΠΉ схСмы + +Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ†Π²Π΅Ρ‚Π° подсвСтки Π² своСй Ρ‚Π΅ΠΌΠ΅ VS Code, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ сСлСкторы: + +```json +{ + "editor.tokenColorCustomizations": { + "textMateRules": [ + { + "scope": "keyword.control.quest.questlang", + "settings": { + "foreground": "#569cd6", + "fontStyle": "bold" + } + }, + { + "scope": "entity.name.type.quest.questlang", + "settings": { + "foreground": "#4ec9b0" + } + }, + { + "scope": "entity.name.function.node.questlang", + "settings": { + "foreground": "#dcdcaa" + } + } + ] + } +} +``` + +## УстранСниС Π½Π΅ΠΏΠΎΠ»Π°Π΄ΠΎΠΊ + +### Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ Π½Π΅ активируСтся +- ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Ρ„Π°ΠΉΠ» ΠΈΠΌΠ΅Π΅Ρ‚ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ `.ql` +- ΠŸΠ΅Ρ€Π΅Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚Π΅ VS Code +- ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ установлСно Π² спискС Extensions + +### ΠŸΠΎΠ΄ΡΠ²Π΅Ρ‚ΠΊΠ° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ +- Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ синтаксис Ρ„Π°ΠΉΠ»Π° ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΉ +- ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ "Reload Window" Π² VS Code +- ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ консоль Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° (Help > Toggle Developer Tools) + +### АвтодополнСниС Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ +Данная вСрсия Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ прСдоставляСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ подсвСтку синтаксиса. АвтодополнСниС ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² Π±ΡƒΠ΄ΡƒΡ‰ΠΈΡ… вСрсиях, создав Language Server Protocol (LSP) сСрвСр. diff --git a/vscode-extension/README.md b/vscode-extension/README.md new file mode 100644 index 0000000..079b2ed --- /dev/null +++ b/vscode-extension/README.md @@ -0,0 +1,83 @@ +# QuestLang Syntax Highlighting + +Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ VS Code для подсвСтки синтаксиса языка QuestLang - спСциализированного языка для создания ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… тСкстовых квСстов. + +## ВозмоТности + +- ✨ **ΠŸΠΎΠ΄ΡΠ²Π΅Ρ‚ΠΊΠ° синтаксиса** для Ρ„Π°ΠΉΠ»ΠΎΠ² `.ql` +- πŸ”€ **ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° русских ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слов** +- πŸ’¬ **ΠŸΠΎΠ΄ΡΠ²Π΅Ρ‚ΠΊΠ° ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π²** (`//`) +- 🎨 **Π¦Π²Π΅Ρ‚ΠΎΠ²ΠΎΠ΅ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ строк ΠΈ чисСл** +- πŸ”§ **АвтоматичСскоС Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ скобок** +- πŸ“ **АвтоматичСскиС отступы** + +## ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ элСмСнты языка + +### ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова +- `квСст`, `Ρ†Π΅Π»ΡŒ`, `Π³Ρ€Π°Ρ„`, `ΡƒΠ·Π»Ρ‹`, `Π½Π°Ρ‡Π°Π»ΠΎ`, `ΠΊΠΎΠ½Π΅Ρ†` +- `Ρ‚ΠΈΠΏ`, `описаниС`, `ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Ρ‹`, `Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹`, `Π½Π°Π·Π²Π°Π½ΠΈΠ΅` +- `Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ`, `дСйствиС`, `ΠΊΠΎΠ½Ρ†ΠΎΠ²ΠΊΠ°` + +### БинтаксичСскиС элСмСнты +- Π‘Ρ‚Ρ€ΠΎΠΊΠΈ Π² Π΄Π²ΠΎΠΉΠ½Ρ‹Ρ… ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°Ρ…: `"ВСкст"` +- Числа: `123`, `45.67` +- ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ: `// это ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ` +- Π‘ΠΊΠΎΠ±ΠΊΠΈ: `{}`, `[]`, `()` +- Π Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΠΈ: `;`, `:`, `,` + +## ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π° + +```questlang +квСст ΠœΠΎΠΉΠšΠ²Π΅ΡΡ‚; + Ρ†Π΅Π»ΡŒ "ОписаниС Ρ†Π΅Π»ΠΈ квСста"; + +Π³Ρ€Π°Ρ„ { + ΡƒΠ·Π»Ρ‹ { + старт: { + Ρ‚ΠΈΠΏ: Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ; + описаниС: "Начало ΠΏΡ€ΠΈΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ"; + ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Ρ‹: [Π²Ρ‹Π±ΠΎΡ€]; + } + + Π²Ρ‹Π±ΠΎΡ€: { + Ρ‚ΠΈΠΏ: дСйствиС; + описаниС: "Π§Ρ‚ΠΎ Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ Π΄Π΅Π»Π°Ρ‚ΡŒ?"; + Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹: [ + ("Π˜Π΄Ρ‚ΠΈ Π½Π°ΠΏΡ€Π°Π²ΠΎ", ΠΏΡ€Π°Π²Ρ‹ΠΉ_ΠΏΡƒΡ‚ΡŒ), + ("Π˜Π΄Ρ‚ΠΈ Π½Π°Π»Π΅Π²ΠΎ", Π»Π΅Π²Ρ‹ΠΉ_ΠΏΡƒΡ‚ΡŒ) + ]; + } + } + + Π½Π°Ρ‡Π°Π»ΠΎ: старт; +} + +ΠΊΠΎΠ½Π΅Ρ†; +``` + +## Установка + +1. ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ VS Code +2. ΠŸΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ Π² Extensions (Ctrl+Shift+X) +3. НайдитС "QuestLang Syntax Highlighting" +4. НаТмитС Install + +## ИспользованиС + +ПослС установки Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ всС Ρ„Π°ΠΉΠ»Ρ‹ с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ `.ql` Π±ΡƒΠ΄ΡƒΡ‚ автоматичСски Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ Ρ„Π°ΠΉΠ»Ρ‹ QuestLang с подсвСткой синтаксиса. + +## Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° + +Для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ: + +```bash +git clone +cd vscode-extension +npm install +``` + +Π—Π°Ρ‚Π΅ΠΌ Π½Π°ΠΆΠΌΠΈΡ‚Π΅ F5 Π² VS Code для запуска Extension Development Host. + +## ЛицСнзия + +MIT diff --git a/vscode-extension/language-configuration.json b/vscode-extension/language-configuration.json new file mode 100644 index 0000000..98727ac --- /dev/null +++ b/vscode-extension/language-configuration.json @@ -0,0 +1,36 @@ +{ + "comments": { + "lineComment": "//", + "blockComment": ["/*", "*/"] + }, + "brackets": [ + ["{", "}"], + ["[", "]"], + ["(", ")"] + ], + "autoClosingPairs": [ + ["{", "}"], + ["[", "]"], + ["(", ")"], + ["\"", "\""], + ["'", "'"] + ], + "surroundingPairs": [ + ["{", "}"], + ["[", "]"], + ["(", ")"], + ["\"", "\""], + ["'", "'"] + ], + "indentationRules": { + "increaseIndentPattern": "^\\s*.*[{\\[]\\s*$", + "decreaseIndentPattern": "^\\s*[}\\]].*$" + }, + "wordPattern": "[-?\\d*\\.\\w\\u0100-\\uffff]+", + "folding": { + "markers": { + "start": "^\\s*//\\s*#?region\\b", + "end": "^\\s*//\\s*#?endregion\\b" + } + } +} diff --git a/vscode-extension/package.json b/vscode-extension/package.json new file mode 100644 index 0000000..b441a3a --- /dev/null +++ b/vscode-extension/package.json @@ -0,0 +1,46 @@ +{ + "publisher": "questlang", + "name": "questlang-syntax", + "displayName": "QuestLang Syntax Highlighting", + "version": "1.0.0", + "description": "Syntax highlighting for QuestLang - a domain-specific language for interactive quests", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/robonen/questlang.git" + }, + "keywords": [ + "questlang", + "quest", + "syntax highlighting", + "dsl" + ], + "categories": [ + "Programming Languages" + ], + "engines": { + "vscode": "^1.60.0" + }, + "contributes": { + "languages": [ + { + "id": "questlang", + "aliases": [ + "QuestLang", + "questlang" + ], + "extensions": [ + ".ql" + ], + "configuration": "./language-configuration.json" + } + ], + "grammars": [ + { + "language": "questlang", + "scopeName": "source.questlang", + "path": "./syntaxes/questlang.tmLanguage.json" + } + ] + } +} diff --git a/vscode-extension/syntaxes/questlang.tmLanguage.json b/vscode-extension/syntaxes/questlang.tmLanguage.json new file mode 100644 index 0000000..fa3f524 --- /dev/null +++ b/vscode-extension/syntaxes/questlang.tmLanguage.json @@ -0,0 +1,205 @@ +{ + "$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json", + "name": "QuestLang", + "scopeName": "source.questlang", + "patterns": [ + { + "include": "#comments" + }, + { + "include": "#quest-declaration" + }, + { + "include": "#goal-declaration" + }, + { + "include": "#keywords" + }, + { + "include": "#strings" + }, + { + "include": "#numbers" + }, + { + "include": "#node-identifiers" + }, + { + "include": "#identifiers" + }, + { + "include": "#punctuation" + } + ], + "repository": { + "comments": { + "patterns": [ + { + "name": "comment.line.double-slash.questlang", + "begin": "//", + "end": "$", + "captures": { + "0": { + "name": "punctuation.definition.comment.questlang" + } + } + } + ] + }, + "quest-declaration": { + "patterns": [ + { + "match": "(квСст)\\s+([Π°-яёА-ЯЁa-zA-Z_][Π°-яёА-ЯЁa-zA-Z0-9_]*)", + "captures": { + "1": { + "name": "keyword.control.quest.questlang" + }, + "2": { + "name": "entity.name.type.quest.questlang" + } + } + } + ] + }, + "goal-declaration": { + "patterns": [ + { + "begin": "(Ρ†Π΅Π»ΡŒ)\\s+(\")", + "end": "\"", + "beginCaptures": { + "1": { + "name": "keyword.control.goal.questlang" + }, + "2": { + "name": "punctuation.definition.string.begin.questlang" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.questlang" + } + }, + "contentName": "string.quoted.double.goal.questlang", + "patterns": [ + { + "name": "constant.character.escape.questlang", + "match": "\\\\." + } + ] + } + ] + }, + "keywords": { + "patterns": [ + { + "name": "keyword.control.structure.questlang", + "match": "\\b(Π³Ρ€Π°Ρ„|ΡƒΠ·Π»Ρ‹|Π½Π°Ρ‡Π°Π»ΠΎ|ΠΊΠΎΠ½Π΅Ρ†)\\b" + }, + { + "name": "keyword.other.property.questlang", + "match": "\\b(Ρ‚ΠΈΠΏ|описаниС|ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Ρ‹|Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹|Π½Π°Π·Π²Π°Π½ΠΈΠ΅)\\b" + }, + { + "name": "keyword.type.node.questlang", + "match": "\\b(Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ|дСйствиС|ΠΊΠΎΠ½Ρ†ΠΎΠ²ΠΊΠ°)\\b" + } + ] + }, + "strings": { + "patterns": [ + { + "name": "string.quoted.double.questlang", + "begin": "\"", + "end": "\"", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.questlang" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.questlang" + } + }, + "patterns": [ + { + "name": "constant.character.escape.questlang", + "match": "\\\\." + } + ] + } + ] + }, + "numbers": { + "patterns": [ + { + "name": "constant.numeric.decimal.questlang", + "match": "\\b\\d+(\\.\\d+)?\\b" + } + ] + }, + "node-identifiers": { + "patterns": [ + { + "match": "([Π°-яёА-ЯЁa-zA-Z_][Π°-яёА-ЯЁa-zA-Z0-9_]*)(:)", + "captures": { + "1": { + "name": "entity.name.function.node.questlang" + }, + "2": { + "name": "punctuation.separator.colon.questlang" + } + } + } + ] + }, + "identifiers": { + "patterns": [ + { + "name": "variable.other.questlang", + "match": "\\b[Π°-яёА-ЯЁ_][Π°-яёА-ЯЁ0-9_]*\\b" + }, + { + "name": "variable.other.questlang", + "match": "\\b[a-zA-Z_][a-zA-Z0-9_]*\\b" + } + ] + }, + "punctuation": { + "patterns": [ + { + "name": "punctuation.terminator.statement.questlang", + "match": ";" + }, + { + "name": "punctuation.separator.comma.questlang", + "match": "," + }, + { + "name": "punctuation.section.braces.begin.questlang", + "match": "\\{" + }, + { + "name": "punctuation.section.braces.end.questlang", + "match": "\\}" + }, + { + "name": "punctuation.section.brackets.begin.questlang", + "match": "\\[" + }, + { + "name": "punctuation.section.brackets.end.questlang", + "match": "\\]" + }, + { + "name": "punctuation.section.parens.begin.questlang", + "match": "\\(" + }, + { + "name": "punctuation.section.parens.end.questlang", + "match": "\\)" + } + ] + } + } +}