diff --git a/lua_script/urjenc.lua b/lua_script/urjenc.lua new file mode 100644 index 0000000..2af9e44 --- /dev/null +++ b/lua_script/urjenc.lua @@ -0,0 +1,144 @@ +#!/usr/bin/lua + +-- Функция для вывода текста красным цветом +function print_red(text) + -- Коды ANSI для красного цвета + io.write("\27[31m" .. text .. "\27[0m\n") +end + +-- Функция для кодирования URL +function url_encode(str) + if str == nil then + return "" + end + + local result = "" + for i = 1, #str do + local c = str:sub(i, i) + local byte = string.byte(c) + + -- Оставляем буквы, цифры и некоторые специальные символы как есть + if (byte >= 48 and byte <= 57) or -- 0-9 + (byte >= 65 and byte <= 90) or -- A-Z + (byte >= 97 and byte <= 122) or -- a-z + c == '-' or c == '_' or c == '.' or c == '~' or + c == '/' or c == ':' or c == '?' or c == '&' or + c == '=' or c == '#' or c == '@' or c == '!' or + c == '$' or c == "'" or c == '(' or c == ')' or + c == '*' or c == '+' or c == ',' or c == ';' then + result = result .. c + else + -- Кодируем все остальные символы + result = result .. string.format("%%%02X", byte) + end + end + + return result +end + +-- Функция для проверки формата URL +function validate_url_format(url) + -- Проверяем базовую структуру URL + local pattern = "^http://localhost:9080/quick/create/users/[%w_]+/.*$" + if not url:match(pattern) then + return false, "URL does not match expected format" + end + + -- Проверяем наличие JSON части + local json_start = url:find("{") + if not json_start then + return false, "No JSON part found in URL" + end + + -- Проверяем, что JSON часть корректна (хотя бы базово) + local json_part = url:sub(json_start) + -- Используем простую проверку на наличие фигурных скобок + local open_brace = json_part:find("{") + local close_brace = json_part:find("}") + + if not open_brace or not close_brace or close_brace < open_brace then + return false, "Invalid JSON format" + end + + return true +end + +-- Функция для обработки URL +function process_url(url) + -- Проверяем формат URL + local is_valid, error_msg = validate_url_format(url) + if not is_valid then + error("Error. A URL-formatted string was expected") + end + + -- Находим начало JSON части + local json_start = url:find("{") + + -- Разделяем URL на части: до JSON и сам JSON + local url_part = url:sub(1, json_start - 1) + local json_part = url:sub(json_start) + + -- Кодируем JSON часть + local encoded_json = url_encode(json_part) + + -- Объединяем результаты + return url_part .. encoded_json +end + +-- Основная функция +function main() + print() -- Пустая строка перед Urjenc + print("Urjenc") + print() -- Пустая строка после Urjenc + + while true do + -- Печатаем приглашение без перевода строки + io.write("Enter a URL:$ ") + io.flush() + + -- Читаем ввод пользователя + local input = io.read() + + -- Проверяем команды выхода + if input == "exit" or input == "quit" then + break + end + + -- Проверяем, что ввод не пустой + if input and input ~= "" then + local success, result = pcall(function() + -- Обрабатываем URL + local transformed_url = process_url(input) + + -- Записываем результат в файл + local file = io.open("transformation.txt", "w") + if not file then + error("Cannot open file for writing") + end + + file:write(transformed_url) + file:close() + + return transformed_url + end) + + -- Проверяем результат операции + if success then + print("transformation successfull") + else + print_red("transformation failed") + if result:match("Error. A URL%-formatted string was expected") then + print_red("Error. A URL-formatted string was expected") + else + print_red("Error: " .. tostring(result)) + end + end + end + + -- Добавляем пустую строку перед следующим приглашением + print() + end +end + +-- Запускаем программу +main()