8000 fix: Make pre-styled titles use their own fn · Muscraft/annotate-snippets-rs@0adeff8 · GitHub
[go: up one dir, main page]

Skip to content

Commit 0adeff8

Browse files
committed
fix: Make pre-styled titles use their own fn
1 parent 11a8e92 commit 0adeff8

File tree

4 files changed

+41
-8
lines changed

4 files changed

+41
-8
lines changed

examples/highlight_title.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ fn main() {
6161
.label("arguments to this function are incorrect"),
6262
),
6363
)
64-
.element(Level::NOTE.title(&title)),
64+
.element(Level::NOTE.pre_styled_title(&title)),
6565
)
6666
.group(
6767
Group::new()

src/level.rs

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,10 +78,26 @@ impl<'a> Level<'a> {
7878
groups: vec![Group::new().element(Element::Title(Title {
7979
level: self,
8080
title: header,
81+
is_pre_styled: false,
8182
}))],
8283
}
8384
}
8485

86+
/// <div class="warning">
87+
///
88+
/// Text passed to this function is considered "untrusted input", as such
89+
/// all text is passed through a normalization function. Pre-styled text is
90+
/// not allowed to be passed to this function.
91+
///
92+
/// </div>
93+
pub fn title(self, title: &'a str) -> Title<'a> {
94+
Title {
95+
level: self,
96+
title,
97+
is_pre_styled: false,
98+
}
99+
}
100+
85101
/// <div class="warning">
86102
///
87103
/// Text passed to this function is allowed to be pre-styled, as such all
@@ -90,8 +106,12 @@ impl<'a> Level<'a> {
90106
/// used to normalize untrusted text before it is passed to this function.
91107
///
92108
/// </div>
93-
pub fn title(self, title: &'a str) -> Title<'a> {
94-
Title { level: self, title }
109+
pub fn pre_styled_title(self, title: &'a str) -> Title<'a> {
110+
Title {
111+
level: self,
112+
title,
113+
is_pre_styled: true,
114+
}
95115
}
96116

97117
pub(crate) fn as_str(&self) -> &'a str {

src/renderer/mod.rs

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -593,7 +593,8 @@ impl Renderer {
593593
// `max_line_num_len`
594594
let padding = max_line_num_len + 3 + label_width;
595595

596-
let printed_lines = self.msgs_to_buffer(buffer, title.title, padding, None);
596+
let printed_lines =
597+
self.msgs_to_buffer(buffer, title.title, padding, None, title.is_pre_styled);
597598
if is_cont && matches!(self.theme, OutputTheme::Unicode) {
598599
// There's another note after this one, associated to the subwindow above.
599600
// We write additional vertical lines to join them:
@@ -669,7 +670,12 @@ impl Renderer {
669670
label_width += 2;
670671
}
671672
if !title.title.is_empty() {
672-
for (line, text) in normalize_whitespace(title.title).lines().enumerate() {
673+
let (title_str, style) = if title.is_pre_styled {
674+
(title.title.to_owned(), ElementStyle::NoStyle)
675+
} else {
676+
(normalize_whitespace(title.title), header_style)
677+
};
678+
for (line, text) in title_str.lines().enumerate() {
673679
buffer.append(
674680
buffer_msg_line_offset + line,
675681
&format!(
@@ -681,7 +687,7 @@ impl Renderer {
681687
},
682688
text
683689
),
684-
header_style,
690+
style,
685691
);
686692
}
687693
}
@@ -696,6 +702,7 @@ impl Renderer {
696702
title: &str,
697703
padding: usize,
698704
override_style: Option<ElementStyle>,
705+
is_pre_styled: bool,
699706
) -> usize {
700707
let padding = " ".repeat(padding);
701708

@@ -725,7 +732,12 @@ impl Renderer {
725732
} else {
726733
ElementStyle::NoStyle
727734
};
728-
let lines = title.split('\n').collect::<Vec<_>>();
735+
let title_str = if is_pre_styled {
736+
title.to_owned()
737+
} else {
738+
normalize_whitespace(title)
739+
};
740+
let lines = title_str.split('\n').collect::<Vec<_>>();
729741
if lines.len() > 1 {
730742
for (i, line) in lines.iter().enumerate() {
731743
if i != 0 {
@@ -735,7 +747,7 @@ impl Renderer {
735747
buffer.append(line_number, line, style);
736748
}
737749
} else {
738-
buffer.append(line_number, title, style);
750+
buffer.append(line_number, &title_str, style);
739751
}
740752
line_number
741753
}

src/snippet.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ pub struct Padding;
175175
pub struct Title<'a> {
176176
pub(crate) level: Level<'a>,
177177
pub(crate) title: &'a str,
178+
pub(crate) is_pre_styled: bool,
178179
}
179180

180181
/// A source view [`Element`] in a [`Group`]

0 commit comments

Comments
 (0)
0