# rubric

Интерактивный терминальный справочник для разработчика. Цветной вывод, структурированные разделы с примерами кода, быстрый доступ по ключам.

```
./rubric
```

```
╔════════════════════════════════════════════════════════════╗
║             rubric — интерактивный справочник              ║
╚════════════════════════════════════════════════════════════╝

  Доступные справочники:

   1.  go        Справочник по языку Go
                 Установка, синтаксис, типы, функции, горутины...
```

---

## Установка

**Требования:** Go 1.21+

```bash
git clone https://github.com/user/rubric
cd rubric
go build -o rubric .
```

Или сразу установить глобально:

```bash
go install github.com/user/rubric@latest
```

---

## Использование

### Интерактивный режим

```bash
./rubric
```

Открывается главное меню со списком справочников. Навигация двухуровневая:

```
rubric → выбор справочника → выбор раздела
```

Вводить можно **номер** или **ключ**:

```
Выберите справочник: 1
Выберите справочник: go
```

Внутри справочника:

```
Раздел: 2
Раздел: structs
Раздел: s          ← сокращённый алиас
```

Для возврата на уровень выше — `b`. Для выхода — `q`.

### Быстрый доступ (без меню)

```bash
# Открыть справочник Go
./rubric -book go

# Открыть конкретный раздел сразу
./rubric -book go -topic basics
./rubric -book go -topic structs

# По алиасу
./rubric -book g -topic s
```

### Вспомогательные флаги

```bash
./rubric -list      # список всех справочников
./rubric -help      # справка по флагам и ключам
```

---

## Структура проекта

```
rubric/
├── go.mod
├── main.go                      # точка входа, разбор флагов
├── utils/
│   └── display.go               # цвета, форматирование вывода
├── catalog/
│   ├── catalog.go               # главное меню, реестр справочников
│   └── gobook.go                # справочник Go: меню и навигация
└── modules/
    └── gomodules/
        ├── registry.go          # реестр разделов Go
        ├── basics.go            # раздел: установка и команды
        └── structures.go        # раздел: структура программы
```

Каждый **справочник** — отдельный файл в `catalog/`. Каждый **раздел** внутри справочника — отдельный файл в соответствующем подпакете `modules/`.

---

## Справочники и разделы

### go — Язык Go

| Ключ | Алиасы | Раздел |
|------|--------|--------|
| `basics` | `b`, `base`, `install` | Установка и основные команды |
| `structs` | `s`, `struct`, `vars`, `types` | Структура программы |

#### basics — Установка и основные команды

- Установка Go на Linux / macOS / Windows
- Структура проекта, `go mod init`
- `go build` — сборка и кросс-компиляция
- `go run` — запуск без сборки
- `go test` — тесты, покрытие, бенчмарки, race-детектор
- `go fmt`, `go vet`, `golangci-lint` — форматирование и анализ
- `go doc` — документация
- `go get`, `go mod tidy` — управление зависимостями
- `go env`, `go clean`, `go install` — окружение и утилиты

#### structs — Структура программы

- Имена, ключевые слова, предопределённые идентификаторы
- Четыре вида объявлений: `const`, `type`, `var`, `func`
- Переменные: `var`, `:=`, нулевые значения, `var`-блоки
- Указатели: `&`, `*`, nil, сравнение адресов
- Функция `new` и когда её использовать
- Время жизни переменных, escape analysis
- Присваивания: простые, составные, tuple assignment, `_`
- Объявления типов, алиасы, конверсии
- Пакеты, файлы, все формы импорта
- Инициализация пакетов, функция `init()`
- Область видимости, затенение (shadowing)

---

## Как добавить новый раздел в справочник Go

1. Создать файл `modules/gomodules/mymodule.go`:

```go
package gomodules

import "rubric/utils"

var MyModule = Module{
    Key:         "mykey",
    Aliases:     []string{"mk"},
    Title:       "Название раздела",
    Description: "Краткое описание",
    Run:         showMyModule,
}

func showMyModule() {
    utils.Header("Заголовок")
    utils.Section("Подраздел")
    utils.Code(`// пример кода`)
    utils.Note("Важное замечание")
    utils.Footer()
}
```

2. Добавить в `modules/gomodules/registry.go` в срез `All`:

```go
var All = []Module{
    BasicsModule,
    StructuresModule,
    MyModule,  // ← добавить сюда
}
```

Больше ничего не требуется — модуль автоматически появится в меню, поиске и навигации.

## Как добавить новый справочник (например, linux)

1. Создать `catalog/linuxbook.go` по образцу `catalog/gobook.go`
2. Создать `modules/linuxmodules/` с нужными разделами
3. Добавить `LinuxBook` в срез `catalog.All` в `catalog/catalog.go`
4. При необходимости расширить `switch *book` в `main.go` для флага `-book linux -topic ...`

---

## Вспомогательные функции форматирования

Все модули используют пакет `utils` для единообразного вывода:

| Функция | Описание |
|---------|----------|
| `utils.Header(title)` | Заголовок раздела в рамке |
| `utils.Section(title)` | Подзаголовок с линией |
| `utils.Code(code)` | Блок кода в рамке |
| `utils.Command(cmd, desc)` | Команда с описанием |
| `utils.Note(text)` | Замечание с иконкой 💡 |
| `utils.Info(label, value)` | Пара ключ — значение |
| `utils.Println(text)` | Обычная строка с отступом |
| `utils.Footer()` | Нижняя линия раздела |

---

## Цветовой вывод

Использует ANSI escape-коды. Работает в большинстве современных терминалов: iTerm2, Terminal.app, GNOME Terminal, Windows Terminal, tmux и других.

В средах без поддержки цвета (например, при перенаправлении вывода в файл) escape-коды будут видны как есть. При необходимости отключения цвета — установите переменную `NO_COLOR=1` перед запуском или реализуйте проверку `os.Getenv("NO_COLOR")` в `utils/display.go`.
