aiCodeBlock
Компонент aiCodeBlock отображает фрагмент исходного кода с подсветкой синтаксиса, необязательной меткой языка и действиями для копирования и переноса строк кода.
XML-элемент |
|
|---|---|
Java-класс |
|
Используйте его везде, где приложение показывает код. Внутри диалога он также используется автоматически: aiMessageList отображает каждый блок кода из сообщения ассистента как aiCodeBlock, поэтому код в чате выглядит и ведет себя так же, как код в других местах приложения.
Основы
Объявите пространство имен aichat в XML-дескрипторе экрана:
<view xmlns="http://jmix.io/schema/flowui/view"
xmlns:aichat="http://jmix.io/schema/aichat/ui"
title="msg://CodeBlockView.title">
| Studio автоматически добавляет пространство имен, когда вы добавляете компонент с помощью действия Add Component на верхней панели действий. См. Палитра компонентов. |
Затем объявите блок и поместите исходный код во вложенный элемент code:
<aichat:aiCodeBlock id="basicsBlock" language="sql">
<aichat:code><![CDATA[select c.name, count(o.id) as order_count
from CUSTOMER c
left join ORDER_ o on o.customer_id = c.id
group by c.name
order by order_count desc]]></aichat:code>
</aichat:aiCodeBlock>
|
Записывайте вложенный элемент с префиксом |
Блок принимает ширину своего содержимого и никогда не превышает ширину своего контейнера.
Код
Задать код можно двумя способами.
Вложенный элемент code содержит многострочный исходный код. Оберните его в CDATA, чтобы исходный код передавался без изменений, как в примере выше.
Атрибут code содержит одну строку и принимает ключ сообщения, что удобно, когда исходный код хранится в пакете сообщений:
<aichat:aiCodeBlock id="bundleBlock"
language="bash"
code="msg://runCommand.code"/>
com.company.demo.view.codeblock/runCommand.code=./gradlew -Pvaadin.productionMode=true bootJar
Если заданы оба способа, приоритет имеет вложенный элемент. Если элемент code присутствует, но пуст, загрузка экрана завершается ошибкой, чтобы такой элемент не мог незаметно перекрыть код, объявленный в атрибуте.
Можно не задавать ни один из них. Тогда блок отображается пустым. Это обычное состояние блока, который позже заполняет контроллер.
Язык
Атрибут language выполняет две функции: он выводит метку в заголовке блока и сообщает механизму подсветки, какую грамматику применять.
AiCodeBlockLanguage содержит распространенные идентификаторы языков в виде констант:
AiCodeBlock codeBlock = uiComponents.create(AiCodeBlock.class);
codeBlock.setLanguage(AiCodeBlockLanguage.JAVA);
codeBlock.setCode("""
@Autowired
private Notifications notifications;
@Subscribe("saveButton")
public void onSaveButtonClick(final ClickEvent<JmixButton> event) {
notifications.show("Saved");
}""");
programmaticBox.add(codeBlock);
Константы введены для удобства и не ограничивают набор допустимых значений: атрибут принимает любую строку. Значение, которое механизм подсветки не распознает, не является ошибкой: код отображается как простой текст.
Без языка у блока совсем нет строки заголовка. Вместо этого действия располагаются поверх кода в верхнем углу со стороны конца строки, а код получает отступ, чтобы под ними ничего не отображалось:
Для подсветки нужен язык, но эти две настройки не взаимозаменяемы. Если задать highlight="false" для блока с языком, заголовок и метка сохранятся, а код отобразится без подсветки. Если не задавать язык, исчезнет и заголовок.
Действия копирования и переноса строк
Действие копирования копирует исходный код блока в буфер обмена, всегда исходный текст и никогда разметку подсветки, и на короткое время показывает подтверждение.
Действие переноса строк переключает блок между горизонтальной прокруткой и мягким переносом строк. Его значок и всплывающая подсказка описывают, что произойдет при следующем нажатии, а не текущее состояние. При замене кода блока перенос строк возвращается к объявленному значению.
Любое из действий можно убрать с помощью copyActionEnabled или wrapActionEnabled. Отключенное действие вообще не отображается:
<aichat:aiCodeBlock id="actionsDisabledBlock"
language="properties"
copyActionEnabled="false"
wrapActionEnabled="false">
<aichat:code><![CDATA[main.datasource.url=jdbc:postgresql://localhost:5432/demo
main.datasource.username=demo
jmix.core.available-locales=en,de]]></aichat:code>
</aichat:aiCodeBlock>
|
Действие копирования ничего не сообщает об ошибке, если браузер запрещает запись в буфер обмена: ничего не копируется, и пользователь об этом не узнает. Обычная причина — приложение работает по простому HTTP, а браузеры разрешают доступ к буферу обмена только в безопасных контекстах. Копирование работает по HTTPS и на |
Локализация
Надписи действий копирования и переноса строк берутся из пакета сообщений дополнения, из ключей aiCodeBlock.i18n.*: copy, copied, wrapOn и wrapOff. Переопределите эти ключи в пакете сообщений приложения, чтобы изменить надписи действий везде.
Чтобы изменить надписи действий одного блока, добавьте вложенный элемент i18n:
<aichat:aiCodeBlock id="i18nBlock" language="yaml">
<aichat:code><![CDATA[name: demo
services:
db:
image: postgres:17
environment:
POSTGRES_DB: demo
POSTGRES_PASSWORD: demo]]></aichat:code>
<aichat:i18n copy="msg://i18nBlock.copy"
copied="msg://i18nBlock.copied"/>
</aichat:aiCodeBlock>
com.company.demo.view.codeblock/i18nBlock.copy=Copy the compose file
com.company.demo.view.codeblock/i18nBlock.copied=Compose file copied
В примере выше действие переноса строк сохраняет стандартные надписи. О том, как сочетаются эти два уровня, см. Приоритет.
Стилизация
Блок открывает свои внутренние элементы как shadow parts, к которым можно обращаться с помощью селектора ::part().
Следующие свойства стилей можно использовать в таблицах стилей CSS, чтобы настроить внешний вид этого компонента.
| Имя | Описание |
|---|---|
|
Фон блока. |
|
Радиус скругления углов блока. |
|
Семейство шрифтов кода. |
|
Размер шрифта кода. |
|
Промежуток между кнопками действий. |
|
Размер значков действий. |
|
Цвет кода, у которого нет синтаксической роли. |
|
Цвет ключевых слов языка. |
|
Цвет строковых литералов. |
|
Цвет числовых литералов. |
|
Цвет комментариев. |
|
Цвет имен в объявлениях, например функций и классов. |
|
Цвет имен типов. |
|
Цвет встроенных идентификаторов языка. |
|
Цвет имен атрибутов и свойств. |
|
Цвет тегов разметки. |
|
Цвет метаданных, например аннотаций и директив препроцессора. |
|
Цвет галочки, которая подтверждает копирование. |
|
Значок действия копирования. |
|
Значок, который отображается, пока показано подтверждение копирования. |
|
Значок действия переноса строк, когда перенос выключен. |
|
Значок действия переноса строк, когда перенос включен. |
Свойства значков содержат изображение, которое применяется как маска, поэтому переопределение такого свойства заменяет соответствующий значок.
Компоненты стилизованы для обеих тем Jmix, Aura и Lumo, и используют собственные токены темы для рамок фокуса, границ, радиусов скругления и отступов, поэтому у перечисленных выше свойств нет единого значения по умолчанию. Поддерживаются темный режим, режим высокой контрастности и режим уменьшения движения, а разметка задана через свойства, не зависящие от направления, поэтому компоненты следуют направлению текста документа.
Атрибуты
aiCodeBlock имеет следующие уникальные атрибуты:
| Имя | Описание | По умолчанию |
|---|---|---|
Задает код в виде однострочного значения, напрямую или из пакета сообщений. Вложенный элемент code имеет приоритет. См. Код. |
— |
|
Задает, переносятся ли строки кода вместо горизонтальной прокрутки. См. Действия копирования и переноса строк. |
|
|
Задает, есть ли у блока действие копирования. |
|
|
Задает, применяется ли подсветка синтаксиса. Для подсветки также нужно задать language. |
|
|
Задает язык кода, который отображается в виде метки и используется для подсветки. Допускается любая строка. См. Язык. |
— |
|
Задает, есть ли у блока действие переноса строк. |
|
aiCodeBlock имеет следующие общие атрибуты:
Элементы
code
Элемент code содержит исходный код блока. Его содержимое берется без изменений, поэтому оно может занимать несколько строк. См. Код.
i18n
Элемент i18n изменяет надписи действий этого блока. Он поддерживает атрибуты copy, copied, wrapOn и wrapOff, каждый из которых принимает ключ сообщения. Для не заданных атрибутов сохраняются значения из пакета сообщений. См. Локализация.