Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit fcf9c60

Browse files
committed
refactor!: Move Margin to renderer
1 parent ffd68e9 commit fcf9c60

File tree

4 files changed

+125
-117
lines changed

4 files changed

+125
-117
lines changed

‎src/display_list/mod.rs

Lines changed: 1 addition & 115 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,12 @@
3232
//!
3333
//! The above snippet has been built out of the following structure:
3434
use crate::snippet;
35-
use std::cmp::{max, min};
3635
use std::fmt::{Display, Write};
3736
use std::{cmp, fmt};
3837

3938
use anstyle::Style;
4039

40+
use crate::renderer::margin::Margin;
4141
use crate::renderer::StyleSheet;
4242

4343
/// List of lines to be displayed.
@@ -533,120 +533,6 @@ impl<'a> DisplayList<'a> {
533533
}
534534
}
535535

536-
#[derive(Clone, Copy, Debug)]
537-
pub struct Margin {
538-
/// The available whitespace in the left that can be consumed when centering.
539-
whitespace_left: usize,
540-
/// The column of the beginning of left-most span.
541-
span_left: usize,
542-
/// The column of the end of right-most span.
543-
span_right: usize,
544-
/// The beginning of the line to be displayed.
545-
computed_left: usize,
546-
/// The end of the line to be displayed.
547-
computed_right: usize,
548-
/// The current width of the terminal. 140 by default and in tests.
549-
column_width: usize,
550-
/// The end column of a span label, including the span. Doesn't account for labels not in the
551-
/// same line as the span.
552-
label_right: usize,
553-
}
554-
555-
impl Margin {
556-
pub fn new(
557-
whitespace_left: usize,
558-
span_left: usize,
559-
span_right: usize,
560-
label_right: usize,
561-
column_width: usize,
562-
max_line_len: usize,
563-
) -> Self {
564-
// The 6 is padding to give a bit of room for `...` when displaying:
565-
// ```
566-
// error: message
567-
// --> file.rs:16:58
568-
// |
569-
// 16 | ... fn foo(self) -> Self::Bar {
570-
// | ^^^^^^^^^
571-
// ```
572-
573-
let mut m = Margin {
574-
whitespace_left: whitespace_left.saturating_sub(6),
575-
span_left: span_left.saturating_sub(6),
576-
span_right: span_right + 6,
577-
computed_left: 0,
578-
computed_right: 0,
579-
column_width,
580-
label_right: label_right + 6,
581-
};
582-
m.compute(max_line_len);
583-
m
584-
}
585-
586-
pub(crate) fn was_cut_left(&self) -> bool {
587-
self.computed_left > 0
588-
}
589-
590-
pub(crate) fn was_cut_right(&self, line_len: usize) -> bool {
591-
let right =
592-
if self.computed_right == self.span_right || self.computed_right == self.label_right {
593-
// Account for the "..." padding given above. Otherwise we end up with code lines that
594-
// do fit but end in "..." as if they were trimmed.
595-
self.computed_right - 6
596-
} else {
597-
self.computed_right
598-
};
599-
right < line_len && self.computed_left + self.column_width < line_len
600-
}
601-
602-
fn compute(&mut self, max_line_len: usize) {
603-
// When there's a lot of whitespace (>20), we want to trim it as it is useless.
604-
self.computed_left = if self.whitespace_left > 20 {
605-
self.whitespace_left - 16 // We want some padding.
606-
} else {
607-
0
608-
};
609-
// We want to show as much as possible, max_line_len is the right-most boundary for the
610-
// relevant code.
611-
self.computed_right = max(max_line_len, self.computed_left);
612-
613-
if self.computed_right - self.computed_left > self.column_width {
614-
// Trimming only whitespace isn't enough, let's get craftier.
615-
if self.label_right - self.whitespace_left <= self.column_width {
616-
// Attempt to fit the code window only trimming whitespace.
617-
self.computed_left = self.whitespace_left;
618-
self.computed_right = self.computed_left + self.column_width;
619-
} else if self.label_right - self.span_left <= self.column_width {
620-
// Attempt to fit the code window considering only the spans and labels.
621-
let padding_left = (self.column_width - (self.label_right - self.span_left)) / 2;
622-
self.computed_left = self.span_left.saturating_sub(padding_left);
623-
self.computed_right = self.computed_left + self.column_width;
624-
} else if self.span_right - self.span_left <= self.column_width {
625-
// Attempt to fit the code window considering the spans and labels plus padding.
626-
let padding_left = (self.column_width - (self.span_right - self.span_left)) / 5 * 2;
627-
self.computed_left = self.span_left.saturating_sub(padding_left);
628-
self.computed_right = self.computed_left + self.column_width;
629-
} else {
630-
// Mostly give up but still don't show the full line.
631-
self.computed_left = self.span_left;
632-
self.computed_right = self.span_right;
633-
}
634-
}
635-
}
636-
637-
pub(crate) fn left(&self, line_len: usize) -> usize {
638-
min(self.computed_left, line_len)
639-
}
640-
641-
pub(crate) fn right(&self, line_len: usize) -> usize {
642-
if line_len.saturating_sub(self.computed_left) <= self.column_width {
643-
line_len
644-
} else {
645-
min(line_len, self.computed_right)
646-
}
647-
}
648-
}
649-
650536
/// Inline annotation which can be used in either Raw or Source line.
651537
#[derive(Debug, PartialEq)]
652538
pub struct Annotation<'a> {

