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<dyn 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<dyn Style>; }