diff --git a/app/view.py b/app/view.py
index b83b2c0..caf339d 100644
--- a/app/view.py
+++ b/app/view.py
@@ -67,6 +67,20 @@ def render_job(job: dict) -> str:
# Внутри в тексте
# закрыла бы тег и всё, что дальше, браузер прочитал бы как разметку.
+ if sentences:
+ roles_block = (
+ '
Вставьте ответ модели - строку из букв M и C, '
+ 'по одной на предложение. Диалог соберётся ниже, и станет видно, '
+ 'где ошибка: в тексте от сервиса или в расстановке ролей.
'
+ '')
+ else:
+ # Массив предложений появился в 0.14.0. Без него собирать диалог не из
+ # чего, и молчаливо пустой блок выглядел бы поломкой страницы.
+ roles_block = (
+ 'В этом результате нет разбивки на предложения: '
+ 'запись обработана версией сервиса старше 0.14.0. Отправьте её заново, '
+ 'чтобы собрать диалог по ролям.
')
+
payload = json.dumps(
[{"n": s["n"], "text": s["text"], "start": s["start"]} for s in sentences],
ensure_ascii=False).replace("<", "\\u003c").replace("\u2028", "\\u2028")
@@ -119,10 +133,7 @@ def render_job(job: dict) -> str:
{"".join(rows) or "реплик нет
"}
Разметка ролей
-Вставьте ответ модели - строку из букв M и C, по одной
-на предложение. Диалог соберётся ниже, и станет видно, где ошибка:
-в тексте от сервиса или в расстановке ролей.
-
+{roles_block}
@@ -151,5 +162,5 @@ function draw() {{
buf.push(s.text.replace(/[&<>]/g, c => ({{'&':'&','<':'<','>':'>'}})[c])); }});
flush(); out.innerHTML = html;
}}
-box.addEventListener('input', draw);
+if (box) box.addEventListener('input', draw);