diff options
Diffstat (limited to '')
-rw-r--r-- | src/styling.hh | 229 |
1 files changed, 229 insertions, 0 deletions
diff --git a/src/styling.hh b/src/styling.hh new file mode 100644 index 0000000..540d3c7 --- /dev/null +++ b/src/styling.hh @@ -0,0 +1,229 @@ +/** + * Copyright (c) 2019, Timothy Stack + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of Timothy Stack nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ''AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef styling_hh +#define styling_hh + +#include <map> +#include <string> +#include <utility> +#include <vector> + +#include "base/intern_string.hh" +#include "base/result.h" +#include "log_level.hh" +#include "mapbox/variant.hpp" +#include "yajlpp/yajlpp.hh" + +struct rgb_color { + static Result<rgb_color, std::string> from_str(const string_fragment& sf); + + explicit rgb_color(short r = -1, short g = -1, short b = -1) + : rc_r(r), rc_g(g), rc_b(b) + { + } + + bool empty() const + { + return this->rc_r == -1 && this->rc_g == -1 && this->rc_b == -1; + } + + bool operator==(const rgb_color& rhs) const; + + bool operator!=(const rgb_color& rhs) const; + + bool operator<(const rgb_color& rhs) const; + + bool operator>(const rgb_color& rhs) const; + + bool operator<=(const rgb_color& rhs) const; + + bool operator>=(const rgb_color& rhs) const; + + short rc_r; + short rc_g; + short rc_b; +}; + +struct lab_color { + lab_color() : lc_l(0), lc_a(0), lc_b(0) {} + + explicit lab_color(const rgb_color& rgb); + + double deltaE(const lab_color& other) const; + + lab_color& operator=(const lab_color& other) + { + this->lc_l = other.lc_l; + this->lc_a = other.lc_a; + this->lc_b = other.lc_b; + + return *this; + } + + bool operator==(const lab_color& rhs) const; + + bool operator!=(const lab_color& rhs) const; + + bool operator<(const lab_color& rhs) const; + + bool operator>(const lab_color& rhs) const; + + bool operator<=(const lab_color& rhs) const; + + bool operator>=(const lab_color& rhs) const; + + double lc_l; + double lc_a; + double lc_b; +}; + +struct term_color { + short xc_id; + std::string xc_name; + std::string xc_hex; + rgb_color xc_color; + lab_color xc_lab_color; +}; + +struct term_color_palette { + term_color_palette(const char* name, const string_fragment& json); + + short match_color(const lab_color& to_match); + + std::vector<term_color> tc_palette; +}; + +namespace styling { + +struct semantic {}; + +class color_unit { +public: + static Result<color_unit, std::string> from_str(const string_fragment& sf); + + static color_unit make_empty() { return color_unit{rgb_color{}}; } + + bool empty() const + { + return this->cu_value.match( + [](semantic) { return false; }, + [](const rgb_color& rc) { return rc.empty(); }); + } + + using variants_t = mapbox::util::variant<semantic, rgb_color>; + + variants_t cu_value; + +private: + explicit color_unit(variants_t value) : cu_value(std::move(value)) {} +}; + +} // namespace styling + +struct style_config { + std::string sc_color; + std::string sc_background_color; + bool sc_underline{false}; + bool sc_bold{false}; +}; + +struct highlighter_config { + std::string hc_regex; + style_config hc_style; +}; + +struct lnav_theme { + std::map<std::string, std::string> lt_vars; + positioned_property<style_config> lt_style_identifier; + positioned_property<style_config> lt_style_text; + positioned_property<style_config> lt_style_alt_text; + positioned_property<style_config> lt_style_ok; + positioned_property<style_config> lt_style_info; + positioned_property<style_config> lt_style_error; + positioned_property<style_config> lt_style_warning; + positioned_property<style_config> lt_style_popup; + positioned_property<style_config> lt_style_focused; + positioned_property<style_config> lt_style_disabled_focused; + positioned_property<style_config> lt_style_scrollbar; + positioned_property<style_config> lt_style_hidden; + positioned_property<style_config> lt_style_adjusted_time; + positioned_property<style_config> lt_style_skewed_time; + positioned_property<style_config> lt_style_offset_time; + positioned_property<style_config> lt_style_invalid_msg; + positioned_property<style_config> lt_style_status_title; + positioned_property<style_config> lt_style_status_title_hotkey; + positioned_property<style_config> lt_style_status_disabled_title; + positioned_property<style_config> lt_style_status_subtitle; + positioned_property<style_config> lt_style_status_info; + positioned_property<style_config> lt_style_status_hotkey; + positioned_property<style_config> lt_style_quoted_code; + positioned_property<style_config> lt_style_code_border; + positioned_property<style_config> lt_style_keyword; + positioned_property<style_config> lt_style_string; + positioned_property<style_config> lt_style_comment; + positioned_property<style_config> lt_style_doc_directive; + positioned_property<style_config> lt_style_variable; + positioned_property<style_config> lt_style_symbol; + positioned_property<style_config> lt_style_number; + positioned_property<style_config> lt_style_re_special; + positioned_property<style_config> lt_style_re_repeat; + positioned_property<style_config> lt_style_diff_delete; + positioned_property<style_config> lt_style_diff_add; + positioned_property<style_config> lt_style_diff_section; + positioned_property<style_config> lt_style_low_threshold; + positioned_property<style_config> lt_style_med_threshold; + positioned_property<style_config> lt_style_high_threshold; + positioned_property<style_config> lt_style_status; + positioned_property<style_config> lt_style_warn_status; + positioned_property<style_config> lt_style_alert_status; + positioned_property<style_config> lt_style_active_status; + positioned_property<style_config> lt_style_inactive_status; + positioned_property<style_config> lt_style_inactive_alert_status; + positioned_property<style_config> lt_style_file; + positioned_property<style_config> lt_style_header[6]; + positioned_property<style_config> lt_style_hr; + positioned_property<style_config> lt_style_hyperlink; + positioned_property<style_config> lt_style_list_glyph; + positioned_property<style_config> lt_style_breadcrumb; + positioned_property<style_config> lt_style_table_border; + positioned_property<style_config> lt_style_table_header; + positioned_property<style_config> lt_style_quote_border; + positioned_property<style_config> lt_style_quoted_text; + positioned_property<style_config> lt_style_footnote_border; + positioned_property<style_config> lt_style_footnote_text; + positioned_property<style_config> lt_style_snippet_border; + std::map<log_level_t, positioned_property<style_config>> lt_level_styles; + std::map<std::string, highlighter_config> lt_highlights; +}; + +extern term_color_palette* xterm_colors(); +extern term_color_palette* ansi_colors(); + +#endif |