1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
|
import options
import css/values
import html/dom
import io/term
type
#LayoutUnit* = distinct int32
LayoutUnit* = int
Offset* = object
x*: LayoutUnit
y*: LayoutUnit
Size* = object
width*: LayoutUnit
height*: LayoutUnit
Strut* = object
pos*: int
neg*: int
Box* = ref object of RootObj
BlockBox* = ref object of Box
flowRoot*: bool
FlowRoot* = ref object of BlockBox
#InlineRoot* = ref object of
Viewport* = ref object
term*: TermAttributes
root*: BlockContext
BoxBuilder* = ref object of RootObj
children*: seq[BoxBuilder]
inlinelayout*: bool
computed*: CSSComputedValues
node*: Node
element*: Element
InlineBoxBuilder* = ref object of BoxBuilder
text*: seq[string]
ictx*: InlineContext
newline*: bool
BlockBoxBuilder* = ref object of BoxBuilder
listItemCounter: int # ordinal value of current list
InlineBlockBoxBuilder* = ref object of BoxBuilder
content*: BlockBoxBuilder # iblock.bctx is equivalent to box.bctx
MarkerBoxBuilder* = ref object of InlineBoxBuilder
ordinalvalue*: int
inside*: bool
ListItemBoxBuilder* = ref object of BoxBuilder
marker*: MarkerBoxBuilder
content*: BlockBoxBuilder
InlineAtom* = ref object of RootObj
offset*: Offset
width*: int
height*: int
vertalign*: CSSVerticalAlign
baseline*: int
top*: int
bottom*: int
ComputedFormat* = ref object
fontstyle*: CSSFontStyle
fontweight*: int
textdecoration*: CSSTextDecoration
color*: CSSColor
node*: Node
InlineSpacing* = ref object of InlineAtom
format*: ComputedFormat
InlineWord* = ref object of InlineAtom
str*: string
format*: ComputedFormat
LineBox* = ref object
atoms*: seq[InlineAtom]
offset*: Offset
width*: int
height*: int
baseline*: int
lineheight*: int #line-height property
InlineContext* = ref object
offset*: Offset
height*: int
lines*: seq[LineBox]
currentLine*: LineBox
whitespacenum*: int
maxwidth*: int
viewport*: Viewport
node*: Node
shrink*: bool
format*: ComputedFormat
BlockContext* = ref object of RootObj
inline*: InlineContext
nested*: seq[BlockContext]
computed*: CSSComputedValues
viewport*: Viewport
offset*: Offset
width*: int
height*: int
margin_top*: int
margin_bottom*: int
margin_left*: int
margin_right*: int
padding_top*: int
padding_bottom*: int
padding_left*: int
padding_right*: int
compwidth*: int
maxwidth*: int
nocenter*: bool
compheight*: Option[int]
shrink*: bool
ListItem* = ref object of BlockContext
marker*: InlineContext
InlineBlock* = ref object of InlineAtom
bctx*: BlockContext
margin_top*: int
margin_bottom*: int
proc append*(a: var Strut, b: int) =
if b < 0:
a.neg = min(b, a.neg)
else:
a.pos = max(b, a.pos)
func sum*(a: Strut): int =
return a.pos + a.neg
#proc `div`(a, b: LayoutUnit): LayoutUnit {.borrow.}
#
#func `+`*(a, b: LayoutUnit): LayoutUnit {.borrow.}
#func `-`*(a, b: LayoutUnit): LayoutUnit {.borrow.}
#func `*`*(a, b: LayoutUnit): LayoutUnit {.borrow.}
#func `/`*(a, b: LayoutUnit): LayoutUnit = a div b
#
#proc `+=`*(a: var LayoutUnit, b: LayoutUnit) {.borrow.}
#proc `-=`*(a: var LayoutUnit, b: LayoutUnit) {.borrow.}
#proc `*=`*(a: var LayoutUnit, b: LayoutUnit) {.borrow.}
#proc `/=`*(a: var LayoutUnit, b: LayoutUnit) = a = a div b
|