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 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
//! Set of structures required to implement a stylesheet for
//! [DisplayListFormatter](super::DisplayListFormatter).
//!
//! In order to provide additional styling information for the
//! formatter, a structs can implement `Stylesheet` and `Style`
//! traits.
//!
//! Example:
//!
//! ```
//! use annotate_snippets::formatter::style::{Stylesheet, StyleClass, Style};
//!
//! struct HTMLStyle {
//! prefix: String,
//! postfix: String,
//! };
//!
//! impl HTMLStyle {
//! fn new(prefix: &str, postfix: &str) -> Self {
//! HTMLStyle {
//! prefix: prefix.into(),
//! postfix: postfix.into()
//! }
//! }
//! };
//!
//! impl Style for HTMLStyle {
//! fn paint(&self, text: &str) -> String {
//! format!("{}{}{}", self.prefix, text, self.postfix)
//! }
//!
//! fn bold(&self) -> Box<Style> {
//! Box::new(HTMLStyle {
//! prefix: format!("{}<b>", self.prefix),
//! postfix: format!("</b>{}", self.postfix),
//! })
//! }
//! }
//!
//! struct HTMLStylesheet {};
//!
//!
//! impl Stylesheet for HTMLStylesheet {
//! fn get_style(&self, class: StyleClass) -> Box<Style> {
//! let s = match class {
//! StyleClass::Error => HTMLStyle::new("<span style='color:red'>", "</span>"),
//! StyleClass::Warning => HTMLStyle::new("<span style='color:orange'>", "</span>"),
//! StyleClass::Info => HTMLStyle::new("<span style='color:yellow'>", "</span>"),
//! StyleClass::Note => HTMLStyle::new("<span style='color:blue'>", "</span>"),
//! StyleClass::Help => HTMLStyle::new("<span style='color:green'>", "</span>"),
//! StyleClass::LineNo => HTMLStyle::new("<strong>", "</strong>"),
//! StyleClass::Emphasis => HTMLStyle::new("<i>", "</i>"),
//! StyleClass::None => HTMLStyle::new("", ""),
//! };
//! Box::new(s)
//! }
//! }
//! ```
/// StyleClass is a collection of named variants of style classes
/// that DisplayListFormatter uses.
pub enum StyleClass {
/// Message indicating an error.
Error,
/// Message indicating a warning.
Warning,
/// Message indicating an information.
Info,
/// Message indicating a note.
Note,
/// Message indicating a help.
Help,
/// Style for line numbers.
LineNo,
/// Parts of the text that are to be emphasised.
Emphasis,
/// Parts of the text that are regular. Usually a no-op.
None,
}
/// This trait implements a return value for the `Stylesheet::get_style`.
pub trait Style {
/// The method used by the DisplayListFormatter to style the message.
fn paint(&self, text: &str) -> String;
/// The method used by the DisplayListFormatter to display the message
/// in bold font.
fn bold(&self) -> Box<Style>;
}
/// Trait to annotate structs that can provide `Style` implementations for
/// every `StyleClass` variant.
pub trait Stylesheet {
/// Returns a `Style` implementer based on the requested `StyleClass` variant.
fn get_style(&self, class: StyleClass) -> Box<Style>;
}