1
0
mirror of https://github.com/alei1180/curlone.git synced 2025-11-25 23:01:55 +02:00

Merge pull request #66 from Stivo182/feature/65-display-error-web

Вывод ошибок конвертации
This commit is contained in:
Alexander Osadchy
2024-12-28 09:07:15 +04:00
committed by GitHub
6 changed files with 135 additions and 48 deletions

View File

@@ -44,7 +44,7 @@
РезультатПопыткиПоискаВЦикле = ПопыткаПоиска(АргументыДляЦикла, КонтекстПоиска);
Если НЕ РезультатПопыткиПоискаВЦикле.Найден Тогда
Возврат Новый РезультатПоискаПараметра(РезультатПопыткиПоискаВЦикле.Аргументы, Истина);
Возврат Новый РезультатПоискаПараметра(РезультатПопыткиПоискаВЦикле.Аргументы, Истина, РезультатПопыткиПоискаВЦикле.Ошибка);
КонецЕсли;
АргументыДляЦикла = РезультатПопыткиПоискаВЦикле.Аргументы;
@@ -62,6 +62,8 @@
Возврат Новый РезультатПоискаПараметра(АргументыОбрабатываемые, Ложь);
КонецЕсли;
РезультатПоиска = Новый РезультатПоискаПараметра(АргументыОбрабатываемые, Ложь);
Для каждого ОпцияПоиска Из Опции Цикл
Если Не КонтекстПоиска.НеВключенныеОпции[ОпцияПоиска.Значение] = Неопределено Тогда
@@ -98,30 +100,32 @@
КонецЦикла;
Для каждого АргументПоиска Из Аргументы Цикл
Лог.Отладка("Ищу аргумент %1", АргументПоиска.Ключ.Имя);
Лог.Отладка("Ищу аргумент тип %1", АргументПоиска.Значение);
КлассПоиска = Новый АргументыПарсера(АргументПоиска.Значение);
РезультатПоиска = КлассПоиска.Поиск(АргументыОбрабатываемые, КонтекстПоиска);
Лог.Отладка("Длина аргументов <%1> ", АргументыОбрабатываемые.Количество());
Лог.Отладка("Результат поиска аргумента %1 = <%2>", АргументПоиска.Ключ.Имя, РезультатПоиска.Найден);
Лог.Отладка("Длина аргументов после поиска <%1> ", РезультатПоиска.Аргументы.Количество());
Если РезультатПоиска.Найден Тогда
Возврат РезультатПоиска;
КонецЕсли;
Если Не РезультатПоиска.Найден Тогда
Для каждого АргументПоиска Из Аргументы Цикл
Лог.Отладка("Ищу аргумент %1", АргументПоиска.Ключ.Имя);
Лог.Отладка("Ищу аргумент тип %1", АргументПоиска.Значение);
КлассПоиска = Новый АргументыПарсера(АргументПоиска.Значение);
РезультатПоиска = КлассПоиска.Поиск(АргументыОбрабатываемые, КонтекстПоиска);
Лог.Отладка("Длина аргументов <%1> ", АргументыОбрабатываемые.Количество());
Лог.Отладка("Результат поиска аргумента %1 = <%2>", АргументПоиска.Ключ.Имя, РезультатПоиска.Найден);
Лог.Отладка("Длина аргументов после поиска <%1> ", РезультатПоиска.Аргументы.Количество());
Если РезультатПоиска.Найден Тогда
Возврат РезультатПоиска;
КонецЕсли;
Если ЗначениеЗаполнено(РезультатПоиска.Ошибка)
И ОшибкиПарсера.ОшибкаТребуетВнимания(РезультатПоиска.Ошибка) Тогда
Возврат Новый РезультатПоискаПараметра(АргументыОбрабатываемые, Ложь, РезультатПоиска.Ошибка);
КонецЕсли;
Если ЗначениеЗаполнено(РезультатПоиска.Ошибка)
И ОшибкиПарсера.ОшибкаТребуетВнимания(РезультатПоиска.Ошибка) Тогда
Возврат Новый РезультатПоискаПараметра(АргументыОбрабатываемые, Ложь, РезультатПоиска.Ошибка);
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЕсли;
Возврат Новый РезультатПоискаПараметра(АргументыОбрабатываемые, Ложь);
Возврат РезультатПоиска;
КонецФункции

View File

