Skip to content

Commit 030a3cd

Browse files
committed
docs: добавлена полная документация и ревизия TeX модуля
1 parent eb3a8d9 commit 030a3cd

11 files changed

Lines changed: 795 additions & 37 deletions

File tree

MathCore.WPF/TeX/Atom.cs

Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,56 @@
11
namespace MathCore.WPF.TeX;
22

3-
/// <summary>Atom (smallest unit) of TexFormula</summary>
3+
/// <summary>
4+
/// Атом (наименьшая единица) TeX формулы
5+
/// </summary>
6+
/// <remarks>
7+
/// Атомы - это строительные блоки всех математических формул в TeX модуле.
8+
/// Каждый атом отвечает за:
9+
/// 1. Хранение своих данных (символы, подформулы и т.д.)
10+
/// 2. Определение своего типа (Ordinary, BinaryOperator, Relation и т.д.)
11+
/// 3. Преобразование себя в визуальный бокс для рендеринга
12+
///
13+
/// Существуют различные типы атомов: CharAtom (символ), RowAtom (ряд атомов),
14+
/// FractionAtom (дробь), ScriptsAtom (индексы) и другие.
15+
/// </remarks>
416
internal abstract class Atom
517
{
18+
/// <summary>Инициализирует новый экземпляр атома со стандартным типом Ordinary</summary>
619
protected Atom() => Type = TexAtomType.Ordinary;
720

21+
/// <summary>
22+
/// Тип атома, определяющий его математические свойства и расстояния до соседних элементов
23+
/// </summary>
824
public TexAtomType Type { get; set; }
925

26+
/// <summary>
27+
/// Преобразует атом в визуальный бокс для рендеринга в указанной среде
28+
/// </summary>
29+
/// <param name="environment">Среда рендеринга с информацией о стиле, шрифте и других параметрах</param>
30+
/// <returns>Бокс, который содержит визуальное представление этого атома</returns>
31+
/// <remarks>
32+
/// Каждый подкласс Atom реализует этот метод для преобразования своих данных
33+
/// в визуальное представление. Рекурсивно вызывается для всех дочерних атомов.
34+
/// </remarks>
1035
public abstract Box CreateBox(TexEnvironment environment);
1136

12-
/// <summary>Gets type of leftmost child item</summary>
13-
/// <returns></returns>
37+
/// <summary>
38+
/// Получает тип самого левого дочернего элемента (для подсчёта расстояний)
39+
/// </summary>
40+
/// <returns>Тип TexAtomType самого левого элемента</returns>
41+
/// <remarks>
42+
/// Используется при подсчёте расстояний между соседними атомами.
43+
/// Для составных атомов (RowAtom, FractionAtom) возвращает тип левого потомка.
44+
/// </remarks>
1445
public virtual TexAtomType GetLeftType() => Type;
1546

16-
/// <summary>Gets type of leftmost child item</summary>
17-
/// <returns></returns>
47+
/// <summary>
48+
/// Получает тип самого правого дочернего элемента (для подсчёта расстояний)
49+
/// </summary>
50+
/// <returns>Тип TexAtomType самого правого элемента</returns>
51+
/// <remarks>
52+
/// Используется при подсчёте расстояний между соседними атомами.
53+
/// Для составных атомов (RowAtom, FractionAtom) возвращает тип правого потомка.
54+
/// </remarks>
1855
public virtual TexAtomType GetRightType() => Type;
1956
}

MathCore.WPF/TeX/Box.cs

Lines changed: 60 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,34 +2,66 @@
22
using System.Windows;
33
using System.Windows.Media;
44

5-
// Represents graphical box that is part of math expression, and can itself contain child boxes.
65
namespace MathCore.WPF.TeX;
76

