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:
@@ -44,7 +44,7 @@
|
||||
РезультатПопыткиПоискаВЦикле = ПопыткаПоиска(АргументыДляЦикла, КонтекстПоиска);
|
||||
|
||||
Если НЕ РезультатПопыткиПоискаВЦикле.Найден Тогда
|
||||
Возврат Новый РезультатПоискаПараметра(РезультатПопыткиПоискаВЦикле.Аргументы, Истина);
|
||||
Возврат Новый РезультатПоискаПараметра(РезультатПопыткиПоискаВЦикле.Аргументы, Истина, РезультатПопыткиПоискаВЦикле.Ошибка);
|
||||
КонецЕсли;
|
||||
|
||||
АргументыДляЦикла = РезультатПопыткиПоискаВЦикле.Аргументы;
|
||||
@@ -62,6 +62,8 @@
|
||||
Возврат Новый РезультатПоискаПараметра(АргументыОбрабатываемые, Ложь);
|
||||
КонецЕсли;
|
||||
|
||||
РезультатПоиска = Новый РезультатПоискаПараметра(АргументыОбрабатываемые, Ложь);
|
||||
|
||||
Для каждого ОпцияПоиска Из Опции Цикл
|
||||
|
||||
Если Не КонтекстПоиска.НеВключенныеОпции[ОпцияПоиска.Значение] = Неопределено Тогда
|
||||
@@ -98,30 +100,32 @@
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
Для каждого АргументПоиска Из Аргументы Цикл
|
||||
|
||||
Лог.Отладка("Ищу аргумент %1", АргументПоиска.Ключ.Имя);
|
||||
Лог.Отладка("Ищу аргумент тип %1", АргументПоиска.Значение);
|
||||
|
||||
КлассПоиска = Новый АргументыПарсера(АргументПоиска.Значение);
|
||||
РезультатПоиска = КлассПоиска.Поиск(АргументыОбрабатываемые, КонтекстПоиска);
|
||||
|
||||
Лог.Отладка("Длина аргументов <%1> ", АргументыОбрабатываемые.Количество());
|
||||
Лог.Отладка("Результат поиска аргумента %1 = <%2>", АргументПоиска.Ключ.Имя, РезультатПоиска.Найден);
|
||||
Лог.Отладка("Длина аргументов после поиска <%1> ", РезультатПоиска.Аргументы.Количество());
|
||||
|
||||
Если РезультатПоиска.Найден Тогда
|
||||
Возврат РезультатПоиска;
|
||||
КонецЕсли;
|
||||
Если Не РезультатПоиска.Найден Тогда
|
||||
Для каждого АргументПоиска Из Аргументы Цикл
|
||||
|
||||
Лог.Отладка("Ищу аргумент %1", АргументПоиска.Ключ.Имя);
|
||||
Лог.Отладка("Ищу аргумент тип %1", АргументПоиска.Значение);
|
||||
|
||||
КлассПоиска = Новый АргументыПарсера(АргументПоиска.Значение);
|
||||
РезультатПоиска = КлассПоиска.Поиск(АргументыОбрабатываемые, КонтекстПоиска);
|
||||
|
||||
Лог.Отладка("Длина аргументов <%1> ", АргументыОбрабатываемые.Количество());
|
||||
Лог.Отладка("Результат поиска аргумента %1 = <%2>", АргументПоиска.Ключ.Имя, РезультатПоиска.Найден);
|
||||
Лог.Отладка("Длина аргументов после поиска <%1> ", РезультатПоиска.Аргументы.Количество());
|
||||
|
||||
Если РезультатПоиска.Найден Тогда
|
||||
Возврат РезультатПоиска;
|
||||
КонецЕсли;
|
||||
|
||||
Если ЗначениеЗаполнено(РезультатПоиска.Ошибка)
|
||||
И ОшибкиПарсера.ОшибкаТребуетВнимания(РезультатПоиска.Ошибка) Тогда
|
||||
Возврат Новый РезультатПоискаПараметра(АргументыОбрабатываемые, Ложь, РезультатПоиска.Ошибка);
|
||||
КонецЕсли;
|
||||
Если ЗначениеЗаполнено(РезультатПоиска.Ошибка)
|
||||
И ОшибкиПарсера.ОшибкаТребуетВнимания(РезультатПоиска.Ошибка) Тогда
|
||||
Возврат Новый РезультатПоискаПараметра(АргументыОбрабатываемые, Ложь, РезультатПоиска.Ошибка);
|
||||
КонецЕсли;
|
||||
|
||||
КонецЦикла;
|
||||
КонецЦикла;
|
||||
КонецЕсли;
|
||||
|
||||
Возврат Новый РезультатПоискаПараметра(АргументыОбрабатываемые, Ложь);
|
||||
Возврат РезультатПоиска;
|
||||
|
||||
КонецФункции
|
||||
|
||||
|
||||
@@ -144,9 +144,14 @@
|
||||
МассивСовпадений.Добавить(НовоеСовпадение(Соединение, РезультатПоиска.Аргументы, ЧистыйКонтекст));
|
||||
КонецЕсли;
|
||||
|
||||
Если ЗначениеЗаполнено(РезультатПоиска.Ошибка)
|
||||
И (Соединение.Обязательное ИЛИ ОшибкиПарсера.ОшибкаТребуетВнимания(РезультатПоиска.Ошибка)) Тогда
|
||||
Результат.Ошибки.Добавить(РезультатПоиска.Ошибка);
|
||||
Если ЗначениеЗаполнено(РезультатПоиска.Ошибка) Тогда
|
||||
Если ОшибкиПарсера.ОшибкаТребуетВнимания(РезультатПоиска.Ошибка) Тогда
|
||||
Результат.Ошибки.Добавить(РезультатПоиска.Ошибка);
|
||||
Возврат Результат;
|
||||
КонецЕсли;
|
||||
Если Соединение.Обязательное И Не РезультатПоиска.Найден Тогда
|
||||
Результат.Ошибки.Добавить(РезультатПоиска.Ошибка);
|
||||
КонецЕсли;
|
||||
КонецЕсли;
|
||||
|
||||
Номер = Номер + 1;
|
||||
|
||||
@@ -519,6 +519,8 @@
|
||||
ТестовыеСлучаи.Добавить(ТестовыйСлучай("-f val", "-f ARG", ОшибкиПарсера.ОшибкаОжидаетсяАргумент("ARG")));
|
||||
ТестовыеСлучаи.Добавить(ТестовыйСлучай("", "[-f] ARG", ОшибкиПарсера.ОшибкаОжидаетсяАргумент("ARG")));
|
||||
|
||||
ТестовыеСлучаи.Добавить(ТестовыйСлучай("ARG -f", "[ANY]", ОшибкиПарсера.ОшибкаТребуетсяЗначениеДляОпции("f")));
|
||||
|
||||
ТестовыеСлучаи.Добавить(ТестовыйСлучай("", "(-f | -b) -s",
|
||||
ОшибкиПарсера.ОшибкаОжидаетсяОпция("f").Текст
|
||||
+ РазделительОшибок
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -72,7 +72,14 @@
|
||||
// Получает поддерживаемые опции
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Массив из Строка
|
||||
// ТаблицаЗначений - таблица с колонками:
|
||||
// * Наименование - Строка - наименование
|
||||
// * НаименованияПараметров - Массив - массив строк, с полными наименованиями опции (например, [-f, --force])
|
||||
// * Описание - Строка - краткое описание
|
||||
// * ПодробноеОписание - Строка - подробное описание
|
||||
// * ПеременнаяОкружения - Строка - переменная окружения, возможно несколько через пробел
|
||||
// * СкрытьЗначение - Булево - признак скрытия значения по умолчанию
|
||||
// * Значение - Произвольный - строковое представление значения по умолчанию
|
||||
Функция ПоддерживаемыеОпции() Экспорт
|
||||
Возврат ОпцииКоманды(Истина, Ложь);
|
||||
КонецФункции
|
||||
@@ -80,7 +87,14 @@
|
||||
// Получает неподдерживаемые опции
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Массив из Строка
|
||||
// ТаблицаЗначений - таблица с колонками:
|
||||
// * Наименование - Строка - наименование
|
||||
// * НаименованияПараметров - Массив - массив строк, с полными наименованиями опции (например, [-f, --force])
|
||||
// * Описание - Строка - краткое описание
|
||||
// * ПодробноеОписание - Строка - подробное описание
|
||||
// * ПеременнаяОкружения - Строка - переменная окружения, возможно несколько через пробел
|
||||
// * СкрытьЗначение - Булево - признак скрытия значения по умолчанию
|
||||
// * Значение - Произвольный - строковое представление значения по умолчанию
|
||||
Функция НеподдерживаемыеОпции() Экспорт
|
||||
Возврат ОпцииКоманды(Ложь, Истина);
|
||||
КонецФункции
|
||||
@@ -920,40 +934,47 @@
|
||||
Функция ОпцииКоманды(ВключатьПоддерживаемые = Истина, ВключатьНеподдерживаемые = Истина) Экспорт
|
||||
|
||||
Приложение = СоздатьКонсольноеПриложение(ВключатьПоддерживаемые, ВключатьНеподдерживаемые);
|
||||
|
||||
МассивОпций = Новый Массив();
|
||||
ТаблицаОпций = Приложение.ПолучитьКоманду().ПолучитьТаблицуОпций();
|
||||
|
||||
Для Каждого СтрокаТаблицы Из ТаблицаОпций Цикл
|
||||
Для Каждого Опция Из СтрокаТаблицы.НаименованияПараметров Цикл
|
||||
МассивОпций.Добавить(Опция);
|
||||
КонецЦикла;
|
||||
КонецЦикла;
|
||||
|
||||
Возврат МассивОпций;
|
||||
Возврат ТаблицаОпций;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Процедура ОбработатьИсключениеОбработкиКоманды(ИнформацияОбОшибке)
|
||||
|
||||
Текст = КраткоеПредставлениеОшибки(ИнформацияОбОшибке);
|
||||
ПодстрокаПоиска = "Ошибка чтения параметров команды: Неожидаемая опция";
|
||||
Если СтрНачинаетсяС(Текст, ПодстрокаПоиска) Тогда
|
||||
Опция = СокрЛП(СтрЗаменить(Текст, ПодстрокаПоиска, ""));
|
||||
|
||||
// Неожидаемая опция
|
||||
ПодстрокаПоиска = "Неожидаемая опция";
|
||||
Инд = СтрНайти(Текст, ПодстрокаПоиска);
|
||||
Если Инд Тогда
|
||||
Опция = СокрЛП(Сред(Текст, Инд + СтрДлина(ПодстрокаПоиска)));
|
||||
ТекстОшибки = СтрШаблон("Опция %1 неизвестна", Опция);
|
||||
ИсходящиеОшибки.Добавить(НоваяОшибка(ТекстОшибки, Истина));
|
||||
Иначе
|
||||
ВызватьИсключение Текст;
|
||||
Возврат;
|
||||
КонецЕсли;
|
||||
|
||||
// Опция должна содержать значение
|
||||
ПодстрокаПоиска = "должна содержать значение";
|
||||
Инд = СтрНайти(Текст, ":");
|
||||
Если СтрНайти(Текст, ПодстрокаПоиска) И Инд Тогда
|
||||
ТекстОшибки = СокрЛП(Сред(Текст, Инд + 1));
|
||||
ИсходящиеОшибки.Добавить(НоваяОшибка(ТекстОшибки, Истина));
|
||||
Возврат;
|
||||
КонецЕсли;
|
||||
|
||||
ВызватьИсключение Текст;
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура ДополнитьОшибкиНеподдерживаемыеОпции(Команда)
|
||||
|
||||
НеподдерживаемыеОпции = НеподдерживаемыеОпции();
|
||||
|
||||
Для Каждого Опция Из НеподдерживаемыеОпции Цикл
|
||||
Значение = Команда.ЗначениеОпции(Опция);
|
||||
Для Каждого Строка Из НеподдерживаемыеОпции Цикл
|
||||
Значение = Команда.ЗначениеОпции(Строка.Наименование);
|
||||
Если ЗначениеЗаполнено(Значение) Тогда
|
||||
ТекстОшибки = СтрШаблон("Опция %1 не поддерживается", Опция);
|
||||
ТекстОшибки = СтрШаблон("Опция %1 не поддерживается", СтрСоединить(Строка.НаименованияПараметров, ", "));
|
||||
ИсходящиеОшибки.Добавить(НоваяОшибка(ТекстОшибки));
|
||||
КонецЕсли;
|
||||
КонецЦикла;
|
||||
|
||||
@@ -32,11 +32,10 @@
|
||||
Результат = Новый ТекстовыйДокумент();
|
||||
|
||||
КонвертерКомандыCURL = Новый КонвертерКомандыCURL();
|
||||
ПоддерживаемыеОпции = КонвертерКомандыCURL.ПоддерживаемыеОпции();
|
||||
ПоддерживаемыеОпцииСоответствие = Новый Соответствие();
|
||||
|
||||
Для Каждого Опция Из ПоддерживаемыеОпции Цикл
|
||||
ПоддерживаемыеОпцииСоответствие.Вставить(Опция, Истина);
|
||||
Для Каждого Строка Из КонвертерКомандыCURL.ПоддерживаемыеОпции() Цикл
|
||||
ПоддерживаемыеОпцииСоответствие.Вставить(Строка.Наименование, Истина);
|
||||
КонецЦикла;
|
||||
|
||||
Для Каждого Строка Из Опции Цикл
|
||||
|
||||
Reference in New Issue
Block a user