@@ -144,9 +144,14 @@
МассивСовпадений.Добавить(НовоеСовпадение(Соединение, РезультатПоиска.Аргументы, ЧистыйКонтекст));
КонецЕсли;
Если ЗначениеЗаполнено(РезультатПоиска.Ошибка)
И (Соединение.Обязательное ИЛИ ОшибкиПарсера.ОшибкаТребуетВнимания(РезультатПоиска.Ошибка)) Тогда
Результат.Ошибки.Добавить(РезультатПоиска.Ошибка);
Если ЗначениеЗаполнено(РезультатПоиска.Ошибка) Тогда
Если ОшибкиПарсера.ОшибкаТребуетВнимания(РезультатПоиска.Ошибка) Тогда
Результат.Ошибки.Добавить(РезультатПоиска.Ошибка);
Возврат Результат;
КонецЕсли;
Если Соединение.Обязательное И Не РезультатПоиска.Найден Тогда
Результат.Ошибки.Добавить(РезультатПоиска.Ошибка);
КонецЕсли;
КонецЕсли;
Номер = Номер + 1;

View File

@@ -519,6 +519,8 @@
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-f val", "-f ARG", ОшибкиПарсера.ОшибкаОжидаетсяАргумент("ARG")));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("", "[-f] ARG", ОшибкиПарсера.ОшибкаОжидаетсяАргумент("ARG")));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("ARG -f", "[ANY]", ОшибкиПарсера.ОшибкаТребуетсяЗначениеДляОпции("f")));
ТестовыеСлучаи.Добавить(ТестовыйСлучай("", "(-f | -b) -s",
ОшибкиПарсера.ОшибкаОжидаетсяОпция("f").Текст
+ РазделительОшибок

View File

@@ -52,6 +52,7 @@
overflow-y: scroll;
overflow-x: scroll;
margin-bottom: 5px;
box-sizing: border-box;
}
textarea::placeholder {
@@ -84,6 +85,7 @@
resize: vertical;
overflow: auto;
margin-bottom: 5px;
box-sizing: border-box;
}
pre.shiki {
@@ -98,6 +100,29 @@
-ms-user-select: all; /* Internet Explorer/Edge */
user-select: all; /* Chrome and Opera */
}
#warnings, #errors {
font-size: 12px;
padding: 8px 12px;
margin: 10px 0px;
border-radius: 3px;
border: 1px solid;
line-height: 1.5;
width: 100%;
box-sizing: border-box;
}
#warnings {
color: #1f2328 !important;
border-color: #fff8c5;
background-color: #fff8c5;
}
#errors {
color: #1f2328 !important;
border-color: #ffebe9;
background-color: #ffebe9;
}
</style>
<script type="module">
import { createHighlighter } from 'https://esm.sh/shiki@1.24.4';
@@ -118,14 +143,21 @@
function convertOnload() {
let output = document.getElementById("output");
let errors = [];
outputText = "";
if(this.status === 200){
outputText = this.response.result;
errors = this.response.errors;
} else {
outputText = "";
errors.push({
text: 'Неудалось выполнить запрос',
critical: true
});
}
setOutput(outputText);
displayErros(errors);
}
function setOutput(code){
@@ -139,6 +171,28 @@
navigator.clipboard.writeText(text);
}
function displayErros(errors) {
let elementWarnings = document.getElementById("warnings");
let elementErrors = document.getElementById("errors");
let textWarnings = "";
let textErrors = "";
errors.forEach((record) => {
if(record.critical){
textErrors += record.text + '<br/>';
} else {
textWarnings += record.text + '<br/>';
}
});
elementWarnings.innerHTML = textWarnings;
elementWarnings.style.display = textWarnings.length > 0 ? 'block' : 'none';
elementErrors.innerHTML = textErrors;
elementErrors.style.display = textErrors.length > 0 ? 'block' : 'none';
}
document.getElementById("convert").addEventListener("click", function (e) {
let formData = new FormData(document.forms.curl);
let command = formData.get("command");
@@ -173,6 +227,7 @@
<textarea name="command" id="command" cols="120" rows="9" spellcheck="false" placeholder="curl example.com" required autofocus></textarea>
<input type="button" id="convert" value="Конвертировать">
</form>
<div id="errors" style="display: none;"></div>
</div>
</div>
<div class="container">
@@ -180,6 +235,7 @@
<div>Код 1C</div>
<div id="output" class="output selectable"></div>
<input type="button" id="copy" value="Скопировать">
<div id="warnings" style="display: none;"></div>
</div>
</div>
<div class="container">

View File

@@ -72,7 +72,14 @@
// Получает поддерживаемые опции
//
// Возвращаемое значение:
// Массив из Строка
// ТаблицаЗначений - таблица с колонками:
// * Наименование - Строка - наименование
// * НаименованияПараметров - Массив - массив строк, с полными наименованиями опции (например, [-f, --force])
// * Описание - Строка - краткое описание
// * ПодробноеОписание - Строка - подробное описание
// * ПеременнаяОкружения - Строка - переменная окружения, возможно несколько через пробел
// * СкрытьЗначение - Булево - признак скрытия значения по умолчанию
// * Значение - Произвольный - строковое представление значения по умолчанию
Функция ПоддерживаемыеОпции() Экспорт
Возврат ОпцииКоманды(Истина, Ложь);
КонецФункции
@@ -80,7 +87,14 @@
// Получает неподдерживаемые опции
//
// Возвращаемое значение:
// Массив из Строка
// ТаблицаЗначений - таблица с колонками:
// * Наименование - Строка - наименование
// * НаименованияПараметров - Массив - массив строк, с полными наименованиями опции (например, [-f, --force])
// * Описание - Строка - краткое описание
// * ПодробноеОписание - Строка - подробное описание
// * ПеременнаяОкружения - Строка - переменная окружения, возможно несколько через пробел
// * СкрытьЗначение - Булево - признак скрытия значения по умолчанию
// * Значение - Произвольный - строковое представление значения по умолчанию
Функция НеподдерживаемыеОпции() Экспорт
Возврат ОпцииКоманды(Ложь, Истина);
КонецФункции
@@ -920,40 +934,47 @@
Функция ОпцииКоманды(ВключатьПоддерживаемые = Истина, ВключатьНеподдерживаемые = Истина) Экспорт
Приложение = СоздатьКонсольноеПриложение(ВключатьПоддерживаемые, ВключатьНеподдерживаемые);
МассивОпций = Новый Массив();
ТаблицаОпций = Приложение.ПолучитьКоманду().ПолучитьТаблицуОпций();
Для Каждого СтрокаТаблицы Из ТаблицаОпций Цикл
Для Каждого Опция Из СтрокаТаблицы.НаименованияПараметров Цикл
МассивОпций.Добавить(Опция);
КонецЦикла;
КонецЦикла;
Возврат МассивОпций;
Возврат ТаблицаОпций;
КонецФункции
Процедура ОбработатьИсключениеОбработкиКоманды(ИнформацияОбОшибке)
Текст = КраткоеПредставлениеОшибки(ИнформацияОбОшибке);
ПодстрокаПоиска = "Ошибка чтения параметров команды: Неожидаемая опция";
Если СтрНачинаетсяС(Текст, ПодстрокаПоиска) Тогда
Опция = СокрЛП(СтрЗаменить(Текст, ПодстрокаПоиска, ""));
// Неожидаемая опция
ПодстрокаПоиска = "Неожидаемая опция";
Инд = СтрНайти(Текст, ПодстрокаПоиска);
Если Инд Тогда
Опция = СокрЛП(Сред(Текст, Инд + СтрДлина(ПодстрокаПоиска)));
ТекстОшибки = СтрШаблон("Опция %1 неизвестна", Опция);
ИсходящиеОшибки.Добавить(НоваяОшибка(ТекстОшибки, Истина));
Иначе
ВызватьИсключение Текст;
Возврат;
КонецЕсли;
// Опция должна содержать значение
ПодстрокаПоиска = "должна содержать значение";
Инд = СтрНайти(Текст, ":");
Если СтрНайти(Текст, ПодстрокаПоиска) И Инд Тогда
ТекстОшибки = СокрЛП(Сред(Текст, Инд + 1));
ИсходящиеОшибки.Добавить(НоваяОшибка(ТекстОшибки, Истина));
Возврат;
КонецЕсли;
ВызватьИсключение Текст;
КонецПроцедуры
Процедура ДополнитьОшибкиНеподдерживаемыеОпции(Команда)
НеподдерживаемыеОпции = НеподдерживаемыеОпции();
Для Каждого Опция Из НеподдерживаемыеОпции Цикл
Значение = Команда.ЗначениеОпции(Опция);
Для Каждого Строка Из НеподдерживаемыеОпции Цикл
Значение = Команда.ЗначениеОпции(Строка.Наименование);
Если ЗначениеЗаполнено(Значение) Тогда
ТекстОшибки = СтрШаблон("Опция %1 не поддерживается", Опция);
ТекстОшибки = СтрШаблон("Опция %1 не поддерживается", СтрСоединить(Строка.НаименованияПараметров, ", "));
ИсходящиеОшибки.Добавить(НоваяОшибка(ТекстОшибки));
КонецЕсли;
КонецЦикла;

View File

@@ -32,11 +32,10 @@
Результат = Новый ТекстовыйДокумент();
КонвертерКомандыCURL = Новый КонвертерКомандыCURL();
ПоддерживаемыеОпции = КонвертерКомандыCURL.ПоддерживаемыеОпции();
ПоддерживаемыеОпцииСоответствие = Новый Соответствие();
Для Каждого Опция Из ПоддерживаемыеОпции Цикл
ПоддерживаемыеОпцииСоответствие.Вставить(Опция, Истина);
Для Каждого Строка Из КонвертерКомандыCURL.ПоддерживаемыеОпции() Цикл
ПоддерживаемыеОпцииСоответствие.Вставить(Строка.Наименование, Истина);
КонецЦикла;
Для Каждого Строка Из Опции Цикл