‎src/renderer/margin.rs

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
use std::cmp::{max, min};
2+
3+
const ELLIPSIS_PASSING: usize = 6;
4+
const LONG_WHITESPACE: usize = 20;
5+
const LONG_WHITESPACE_PADDING: usize = 4;
6+
7+
#[derive(Clone, Copy, Debug)]
8+
pub struct Margin {
9+
/// The available whitespace in the left that can be consumed when centering.
10+
whitespace_left: usize,
11+
/// The column of the beginning of left-most span.
12+
span_left: usize,
13+
/// The column of the end of right-most span.
14+
span_right: usize,
15+
/// The beginning of the line to be displayed.
16+
computed_left: usize,
17+
/// The end of the line to be displayed.
18+
computed_right: usize,
19+
/// The current width of the terminal. 140 by default and in tests.
20+
column_width: usize,
21+
/// The end column of a span label, including the span. Doesn't account for labels not in the
22+
/// same line as the span.
23+
label_right: usize,
24+
}
25+
26+
impl Margin {
27+
pub fn new(
28+
whitespace_left: usize,
29+
span_left: usize,
30+
span_right: usize,
31+
label_right: usize,
32+
column_width: usize,
33+
max_line_len: usize,
34+
) -> Self {
35+
// The 6 is padding to give a bit of room for `...` when displaying:
36+
// ```
37+
// error: message
38+
// --> file.rs:16:58
39+
// |
40+
// 16 | ... fn foo(self) -> Self::Bar {
41+
// | ^^^^^^^^^
42+
// ```
43+
44+
let mut m = Margin {
45+
whitespace_left: whitespace_left.saturating_sub(ELLIPSIS_PASSING),
46+
span_left: span_left.saturating_sub(ELLIPSIS_PASSING),
47+
span_right: span_right + ELLIPSIS_PASSING,
48+
computed_left: 0,
49+
computed_right: 0,
50+
column_width,
51+
label_right: label_right + ELLIPSIS_PASSING,
52+
};
53+
m.compute(max_line_len);
54+
m
55+
}
56+
57+
pub(crate) fn was_cut_left(&self) -> bool {
58+
self.computed_left > 0
59+
}
60+
61+
pub(crate) fn was_cut_right(&self, line_len: usize) -> bool {
62+
let right =
63+
if self.computed_right == self.span_right || self.computed_right == self.label_right {
64+
// Account for the "..." padding given above. Otherwise we end up with code lines that
65+
// do fit but end in "..." as if they were trimmed.
66+
self.computed_right - ELLIPSIS_PASSING
67+
} else {
68+
self.computed_right
69+
};
70+
right < line_len && self.computed_left + self.column_width < line_len
71+
}
72+
73+
fn compute(&mut self, max_line_len: usize) {
74+
// When there's a lot of whitespace (>20), we want to trim it as it is useless.
75+
self.computed_left = if self.whitespace_left > LONG_WHITESPACE {
76+
self.whitespace_left - (LONG_WHITESPACE - LONG_WHITESPACE_PADDING) // We want some padding.
77+
} else {
78+
0
79+
};
80+
// We want to show as much as possible, max_line_len is the right-most boundary for the
81+
// relevant code.
82+
self.computed_right = max(max_line_len, self.computed_left);
83+
84+
if self.computed_right - self.computed_left > self.column_width {
85+
// Trimming only whitespace isn't enough, let's get craftier.
86+
if self.label_right - self.whitespace_left <= self.column_width {
87+
// Attempt to fit the code window only trimming whitespace.
88+
self.computed_left = self.whitespace_left;
89+
self.computed_right = self.computed_left + self.column_width;
90+
} else if self.label_right - self.span_left <= self.column_width {
91+
// Attempt to fit the code window considering only the spans and labels.
92+
let padding_left = (self.column_width - (self.label_right - self.span_left)) / 2;
93+
self.computed_left = self.span_left.saturating_sub(padding_left);
94+
self.computed_right = self.computed_left + self.column_width;
95+
} else if self.span_right - self.span_left <= self.column_width {
96+
// Attempt to fit the code window considering the spans and labels plus padding.
97+
let padding_left = (self.column_width - (self.span_right - self.span_left)) / 5 * 2;
98+
self.computed_left = self.span_left.saturating_sub(padding_left);
99+
self.computed_right = self.computed_left + self.column_width;
100+
} else {
101+
// Mostly give up but still don't show the full line.
102+
self.computed_left = self.span_left;
103+
self.computed_right = self.span_right;
104+
}
105+
}
106+
}
107+
108+
pub(crate) fn left(&self, line_len: usize) -> usize {
109+
min(self.computed_left, line_len)
110+
}
111+
112+
pub(crate) fn right(&self, line_len: usize) -> usize {
113+
if line_len.saturating_sub(self.computed_left) <= self.column_width {
114+
line_len
115+
} else {
116+
min(line_len, self.computed_right)
117+
}
118+
}
119+
}

‎src/renderer/mod.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1-
use crate::display_list::{DisplayList, Margin};
1+
pub mod margin;
2+
3+
use crate::display_list::DisplayList;
24
use crate::snippet::Snippet;
35
use anstyle::{AnsiColor, Effects, Style};
6+
use margin::Margin;
47
use std::fmt::Display;
58

69
#[derive(Clone)]

‎tests/deserialize/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use serde::{Deserialize, Deserializer, Serialize};
22

33
use annotate_snippets::renderer::Renderer;
44
use annotate_snippets::{
5-
display_list::Margin,
5+
renderer::margin::Margin,
66
snippet::{Annotation, AnnotationType, Slice, Snippet, SourceAnnotation},
77
};
88

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /