diff options
Diffstat (limited to 'gcc/diagnostic-format-html.cc')
-rw-r--r-- | gcc/diagnostic-format-html.cc | 71 |
1 files changed, 33 insertions, 38 deletions
diff --git a/gcc/diagnostic-format-html.cc b/gcc/diagnostic-format-html.cc index f2b255b..05d4273 100644 --- a/gcc/diagnostic-format-html.cc +++ b/gcc/diagnostic-format-html.cc @@ -472,7 +472,7 @@ diagnostic_html_format_buffer::flush () /* class html_builder. */ /* Style information for writing out HTML paths. - Colors taken from https://www.patternfly.org/v3/styles/color-palette/ */ + Colors taken from https://pf3.patternfly.org/v3/styles/color-palette/ */ static const char * const HTML_STYLE = (" <style>\n" @@ -511,6 +511,10 @@ static const char * const HTML_STYLE " box-shadow: 0 5px 10px 0 rgba(0, 0, 0, 0.5); }\n" " .frame-funcname { text-align: right;\n" " font-style: italic; } \n" + " .highlight-a { color: #703fec;\n" // pf-purple-400 + " font-weight: bold; }\n" + " .highlight-b { color: #3f9c35;\n" // pf-green-400 + " font-weight: bold; }\n" " </style>\n"); /* A little JavaScript for ease of navigation. @@ -700,11 +704,9 @@ html_builder::make_element_for_diagnostic (const diagnostic_info &diagnostic, class html_token_printer : public token_printer { public: - html_token_printer (html_builder &builder, - xml::element &parent_element) - : m_builder (builder) + html_token_printer (xml::printer &xp) + : m_xp (xp) { - m_open_elements.push_back (&parent_element); } void print_tokens (pretty_printer */*pp*/, const pp_token_list &tokens) final override @@ -722,62 +724,50 @@ html_builder::make_element_for_diagnostic (const diagnostic_info &diagnostic, pp_token_text *sub = as_a <pp_token_text *> (iter); /* The value might be in the obstack, so we may need to copy it. */ - insertion_element ().add_text (sub->m_value.get ()); + m_xp.add_text (sub->m_value.get ()); } break; case pp_token::kind::begin_color: + { + pp_token_begin_color *sub = as_a <pp_token_begin_color *> (iter); + gcc_assert (sub->m_value.get ()); + m_xp.push_tag_with_class ("span", sub->m_value.get ()); + } + break; + case pp_token::kind::end_color: - /* These are no-ops. */ + m_xp.pop_tag (); break; case pp_token::kind::begin_quote: { - insertion_element ().add_text (open_quote); - push_element (make_span ("gcc-quoted-text")); + m_xp.add_text (open_quote); + m_xp.push_tag_with_class ("span", "gcc-quoted-text"); } break; case pp_token::kind::end_quote: { - pop_element (); - insertion_element ().add_text (close_quote); + m_xp.pop_tag (); + m_xp.add_text (close_quote); } break; case pp_token::kind::begin_url: { pp_token_begin_url *sub = as_a <pp_token_begin_url *> (iter); - auto anchor = std::make_unique<xml::element> ("a", true); - anchor->set_attr ("href", sub->m_value.get ()); - push_element (std::move (anchor)); + m_xp.push_tag ("a", true); + m_xp.set_attr ("href", sub->m_value.get ()); } break; case pp_token::kind::end_url: - pop_element (); + m_xp.pop_tag (); break; } } private: - xml::element &insertion_element () const - { - return *m_open_elements.back (); - } - void push_element (std::unique_ptr<xml::element> new_element) - { - xml::element ¤t_top = insertion_element (); - m_open_elements.push_back (new_element.get ()); - current_top.add_child (std::move (new_element)); - } - void pop_element () - { - m_open_elements.pop_back (); - } - - html_builder &m_builder; - /* We maintain a stack of currently "open" elements. - Children are added to the topmost open element. */ - std::vector<xml::element *> m_open_elements; + xml::printer &m_xp; }; auto diag_element = make_div ("gcc-diagnostic"); @@ -798,7 +788,8 @@ html_builder::make_element_for_diagnostic (const diagnostic_info &diagnostic, message_span->set_attr ("id", message_span_id); add_focus_id (message_span_id); - html_token_printer tok_printer (*this, *message_span.get ()); + xml::printer xp (*message_span.get ()); + html_token_printer tok_printer (xp); m_printer->set_token_printer (&tok_printer); pp_output_formatted_text (m_printer, m_context.get_urlifier ()); m_printer->set_token_printer (nullptr); @@ -897,10 +888,14 @@ html_builder::make_metadata_element (label_text label, xml::printer xp (*item.get ()); xp.add_text ("["); { - xp.push_tag ("a", true); - xp.set_attr ("href", url.get ()); + if (url.get ()) + { + xp.push_tag ("a", true); + xp.set_attr ("href", url.get ()); + } xp.add_text (label.get ()); - xp.pop_tag (); + if (url.get ()) + xp.pop_tag (); } xp.add_text ("]"); return item; |