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
type placed_line = { line : Page.line; column : int; top : float }
type placed_frame = { frame : int; in_column : int; at : float; height : float }
type t = { lines : placed_line list; frames : placed_frame list; columns : int }
let flow ~column_height ~anchors page =
let col = ref 0 and y = ref 0. in
let place h =
if !y > 0. && !y +. h > column_height then (
incr col;
y := 0.);
let at = (!col, !y) in
y := !y +. h;
at
in
let lines = Page.lines page in
let last = List.length lines - 1 in
let anchors = List.mapi (fun i (offset, h) -> (i, offset, h)) anchors in
let placed_lines = ref [] and frames = ref [] in
List.iteri
(fun k (l : Page.line) ->
let column, top = place l.height in
placed_lines := { line = l; column; top } :: !placed_lines;
List.iter
(fun (i, offset, h) ->
if (offset >= l.first && offset < l.stop) || (k = last && offset >= l.stop) then
let in_column, at = place h in
frames := { frame = i; in_column; at; height = h } :: !frames)
anchors)
lines;
{ lines = List.rev !placed_lines; frames = List.rev !frames; columns = !col + 1 }