v2 / vlib / v / fmt / align.v
78 lines · 70 sloc · 1.53 KB · e974460b45b18ea7ed2a7c5ffddd797cb2e1cd0c
Raw
1// Copyright (c) 2019-2024 Alexander Medvednikov. All rights reserved.
2// Use of this source code is governed by an MIT license
3// that can be found in the LICENSE file.
4module fmt
5
6struct AlignInfo {
7mut:
8 line_nr int
9 max_len int
10}
11
12@[params]
13struct AlignConfig {
14pub:
15 use_break_line bool
16 use_threshold bool
17 threshold int = 25
18}
19
20struct FieldAlign {
21 cfg AlignConfig
22mut:
23 infos []AlignInfo
24 cur_idx int
25}
26
27fn new_field_align(cfg AlignConfig) FieldAlign {
28 return FieldAlign{
29 cfg: cfg
30 }
31}
32
33fn (mut fa FieldAlign) add_new_info(len int, line int) {
34 fa.infos << AlignInfo{
35 line_nr: line
36 max_len: len
37 }
38}
39
40@[direct_array_access]
41fn (mut fa FieldAlign) add_info(len int, line int, has_break_line bool) {
42 if fa.infos.len == 0 {
43 fa.add_new_info(len, line)
44 return
45 }
46 last_idx := fa.infos.len - 1
47 if (fa.cfg.use_break_line && has_break_line)
48 || (!fa.cfg.use_break_line && line - fa.infos[last_idx].line_nr > 1) {
49 fa.add_new_info(len, line)
50 return
51 }
52 if fa.cfg.use_threshold {
53 len_diff := if fa.infos[last_idx].max_len >= len {
54 fa.infos[last_idx].max_len - len
55 } else {
56 len - fa.infos[last_idx].max_len
57 }
58
59 if len_diff >= fa.cfg.threshold {
60 fa.add_new_info(len, line)
61 return
62 }
63 }
64 fa.infos[last_idx].line_nr = line
65 if len > fa.infos[last_idx].max_len {
66 fa.infos[last_idx].max_len = len
67 }
68}
69
70fn (mut fa FieldAlign) max_len(line_nr int) int {
71 if fa.cur_idx < fa.infos.len && fa.infos[fa.cur_idx].line_nr < line_nr {
72 fa.cur_idx++
73 }
74 if fa.cur_idx < fa.infos.len {
75 return fa.infos[fa.cur_idx].max_len
76 }
77 return 0
78}
79