MARKDOWN-SOURCE.md: где взять готовую отрисовку markdown (ai/assistent, 4 файла)

This commit is contained in:
Porfiry
2026-09-19 01:26:51 +03:00
parent 9ec6806970
commit 10cf44d2e2
3 changed files with 156 additions and 4 deletions
+146
View File
@@ -0,0 +1,146 @@
# Откуда брать отрисовку Markdown
Готовый рендер Markdown для Compose уже написан и лежит в репозитории **`ai/assistent`**.
Писать своё не надо — надо взять это.
**Репозиторий:** https://git.binom.pw/ai/assistent (ветка `main`)
**Проверено на коммите:** `2c5b3f9` (файлы добавлены в `1acced4`, 2026-08-13)
**Важно:** репозиторий приватный. Браузерная ссылка откроется только у залогиненного;
для копирования файлов из скрипта — RAW-адреса с логином/паролем (ниже).
---
## Что именно копировать: 4 файла
Всё лежит в двух модулях. Модуль `client-shared` — общий, собирается под **JVM + Compose**
(то есть ровно наш случай, десктоп), не под Android.
### 1. Модель данных — `MarkdownSegment.kt` (59 строк)
```
client-shared/src/main/kotlin/pw/binom/client/shared/markdown/MarkdownSegment.kt
```
Что внутри: типы кусков разметки — текст, блок кода, таблица, картинка, разделитель.
Плюс описание стилевого участка: жирный, курсив, код, зачёркнутый, ссылка.
Зависимостей от Compose нет вообще — чистые данные.
### 2. Парсер — `MarkdownParserImpl.kt` (353 строки)
```
client-shared/src/main/kotlin/pw/binom/client/shared/markdown/MarkdownParserImpl.kt
```
Точка входа: `parseMarkdown(markdown: String): List<MarkdownSegment>`.
Единственная внешняя зависимость — библиотека парсера `ru.otpbank.ai:markdown` (см. ниже).
От Композа не зависит.
### 3. Отрисовка — `MarkdownRendering.kt` (377 строк)
```
client-shared/src/main/kotlin/pw/binom/client/shared/ui/MarkdownRendering.kt
```
Точка входа:
`renderMarkdownSegments(content, textColor, fontSize, isBubbleScrolled, onUrlClick)`.
Внутри: текст с inline-стилями, кликабельные ссылки, блоки кода с копированием,
таблицы, картинки, разделители. Самый жирный файл и самая нужная часть.
### 4. Десктопная обёртка — `MarkdownRenderer.kt` (25 строк)
```
client/src/main/kotlin/pw/binom/client/ui/MarkdownRenderer.kt
```
Открытие ссылок в системном браузере (`Desktop.getDesktop().browse`) и
`parseMultiline`. Модуль `client` в assistent — это **десктопный** клиент на
Compose Desktop, так что пример использования ровно наш.
---
## Что копировать НЕ надо
- `client-shared/src/main/kotlin/pw/binom/client/shared/ui/MessageBubble.kt` (789 строк) —
пузырь сообщения целиком. Тянет за собой модуль `chat-common` (модели сообщений),
из плюшек — выделение текста и контекстное меню. Для отрисовки разметки не нужен,
но полезен, если понадобится пример.
---
## Зависимости
Одна, и она есть в нашем Nexus:
```kotlin
implementation("ru.otpbank.ai:markdown:0.51.0")
```
Репозиторий в `build.gradle.kts` (без него не соберётся):
```kotlin
maven {
url = uri("http://192.168.76.117/repository/developerspace-prod-mvn-hosted/")
isAllowInsecureProtocol = true
}
```
Проверено: в Nexus лежит, версии с `0.1.0` по `0.51.0`, файл `markdown-0.51.0.pom`
отдаёт `HTTP 200`.
Из Compose нужны: `compose.material3`, `compose.foundation`, `compose.ui`,
`compose.materialIconsExtended` (иконка копирования в блоках кода).
## Опубликован ли `client-shared` как библиотека
**Нет.** Проверено поиском в Nexus (`pw/binom/client-shared`, `pw/binom/chat-common`) —
`HTTP 404`. Поэтому вариантов два: либо копируем исходники к себе (4 файла выше),
либо сперва публикуем модуль. Копирование проще.
---
## Как копировать (RAW-адреса, работают с логином)
Адрес вида `/raw/branch/main/<путь>` отдаёт файл. Проверено: `HTTP 200`, 1805 байт —
совпадает с локальным размером.
```bash
BASE=https://git.binom.pw/ai/assistent/raw/branch/main
AUTH='subochev:ПАРОЛЬ' # подставить перед запуском
for f in \
client-shared/src/main/kotlin/pw/binom/client/shared/markdown/MarkdownSegment.kt \
client-shared/src/main/kotlin/pw/binom/client/shared/markdown/MarkdownParserImpl.kt \
client-shared/src/main/kotlin/pw/binom/client/shared/ui/MarkdownRendering.kt \
client/src/main/kotlin/pw/binom/client/ui/MarkdownRenderer.kt ; do
curl -sS -u "$AUTH" "$BASE/$f" -o "$(basename "$f")"
done
```
Браузерные ссылки для чтения глазами (нужен залогиненный git.binom.pw):
```
https://git.binom.pw/ai/assistent/src/branch/main/client-shared/src/main/kotlin/pw/binom/client/shared/markdown/MarkdownSegment.kt
https://git.binom.pw/ai/assistent/src/branch/main/client-shared/src/main/kotlin/pw/binom/client/shared/markdown/MarkdownParserImpl.kt
https://git.binom.pw/ai/assistent/src/branch/main/client-shared/src/main/kotlin/pw/binom/client/shared/ui/MarkdownRendering.kt
https://git.binom.pw/ai/assistent/src/branch/main/client/src/main/kotlin/pw/binom/client/ui/MarkdownRenderer.kt
```
---
## Что придётся поправить после копирования
1. **Пакеты.** Файлы лежат в `pw.binom.client.shared.*` — переименовать под наш проект
(или оставить как есть, если не смущает).
2. **`openUrl`.** В `MarkdownRenderer` открытие ссылок идёт через `java.awt.Desktop` —
на десктопе это работает, ничего менять не надо.
3. **Стиль.** Цвета текста и блоков кода в `MarkdownRendering` берутся из аргументов и
`MaterialTheme` — под нашу тёмную тему подставить свои значения.
## Что этот рендер умеет (по коду)
- **Текст** с участками: жирный, курсив, код, зачёркнутый, ссылки.
- **Блоки кода** — с названием языка и кнопкой копирования.
- **Таблицы** — заголовки и строки, с горизонтальной прокруткой.
- **Картинки** — `data:`-ссылки и обычные `http(s)`. Первые рисуются сразу из памяти.
- **Разделители** (`---`).
- **Кликабельные ссылки** — нажатие уходит в `onUrlClick`, оттуда открываем браузер.
+4 -2
View File
@@ -15,6 +15,7 @@ sketches/003-three-pane-command/index.html # три панели + состо
sketches/004-settings-agents/index.html # настройки агентов + проверка связи
```
`MARKDOWN-SOURCE.md` — откуда брать готовую отрисовку Markdown (файлы и адреса).
`REQUIREMENTS.md` — требования. Статус: накидываем, ни один пункт не обязателен
к исполнению в том виде, как записан.
@@ -34,8 +35,9 @@ sketches/004-settings-agents/index.html # настройки агентов
Цвет помечает диалоги агента (полоска у строки, точка у группы); картинка
показывается кружком вместо цвета. **Картинку клиент копирует себе**, а не берёт
по исходному адресу — иначе значок пропадёт вместе с файлом.
- **Markdown** — показывать разметкой, а не сырыми символами. Готовая
библиотека уже используется в клиенте assistent, писать свою не надо.
- **Markdown** — показывать разметкой, а не сырыми символами. Готовый рендер
лежит в репозитории `ai/assistent` — писать свой не надо, брать оттуда.
Точные координаты файлов — в `MARKDOWN-SOURCE.md`.
- **Папки над списком диалогов** («Все чаты», «Работа», «Дом») — часть выбранного
варианта 1, не терять их при доработках.
- **Проверка связи с агентом** — в отдельном окне поверх настроек: идёт → отвечает
+6 -2
View File
@@ -45,8 +45,12 @@
за куском, а не появляется целиком в конце. Отображать именно так.
- **R13.** **Разметка (markdown).** Если я или агент пишем текст, похожий на
разметку, показывать его разметкой, а не сырыми символами: списки, выделение,
код, таблицы, ссылки. Код для этого писать не надо — готовая библиотека уже
используется в клиенте assistent.
код, таблицы, ссылки. Код для этого писать не надо — готовый рендер уже есть
в репозитории `ai/assistent`, брать оттуда.
- **R13.1.** **Откуда брать — точно.** См. `MARKDOWN-SOURCE.md`: репозиторий
`ai/assistent`, ветка `main`, коммит `2c5b3f9`. Копировать 4 файла:
модель разметки, парсер, отрисовку и десктопную обёртку открытия ссылок.
Одна внешняя зависимость — `ru.otpbank.ai:markdown:0.51.0` (есть в Nexus).
## 5. Панель ввода