@@ -17,14 +17,100 @@ export function linkify(text: string): string {
17
17
return text . replaceAll ( / (?: w w w | h t t p s ? ) [ ^ \s ] + / ig, "<a target=\"_blank\" href=\"$&\">$&</a>" ) ;
18
18
}
19
19
20
- export function nearestOverlap ( f : number [ ] , formats : number [ ] [ ] ) {
21
- return Math . min ( ...formats . map ( f2 => Math . max ( f [ 0 ] , f2 [ 0 ] ) ) ) ;
20
+ interface IRange {
21
+ start : number
22
+ end : number
23
+ traits : string [ ]
22
24
}
23
25
24
- // function transformFormats(formats: Format[]): CleanedFormat[] {
25
- // const res: CleanedFormat[] = [];
26
- // for (const f of formats) {
27
- // const nearestOverlap = Math.max(...formats.map(f2 => Math.max(f.start, f2.start)));
28
- // }
29
- // return res;
30
- // }
26
+ function sortRange ( lhs : IRange , rhs : IRange ) : number {
27
+ return lhs . start - rhs . start ;
28
+ }
29
+
30
+ export function merge ( ranges : IRange [ ] ) : Array < IRange > {
31
+ ranges . sort ( sortRange ) ;
32
+
33
+ const s = new Array < IRange > ( ) ;
34
+
35
+ s . push ( ranges [ 0 ] ) ;
36
+
37
+ for ( let i = 1 ; i < ranges . length ; i ++ ) {
38
+ const top = s [ s . length - 1 ] ;
39
+ const against = ranges [ i ] ;
40
+
41
+ /*
42
+ |---top---|
43
+ |---against---|
44
+ */
45
+ if ( top . end < against . start ) {
46
+ s . push ( against ) ;
47
+ /*
48
+ |---top---|
49
+ |----against----|
50
+ */
51
+ }
52
+ else if ( top . start === against . start && top . end < against . end ) {
53
+ s . pop ( ) ;
54
+ s . push ( {
55
+ start : top . start ,
56
+ end : top . end ,
57
+ traits : top . traits . concat ( against . traits ) ,
58
+ } ) ;
59
+ s . push ( {
60
+ start : top . end ,
61
+ end : against . end ,
62
+ traits : against . traits ,
63
+ } ) ;
64
+ /*
65
+ |---top---|
66
+ |---against---|
67
+ */
68
+ }
69
+ else if ( top . end < against . end ) {
70
+ s . pop ( ) ;
71
+ s . push ( {
72
+ start : top . start ,
73
+ end : against . start ,
74
+ traits : top . traits ,
75
+ } ) ;
76
+ s . push ( {
77
+ start : against . start ,
78
+ end : top . end ,
79
+ traits : top . traits . concat ( against . traits ) ,
80
+ } ) ;
81
+ s . push ( {
82
+ start : top . end ,
83
+ end : against . end ,
84
+ traits : against . traits ,
85
+ } ) ;
86
+ /*
87
+ |--------top--------|
88
+ |---against---|
89
+ */
90
+ }
91
+ else if ( top . start < against . start && top . end > against . end ) {
92
+ s . pop ( ) ;
93
+ s . push ( {
94
+ start : top . start ,
95
+ end : against . start ,
96
+ traits : top . traits ,
97
+ } ) ;
98
+ s . push ( {
99
+ start : against . start ,
100
+ end : against . end ,
101
+ traits : top . traits . concat ( against . traits ) ,
102
+ } ) ;
103
+ s . push ( {
104
+ start : against . end ,
105
+ end : top . end ,
106
+ traits : top . traits ,
107
+ } ) ;
108
+ }
109
+ else {
110
+ console . warn ( top , against ) ;
111
+ throw new Error ( "unhandled case" ) ;
112
+ }
113
+ }
114
+
115
+ return s ;
116
+ }
0 commit comments