From 5eed144ff5c15a4c70afe2acf02b5747471135db Mon Sep 17 00:00:00 2001 From: MeexReay Date: Thu, 20 Mar 2025 01:04:17 +0300 Subject: [PATCH] woman update and terminal some fix --- app/woman/package.json | 2 +- app/woman/woman.js | 177 +++++++++++++++++++++++++++++++++++++---- sys/terminal.js | 8 ++ 3 files changed, 172 insertions(+), 15 deletions(-) diff --git a/app/woman/package.json b/app/woman/package.json index b718199..4b56db3 100644 --- a/app/woman/package.json +++ b/app/woman/package.json @@ -1,6 +1,6 @@ { "name": "woman", - "version": "0.1.0", + "version": "0.1.1", "description": "Wisdom Order Manuals", "author": "MeexReay", "apps": [ "woman.js" ], diff --git a/app/woman/woman.js b/app/woman/woman.js index 1a35848..ab63dbe 100644 --- a/app/woman/woman.js +++ b/app/woman/woman.js @@ -8,8 +8,9 @@ async function main(args) { * files - Работа файлов в приложениях * stdin - Чтение ввода пользователя * stdout - Вывод текста в консоль -* cursor - Работа с курсором +* terminal - Работа с остальными функциями консоли * packaging - Пакетирование приложений +* graphics - Отрисовка графики `) return 1 } @@ -17,6 +18,8 @@ async function main(args) { if (args[1] == "apps") { writeStdout(`# Создание приложений +## Написание программ + Все приложения в PoshlostiOS это JS скрипты Каждый такой скрипт должен иметь свой entry-point - асинхронная функция с названием main и единственным аргументом args в @@ -29,12 +32,16 @@ async function main(args) { return 0 } -Читайте также: -* files - Работа файлов в приложениях -* stdin - Чтение ввода пользователя -* stdout - Вывод текста в консоль -* cursor - Работа с курсором -* packaging - Пакетирование приложений +## Вызов команд + +Вот как выглядит функция: + + executeCommand(args, read=readStdin, write=writeStdout) -> {"id": string, "name": args.join(" "), "promise": Promise} + +Первый аргумент при вызове команды должен быть путем до исполняемого файла +Функция возвращает промис в поле promise, чтобы дождаться конца команды используйте await +Ты чо дебик мог и сам догадаться +все бб `) @@ -42,35 +49,177 @@ async function main(args) { } else if (args[1] == "files") { writeStdout(`# Работа файлов в приложениях -Статья в разработке +Вот описание всех функций для работы с файлами: + + readFile(path) -> string - читает контент файла + writeFile(path, content) - записать контент в файл + hasFile(path) -> boolean - узнает существует ли файл + listFiles(path) -> list[string] - выдает список из имен файлов в папке + createFolder(path) - создать папку + removeFile(path) - удалить файл + isFolder(path) -> boolean - узнает это файл или папка + simplifyPath(path) -> string - переделать в абсолютный путь и убрать лишнее + clearFileSystem() - удалить все файлы к чертям собачьим + +Всю начинку ФС вы можете увидеть в исходном коде в sys/fs.js `) return 0 } else if (args[1] == "stdin") { writeStdout(`# Чтение ввода пользователя -Статья в разработке +## Редактирование флагов + + setStdinFlag(SILENT_STDIN) // Сделать чтоб при вводе не писались символы + setStdinFlag(RENDER_STDIN) // Сделать чтобы символы при вводе обратно выводились + setStdinFlag(DISABLE_STDIN) // Выключить ввод + setStdinFlag(ENABLE_STDIN) // Включить ввод + +## Чтение ввода сырым + +Функция: + + readStdin() -> string + +Она выдает всего один символ: +Чтобы прочитать спец-клавишу, он выдает такие символы по порядку: + + "\\r" + int(is_ctrl) + int(is_alt) + int(is_shift) + key + "\\r" + +## Чтение ивентов с ввода + +Чтобы не читать ввод сырым, вы можете читать ивентами + +Функция: + + pollStdinEvent() -> event + +Ивент при спец-клавише выглядит так: + + { + "type": "key", + "ctrl": is_ctrl, + "alt": is_alt, + "shift": is_shift, + "key": key + } + +Ивент при обычном символе выглядит так: + + { + "type": "char", + "char": char + } + +## Чтение строками + +Функция: + + readLine(on_key=(key, ctrl, alt, shift, content, pos) => [content, pos]) -> string + +На спец-клавишу будет вызываться on_key, +единственное что Backspace, ArrowLeft, ArrowRight уже обрабатываются функцией, +и на них on_key не будет вызываться `) return 0 } else if (args[1] == "stdout") { writeStdout(`# Вывод текста в консоль -Статья в разработке +Функция: + + writeStdout(content) + +всё `) return 0 - } else if (args[1] == "cursor") { - writeStdout(`# Работа с курсором + } else if (args[1] == "terminal") { + writeStdout(`# Работа с остальными функциями консоли -Статья в разработке +Вот функции остальные: + + getTerminal() -> string - получить контент терминала + setTerminal(content) - изменить контент терминала + writeTerminalAtCursor(content) - написать в терминал на курсоре + writeTerminal(content) - написать в терминал в конец + replaceTerminal(content) - изменить терминал и обновить + trimTerminal(length) - обрезать терминал + setCursor(x, y) - установить курсор + clearTerminal() - очистить терминал + updateTerminalWOCursor() - обновить терминал без установки курсора в конец + updateTerminal() - обновить терминал + updateCursor() - обновить курсор + getCursorIndex() -> index - получить индекс курсора в тексте терминала + getCursor() -> [x, y] - получить курсор `) return 0 } else if (args[1] == "packaging") { writeStdout(`# Пакетирование приложений -Статья в разработке +Пакет выглядит примерно так в репозитории (package_name для примера): + +~ repository/package_name/package.json + + { + "name": "package_name", + "version": "0.1.0", + "apps": [ "package_name.js" ], + "configs": [ "package_name.json" ], + + "comment": "fields 'name', 'version', 'apps' and 'configs' are required!!! other fields can be used like this:", + "description": "PackageDescription", + "author": "AuthorName", + "license": "MIT", + "home_page": "https://example.com", + "source_code": "https://github.com/example" + } + +~ repository/package_name/package_name.json + + { + "config_1": "this is your config file", + "config_2": "use it as you need", + } + +~ repository/package_name/package_name.js + + async function main(args) { + let config = JSON.parse(readFile("/config/package_name.json")) // object + + writeStdout("here is your config file content: " + config + "\n") + + return 0 + } + + +`) + return 0 + } else if (args[1] == "graphics") { + writeStdout(`# Отрисовка графики + +Описание использования: + + enableGraphics() // включить графику + var graphics = getGraphics() // получить графику + // var ctx = graphics.context // получить контекст чтоб рисоват + // var width = graphics.width // получить ширину + // var height = graphics.height // получить высоту + var window = createWindow(x, y, w, h, title) + // var width = window.width // получить ширину + // var height = window.height // получить высоту + // var x = window.x // получить x + // var y = window.y // получить y + window.move(x, y, w, h) + // var ctx = window.context // получить контекст чтоб рисоват + window.destroy() // удалить окно + disableGraphics() // отключить графику `) return 0 diff --git a/sys/terminal.js b/sys/terminal.js index cd30c88..18d15cf 100644 --- a/sys/terminal.js +++ b/sys/terminal.js @@ -29,6 +29,14 @@ function trimTerminal(length) { updateTerminal() } +function getTerminal() { + return terminal_text +} + +function setTerminal(content) { + terminal_text = content +} + function clearTerminal() { terminal_text = "" updateTerminal()