01 · Концепція #concept

Стиль — це іменований набір властивостей виводу. Він оголошується до ::start:: і зберігається в таблиці стилів компілятора. При використанні — компілятор читає слот стилю і генерує відповідні ANSI escape коди в IR.

Правило іменування: Назви стилів завжди великими літерами. Якщо стиль і змінна мають однакову назву — компілятор видасть E104. Стилі живуть в окремому просторі імен.
02 · Оголошення стилю #declaration
/display::ІМ'Я_СТИЛЮ
    /text(#RRGGBB або R, G, B)
    /background(#RRGGBB або R, G, B)
    /size(N)
    /normal або /border, /italic, /underlined
    /style("Impact")
end ІМ'Я_СТИЛЮ
ІМ'Я_СТИЛЮзавжди великі літери
директививсі необов'язкові
end NAMEобов'язково збігається з відкриваючим
повний стиль
display_styles_test.terra
/display::ANNA_MARIYA
    /text(#F19CBB)
    /background(127, 255, 212)
    /size(7)
    /italic
    /style("Impact")
end ANNA_MARIYA
мінімальний стиль
приклад
/display::ERROR_STYLE
    /text(255, 60, 60)
end ERROR_STYLE
Не обов'язково вказувати всі властивості. Незазначені отримують значення за замовчуванням.
03 · Властивості #properties
/text
Колір тексту. HEX або RGB.
/text(#F19CBB)
/text(241, 156, 187)
/background
Колір фону. HEX або RGB.
/background(#1A1A2E)
/background(0, 0, 0)
/size
Розмір шрифту. 0..255. 0 = не задано.
/size(12)
/size(7)
/style
Шрифт. Заглушка в v0.1.
/style("Impact")
/style("Mono")

Флаги стилю текстувзаємовиключні з /normal:

/normal
flags = 0x00
Без оформлення. Скидає всі флаги.
/border
bit 0 = 1
Рамка навколо тексту.
/italic
bit 1 = 1
Курсив.
/underlined
bit 2 = 1
Підкреслення.
комбінація флагів
/display::BOLD_STYLE
    /text(255, 255, 255)
    /border, /italic, /underlined
end BOLD_STYLE
/normal несумісний з /border, /italic, /underlined. Якщо вказано разом — компілятор видасть E104 ще на етапі парсингу.
04 · Розміщення в пам'яті #memory

Кожен стиль займає 16 байт у глобальній таблиці @styles_table. Вирівнювання 16 байт — для ефективного читання будь-яким процесором.

R
G
B
R
G
B
sz
fl
fL
fH
·
·
·
·
·
·
0    1    2    3    4    5    6    7    8    9    10   11   12   13   14   15
text RGB (байти 0-2)
bg RGB (байти 3-5)
size (байт 6)
flags (байт 7)
font index (байти 8-9)
резерв (байти 10-15)
БайтиПолеДіапазонПримітка
0–2text RGB0..255 коженколір тексту
3–5bg RGB0..255 коженколір фону
6size0..2550 = не задано
7flags0x00..0x07bit0=border, bit1=italic, bit2=underlined
8–9font indexuint16заглушка в v0.1
10–15резервдля майбутніх властивостей
В LLVM IR: @styles_table = private global [N x [16 x i8]] [...], align 16 — де N кількість стилів у програмі.
05 · Використання #usage
базове використання
/display::PINK_STYLE
    /text(#F19CBB)
    /background(127, 255, 212)
end PINK_STYLE

app (/intbyte, /var) val = 42

::start::
/display(val(PINK_STYLE))
output42
Компілятор перевіряє існування стилю на етапі компіляції. Невідомий стиль — E104.
06 · Inline модифікатори #inline

Якщо повний стиль не потрібен — використовуйте &text і &background безпосередньо після /display.

&text — колір тексту inline
/display(val)&text(#FF0000)
output42
&background — колір фону inline
/display(val) &background(0, 128, 255)
Пробіл перед & — допустимий.
обидва одночасно
/display(val)&text(#FFFFFF) &background(0, 0, 0)
Inline перекриває стиль: якщо одночасно вказаний стиль і &text — inline завжди перемагає.
/replace — shadow copy #replace

/replace створює тимчасову копію стилю, змінює в ній вказані властивості, виконує /display з цією копією, після чого копія видаляється. Оригінальний стиль залишається незмінним.

замінити фон на одну операцію
/display::ANNA_MARIYA
    /text(#F19CBB)
    /background(127, 255, 212)
end ANNA_MARIYA

app (/intbyte, /var) val = 42

::start::
! ANNA_MARIYA: text=#F19CBB, bg=(127,255,212)
/display(val(ANNA_MARIYA))/replace(&background(0, 0, 0))
! Для цього рядку: text=#F19CBB, bg=(0,0,0)
! ANNA_MARIYA далі — незмінний: bg=(127,255,212)
Механізм shadow copy: компілятор виділяє 16 байт на стеку (llvm.lifetime.start), копіює слот стилю, застосовує override, виконує display, звільняє (llvm.lifetime.end). Явне звільнення — не сподіватись на оптимізатор.

/replace зараз підтримується тільки для /display. Для /shelf та інших типів — буде реалізовано окремо.

08 · Помилки #errors-section
E104 невідомий стиль
/display(val(UNKNOWN_STYLE))
! E104: Стиль 'UNKNOWN_STYLE' не оголошений
E104 дублікат стилю
/display::MY_STYLE
    /text(#FF0000)
end MY_STYLE

/display::MY_STYLE  ! E104: Стиль 'MY_STYLE' вже оголошений
    /text(#00FF00)
end MY_STYLE
E104 end не збігається
/display::STYLE_A
    /text(#FF0000)
end STYLE_B  ! E104: 'end STYLE_B' не відповідає '/display::STYLE_A'
E104 RGB > 255
/background(276, 132, 476)
! E104: Значення RGB '276' перевищує максимум 255 (компонента R)
E104 неповний RGB
/background(23, 67)
! E104: RGB потребує рівно 3 компоненти: (R, G, B)
E104 від'ємний RGB
/background(-132, 0, 0)
! E104: Значення RGB не може бути від'ємним (компонента R = -132)
E104 /size > 255
/size(256)
! E104: Розмір шрифту '256' перевищує максимум 255
E104 від'ємний /size
/size(-12)
! E104: Розмір шрифту не може бути від'ємним (-12)
E104 /normal + флаги
/display::BAD
    /normal
    /italic  ! E104: '/normal' несумісний з '/italic'
end BAD