fix: исправление багов, комментарии и документация

- Исправлена двойная обработка ITableRow через reflection
- Исправлен выход за границы изображения при отрисовке последнего разделителя
- Добавлена защита от пустых данных (header, blocks)
- Добавлена compile-time проверка интерфейса ITableRow
- Переименован tablle_block_style.go → table_block_style.go
- Добавлены комментарии на русском ко всем функциям и типам
- Написана документация README.md с примерами использования
- Добавлен CLAUDE.md

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-01 20:30:29 +03:00
parent a4c5fc94b7
commit b8e9f20ec3
8 changed files with 347 additions and 89 deletions

View File

@@ -10,31 +10,24 @@ import (
"golang.org/x/image/math/fixed"
)
// Document — документ, состоящий из нескольких таблиц с заголовками
type Document struct {
Blocks []TableBlock
}
// Цвет заголовка блока
var titleColor = color.RGBA{0x22, 0x22, 0x20, 255}
// Высота заголовка блока
// Высота заголовка блока (над таблицей)
const blockTitleHeight = 30
// Вертикальный отступ между блоками
const blockSpacing = 20
// Рисуем текст заголовка
func drawBigText(img *image.RGBA, x, y int, text string) {
d := &font.Drawer{
Dst: img,
Src: image.NewUniform(titleColor),
Face: globalFaceBig, // увеличенный шрифт
Dot: fixed.P(x, y),
}
d.DrawString(text)
}
// ---- Увеличенный шрифт для заголовков ----
// Шрифт для заголовков блоков (12pt)
var globalFaceBig font.Face
// Инициализация увеличенного шрифта для заголовков блоков
func init() {
f, err := opentype.Parse(jbTTF)
if err != nil {
@@ -51,9 +44,26 @@ func init() {
}
}
func RenderDocument(doc Document) image.Image {
// Сначала считаем общие размеры
// drawBigText рисует текст увеличенным шрифтом (для заголовков блоков)
func drawBigText(img *image.RGBA, x, y int, text string) {
d := &font.Drawer{
Dst: img,
Src: image.NewUniform(titleColor),
Face: globalFaceBig,
Dot: fixed.P(x, y),
}
d.DrawString(text)
}
// RenderDocument рендерит документ — несколько именованных таблиц на одном изображении.
// Каждый блок содержит заголовок и таблицу. Блоки располагаются вертикально с отступами.
func RenderDocument(doc Document) image.Image {
// Если нет блоков — возвращаем пустое изображение
if len(doc.Blocks) == 0 {
return image.NewRGBA(image.Rect(0, 0, 1, 1))
}
// Рендерим каждую таблицу отдельно и считаем общие размеры
width := 0
height := 0
@@ -71,26 +81,28 @@ func RenderDocument(doc Document) image.Image {
height += blockTitleHeight + tableImg.Bounds().Dy() + blockSpacing
}
// Создаём документ
img := image.NewRGBA(image.Rect(0, 0, width+40, height+40))
// Внешние отступы документа
margin := 20
// общий фон
// Создаём итоговое изображение
img := image.NewRGBA(image.Rect(0, 0, width+margin*2, height+margin*2))
// Белый фон документа
draw.Draw(img, img.Bounds(), &image.Uniform{color.White}, image.Point{}, draw.Src)
y := 20
y := margin
// рендерим блоки
// Отрисовка блоков
for i, block := range doc.Blocks {
// Заголовок блока
drawBigText(img, 20, y+blockTitleHeight-10, block.Title)
drawBigText(img, margin, y+blockTitleHeight-10, block.Title)
y += blockTitleHeight
// Таблица
// Таблица блока
tableImg := blockImages[i]
draw.Draw(
img,
image.Rect(20, y, 20+tableImg.Bounds().Dx(), y+tableImg.Bounds().Dy()),
image.Rect(margin, y, margin+tableImg.Bounds().Dx(), y+tableImg.Bounds().Dy()),
tableImg,
image.Point{},
draw.Over,