7+
/// <summary>
8+
/// Визуальный бокс - графический элемент математического выражения, который может содержать дочерние боксы
9+
/// </summary>
10+
/// <remarks>
11+
/// Боксы - это результат преобразования атомов (Atom) в визуальное представление.
12+
/// Каждый бокс содержит:
13+
/// - Размеры (ширину, высоту, глубину)
14+
/// - Визуальные свойства (кисти для переднего плана и фона)
15+
/// - Дочерние боксы (для составных элементов)
16+
///
17+
/// Различные типы боксов отрисовывают себя по-разному:
18+
/// CharBox отрисовывает символ, HorizontalBox - ряд боксов, FractionBox - дробь и т.д.
19+
/// </remarks>
820
public abstract class Box
921
{
1022
private readonly List<Box> _Children;
1123
private readonly ReadOnlyCollection<Box> _ChildrenReadOnly;
1224

25+
/// <summary>Дочерние боксы, входящие в состав этого бокса</summary>
1326
public ReadOnlyCollection<Box> Children => _ChildrenReadOnly;
1427

28+
/// <summary>Кисть для отрисовки переднего плана (символы, линии и т.д.)</summary>
1529
public Brush? Foreground { get; set; }
1630

31+
/// <summary>Кисть для отрисовки фонового прямоугольника</summary>
1732
public Brush Background { get; set; }
1833

34+
/// <summary>
35+
/// Общая высота бокса (высота над базовой линией + глубина ниже базовой линии)
36+
/// </summary>
1937
public double TotalHeight => Height + Depth;
2038

39+
/// <summary>Ширина бокса (в единицах относительного размера, масштабируется при рендеринге)</summary>
2140
public double Width { get; set; }
2241

42+
/// <summary>Высота бокса выше базовой линии (в единицах относительного размера)</summary>
2343
public double Height { get; set; }
2444

45+
/// <summary>Глубина бокса ниже базовой линии (в единицах относительного размера)</summary>
2546
public double Depth { get; set; }
2647

48+
/// <summary>Вертикальное смещение бокса от базовой линии (положительное = вверх)</summary>
2749
public double Shift { get; set; }
2850

51+
/// <summary>
52+
/// Инициализирует новый экземпляр бокса с использованием визуальных свойств из среды
53+
/// </summary>
54+
/// <param name="environment">Среда рендеринга с информацией о цветах и стилях</param>
2955
internal Box(TexEnvironment environment) : this(environment.Foreground, environment.Background) { }
3056

57+
/// <summary>Инициализирует новый экземпляр пустого бокса</summary>
3158
protected Box() : this(null, null) { }
3259

60+
/// <summary>
61+
/// Инициализирует новый экземпляр бокса с заданными визуальными свойствами
62+
/// </summary>
63+
/// <param name="foreground">Кисть для переднего плана</param>
64+
/// <param name="background">Кисть для фона</param>
3365
protected Box(Brush foreground, Brush background)
3466
{
3567
_Children = [];
@@ -38,17 +70,43 @@ protected Box(Brush foreground, Brush background)
3870
Background = background;
3971
}
4072

73+
/// <summary>
74+
/// Отрисовывает бокс и его дочерние элементы в WPF DrawingContext
75+
/// </summary>
76+
/// <param name="Context">WPF контекст для отрисовки</param>
77+
/// <param name="scale">Коэффициент масштабирования (обычно размер шрифта)</param>
78+
/// <param name="x">Координата X в пиксельных точках</param>
79+
/// <param name="y">Координата Y в пиксельных точках (базовая линия)</param>
80+
/// <remarks>
81+
/// Базовая реализация отрисовывает фоновый прямоугольник, если задана кисть для фона.
82+
/// Подклассы переопределяют этот метод для отрисовки своего специфичного содержимого.
83+
/// </remarks>
4184
public virtual void Draw(DrawingContext Context, double scale, double x, double y)
4285
{
4386
if(Background is null) return;
44-
// Fill background of box with color.
87+
// Отрисовать фон бокса прямоугольником
4588
Context.DrawRectangle(Background, null, new(x * scale, (y - Height) * scale,
4689
Width * scale, (Height + Depth) * scale));
4790
}
4891

92+
/// <summary>Добавляет дочерний бокс в конец списка дочерних элементов</summary>
93+
/// <param name="box">Бокс для добавления</param>
4994
public virtual void Add(Box box) => _Children.Add(box);
5095

96+
/// <summary>
97+
/// Вставляет дочерний бокс в указанную позицию в списке дочерних элементов
98+
/// </summary>
99+
/// <param name="position">Позиция для вставки (0-основана)</param>
100+
/// <param name="box">Бокс для вставки</param>
51101
public virtual void Add(int position, Box box) => _Children.Insert(position, box);
52102

103+
/// <summary>
104+
/// Получает идентификатор последнего используемого шрифта в этом боксе и его дочерних элементах
105+
/// </summary>
106+
/// <returns>Идентификатор шрифта</returns>
107+
/// <remarks>
108+
/// Используется для оптимизации - когда несколько элементов используют один шрифт,
109+
/// можно избежать переключения контекста рендеринга.
110+
/// </remarks>
53111
public abstract int GetLastFontId();
54112
}

MathCore.WPF/TeX/HorizontalBox.cs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,24 @@
22

33
namespace MathCore.WPF.TeX;
44

5-
/// <summary>Box containing horizontal stack of child boxes</summary>
5+
/// <summary>
6+
/// Бокс, содержащий горизонтальный стек дочерних боксов
7+
/// </summary>
8+
/// <remarks>
9+
/// HorizontalBox используется для размещения боксов в горизонтальном направлении.
10+
/// Поддерживает выравнивание (влево, по центру, вправо).
11+
/// </remarks>
612
internal sealed class HorizontalBox : Box
713
{
14+
/// <summary>Общая ширина всех дочерних боксов</summary>
815
private double _ChildBoxesTotalWidth;
916

17+
/// <summary>
18+
/// Инициализирует новый бокс с одним элементом и заданным выравниванием
19+
/// </summary>
20+
/// <param name="box">Элемент для размещения</param>
21+
/// <param name="width">Требуемая ширина контейнера</param>
22+
/// <param name="alignment">Выравнивание (Center, Left, Right)</param>
1023
public HorizontalBox(Box box, double width, TexAlignment alignment)
1124
: this()
1225
{
@@ -30,12 +43,20 @@ public HorizontalBox(Box box, double width, TexAlignment alignment)
3043
}
3144
}
3245

46+
/// <summary>Инициализирует новый горизонтальный бокс с одним элементом</summary>
47+
/// <param name="box">Элемент для добавления</param>
3348
public HorizontalBox(Box box) : this() => Add(box);
3449

50+
/// <summary>Инициализирует новый горизонтальный бокс с кистями для отрисовки</summary>
51+
/// <param name="foreground">Кисть переднего плана</param>
52+
/// <param name="background">Кисть фона</param>
3553
public HorizontalBox(Brush foreground, Brush background) : base(foreground, background) { }
3654

55+
/// <summary>Инициализирует новый пустой горизонтальный бокс</summary>
3756
public HorizontalBox() { }
3857

58+
/// <summary>Добавляет дочерний бокс и обновляет общую ширину</summary>
59+
/// <param name="box">Бокс для добавления</param>
3960
public override void Add(Box box)
4061
{
4162
base.Add(box);

0 commit comments

Comments
 (0)