Skip to content

Commit 7c7be47

Browse files
committed
fix: update path to generator for c++ and add missing russian translation
1 parent 2170b7a commit 7c7be47

File tree

3 files changed

+238
-6
lines changed

3 files changed

+238
-6
lines changed

content/4.languages/2.cpp/3.export-functions.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,7 @@ if(CLANG_DOC)
291291
if(Python3_FOUND)
292292
add_custom_command(TARGET docs POST_BUILD
293293
COMMAND ${Python3_EXECUTABLE}
294-
${CMAKE_SOURCE_DIR}/tools/parser.py
294+
${CMAKE_SOURCE_DIR}/parser/parser.py
295295
${CMAKE_SOURCE_DIR}/docs/index.yaml
296296
${CMAKE_SOURCE_DIR}/exported_methods.json
297297
COMMENT "Parsing documentation to JSON"
@@ -312,7 +312,7 @@ Install dependencies:
312312
pip install pyyaml
313313
```
314314

315-
:read-more{icon="lucide:github" to="https://github.com/untrustedmodders/plugify-module-cpp/tree/main/tools/parser" title="GitHub Repository"}
315+
:read-more{icon="lucide:github" to="https://github.com/untrustedmodders/plugify-module-cpp/tree/main/parser" title="GitHub Repository"}
316316

317317
#### **Document Your Functions**
318318

@@ -377,16 +377,16 @@ This generates `docs/index.yaml` with all your function information.
377377

378378
Run the parser to convert YAML to the manifest format:
379379
```bash
380-
python3 tools/parser.py docs/index.yaml exported_methods.json
380+
python3 parser/parser.py docs/index.yaml exported_methods.json
381381
```
382382

383383
Or with filtering:
384384
```bash
385385
# Only functions from files starting with "commands"
386-
python3 tools/parser.py docs/index.yaml exported_methods.json --file-prefix "commands"
386+
python3 parser/parser.py docs/index.yaml exported_methods.json --file-prefix "commands"
387387

388388
# Only functions with "Admin" in their name
389-
python3 tools/parser.py docs/index.yaml exported_methods.json --name-filter "Admin"
389+
python3 parser/parser.py docs/index.yaml exported_methods.json --name-filter "Admin"
390390
```
391391

392392
#### **Use in Your Manifest**

content/4.languages/2.cpp/4.import-functions.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ Plugify provides a Python script (`generator.py`) to automatically generate head
1616
#### **Locate the Generator Script**:
1717
- The `generator.py` script is located in the `generator` folder of the C++ language module.
1818

19-
:read-more{icon="lucide:link" to="https://github.com/untrustedmodders/plugify-module-cpp/tree/main/tools/generator" title="GitHub Repository"}
19+
:read-more{icon="lucide:link" to="https://github.com/untrustedmodders/plugify-module-cpp/tree/main/generator" title="GitHub Repository"}
2020

2121
#### **Run the Generator Script**:
2222
- Open a terminal or command prompt and navigate to the folder containing `generator.py`.

content/ru/4.languages/2.cpp/3.export-functions.md

Lines changed: 232 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,238 @@ extern "C" PLUGIN_API void ExecuteWithCallback_Exported_Name(int32_t value, cons
248248
```
249249
::
250250

251+
## **Автоматизация генерации манифеста**
252+
253+
::callout{icon="i-lucide-sparkles" color="blue"}
254+
**Новинка:** Теперь вы можете автоматизировать генерацию раздела `methods` в манифесте вашего плагина с помощью clang-doc и парсера на Python!
255+
::
256+
257+
Вместо ручного написания JSON-манифеста для каждой экспортируемой функции, вы можете использовать автоматизированные инструменты для извлечения сигнатур функций, типов, описаний параметров и даже определений перечислений непосредственно из вашего исходного кода C++.
258+
259+
### **Преимущества автоматической генерации**
260+
261+
1. **Не требуется ручное написание JSON**: Сигнатуры функций автоматически извлекаются из вашего кода
262+
2. **Полная информация о типах**: Структуры перечислений и typedef функций включаются автоматически
263+
3. **Интеграция документации**: Комментарии Doxygen парсятся и включаются в манифест
264+
4. **Меньше ошибок**: Устраняются опечатки и несоответствия типов между кодом и манифестом
265+
5. **Простое обслуживание**: Изменения в сигнатурах функций автоматически отражаются
266+
267+
### **Настройка: Добавление генерации документации в CMake**
268+
269+
Добавьте следующее в ваш `CMakeLists.txt` для генерации документации и JSON-манифеста:
270+
271+
```cmake
272+
# Найти clang-doc (обычно поставляется с установкой LLVM/Clang)
273+
find_program(CLANG_DOC clang-doc)
274+
275+
if(CLANG_DOC)
276+
# Генерация YAML-документации из ваших экспортируемых функций
277+
add_custom_target(docs
278+
COMMAND ${CLANG_DOC}
279+
--executor=all-TUs
280+
-p ${CMAKE_CURRENT_BINARY_DIR}
281+
--output=${CMAKE_CURRENT_SOURCE_DIR}/docs
282+
--extra-arg=-Wno-error
283+
--format=yaml
284+
${CMAKE_SOURCE_DIR}/src/export/*.cpp # Путь к вашим экспортируемым функциям
285+
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
286+
COMMENT "Generating documentation with clang-doc"
287+
)
288+
289+
# Опционально: Автоматическое преобразование YAML в JSON после генерации документации
290+
find_package(Python3 COMPONENTS Interpreter)
291+
if(Python3_FOUND)
292+
add_custom_command(TARGET docs POST_BUILD
293+
COMMAND ${Python3_EXECUTABLE}
294+
${CMAKE_SOURCE_DIR}/parser/parser.py
295+
${CMAKE_SOURCE_DIR}/docs/index.yaml
296+
${CMAKE_SOURCE_DIR}/exported_methods.json
297+
COMMENT "Parsing documentation to JSON"
298+
)
299+
endif()
300+
endif()
301+
```
302+
303+
### **Использование парсера**
304+
305+
::steps{level=4}
306+
#### **Установка парсера**
307+
308+
Скачайте `parser.py` и поместите его в ваш проект (например, в директорию `tools/`).
309+
310+
Установите зависимости:
311+
```bash
312+
pip install pyyaml
313+
```
314+
315+
:read-more{icon="lucide:github" to="https://github.com/untrustedmodders/plugify-module-cpp/tree/main/parser" title="Репозиторий GitHub"}
316+
317+
#### **Документируйте ваши функции**
318+
319+
Добавьте комментарии Doxygen к вашим экспортируемым функциям:
320+
321+
```cpp
322+
/**
323+
* @brief Создает консольную команду как административную команду.
324+
* Если команда не существует, она создается. Когда эта команда вызывается,
325+
* права доступа игрока автоматически проверяются перед разрешением продолжения.
326+
*
327+
* @param name Имя консольной команды.
328+
* @param adminFlags Флаги администратора, указывающие, какой уровень администратора может использовать эту команду.
329+
* @param description Краткое описание того, что делает команда.
330+
* @param flags Флаги команды, определяющие поведение команды.
331+
* @param callback Функция обратного вызова, которая вызывается при выполнении команды.
332+
* @param mode Был ли хук в режиме post (после обработки) или в режиме pre (до обработки).
333+
* @return Логическое значение, указывающее, была ли команда успешно добавлена.
334+
*/
335+
extern "C" PLUGIN_API bool AddAdminCommand(
336+
const plg::string& name,
337+
int64_t adminFlags,
338+
const plg::string& description,
339+
ConVarFlag flags,
340+
CommandCallback callback,
341+
HookMode mode
342+
);
343+
```
344+
345+
#### **Документируйте перечисления и typedef**
346+
347+
Документируйте ваши перечисления и typedef функций:
348+
349+
```cpp
350+
/**
351+
* @brief Перечисление, представляющее тип обратного вызова.
352+
*/
353+
enum class HookMode : uint8_t {
354+
/** Обратный вызов будет выполнен перед оригинальной функцией */
355+
Pre = 0,
356+
/** Обратный вызов будет выполнен после оригинальной функции */
357+
Post = 1
358+
};
359+
360+
/**
361+
* @brief Обрабатывает выполнение команды, вызванной вызывающей стороной.
362+
* Эта функция обрабатывает команду, интерпретирует ее контекст и обрабатывает любые предоставленные аргументы.
363+
*/
364+
using CommandCallback = ResultType (*)(int32_t caller, CommandCallingContext context, const plg::vector<plg::string>& arguments);
365+
```
366+
367+
#### **Генерация документации**
368+
369+
Соберите цель документации:
370+
```bash
371+
cmake --build . --target docs
372+
```
373+
374+
Это генерирует `docs/index.yaml` со всей информацией о ваших функциях.
375+
376+
#### **Преобразование в JSON**
377+
378+
Запустите парсер для преобразования YAML в формат манифеста:
379+
```bash
380+
python3 parser/parser.py docs/index.yaml exported_methods.json
381+
```
382+
383+
Или с фильтрацией:
384+
```bash
385+
# Только функции из файлов, начинающихся с "commands"
386+
python3 parser/parser.py docs/index.yaml exported_methods.json --file-prefix "commands"
387+
388+
# Только функции с "Admin" в имени
389+
python3 parser/parser.py docs/index.yaml exported_methods.json --name-filter "Admin"
390+
```
391+
392+
#### **Использование в манифесте**
393+
394+
Скопируйте сгенерированный массив `methods` из `exported_methods.json` в манифест вашего плагина:
395+
396+
```json
397+
{
398+
"name": "ExamplePlugin",
399+
"version": "1.0.0",
400+
"methods": [
401+
// Вставьте содержимое из exported_methods.json сюда
402+
]
403+
}
404+
```
405+
::
406+
407+
### **Продвинутое: Структуры перечислений**
408+
409+
Парсер автоматически включает полные определения перечислений, когда параметр использует тип перечисления:
410+
411+
**Сгенерированный вывод:**
412+
```json
413+
{
414+
"name": "mode",
415+
"type": "uint8",
416+
"description": "Был ли хук в режиме post или в режиме pre.",
417+
"enum": {
418+
"name": "HookMode",
419+
"description": "Перечисление, представляющее тип обратного вызова.",
420+
"values": [
421+
{
422+
"name": "Pre",
423+
"value": 0,
424+
"description": "Обратный вызов будет выполнен перед оригинальной функцией"
425+
},
426+
{
427+
"name": "Post",
428+
"value": 1,
429+
"description": "Обратный вызов будет выполнен после оригинальной функции"
430+
}
431+
]
432+
}
433+
}
434+
```
435+
436+
### **Продвинутое: Typedef функций**
437+
438+
Typedef указателей на функции автоматически парсятся в полные прототипы:
439+
440+
**Сгенерированный вывод:**
441+
```json
442+
{
443+
"name": "callback",
444+
"type": "function",
445+
"description": "Функция обратного вызова, которая вызывается при выполнении команды.",
446+
"prototype": {
447+
"name": "CommandCallback",
448+
"funcName": "CommandCallback",
449+
"description": "Обрабатывает выполнение команды, вызванной вызывающей стороной.",
450+
"paramTypes": [
451+
{
452+
"name": "param1",
453+
"type": "int32"
454+
},
455+
{
456+
"name": "param2",
457+
"type": "int32",
458+
"enum": {
459+
"name": "CommandCallingContext",
460+
"values": [...]
461+
}
462+
},
463+
{
464+
"name": "param3",
465+
"type": "string[]"
466+
}
467+
],
468+
"retType": {
469+
"type": "int32",
470+
"enum": {
471+
"name": "ResultType",
472+
"values": [...]
473+
}
474+
}
475+
}
476+
}
477+
```
478+
479+
::callout{icon="i-lucide-info" color="amber"}
480+
**Примечание:** Имена параметров typedef функций генерируются автоматически как `param1`, `param2` и т.д. Вы можете захотеть настроить их в манифесте для лучшей документации.
481+
::
482+
251483
## **Рекомендации**
252484

253485
1. **Используйте `PLUGIN_API`**: Всегда используйте макрос `PLUGIN_API` для пометки функций для экспорта.

0 commit comments

Comments
 (0)