Belle II Software  release-08-01-10
HTML.cc
1 /**************************************************************************
2  * basf2 (Belle II Analysis Software Framework) *
3  * Author: The Belle II Collaboration *
4  * *
5  * See git log for contributors and copyright holders. *
6  * This file is licensed under LGPL-3.0, see LICENSE.md. *
7  **************************************************************************/
8 #include <framework/utilities/HTML.h>
9 
10 #include <boost/algorithm/string/replace.hpp>
11 #include <regex>
12 
13 #include <TMatrixFBase.h>
14 #include <TMatrixD.h>
15 
16 #include <framework/gearbox/Unit.h>
17 
18 #include <iomanip>
19 #include <sstream>
20 
21 using namespace Belle2;
22 using namespace boost::algorithm;
23 
24 std::string HTML::getString(const TMatrixFBase& matrix, int precision, bool color)
25 {
26  const int nr = matrix.GetNrows();
27  const int nc = matrix.GetNcols();
28 
29  TMatrixD matrix_double(nr, nc);
30  for (int ir = 0; ir < nr; ir++)
31  for (int ic = 0; ic < nc; ic++)
32  matrix_double(ir, ic) = matrix(ir, ic);
33  return getString(matrix_double, precision, color);
34 }
35 
36 std::string HTML::getString(const TMatrixDBase& matrix, int precision, bool color)
37 {
38  std::stringstream stream;
39  stream.precision(precision);
40 
41  stream << "<table padding=0>";
42  const double max = matrix.Max();
43  const double min = matrix.Min();
44  for (int i = 0; i < matrix.GetNrows(); i++) {
45  stream << "<tr>";
46  for (int k = 0; k < matrix.GetNcols(); k++) {
47  const double value = matrix(i, k);
48  stream << "<td align=right";
49  if (color and value != 0.0) {
50  //0 white, min cyan, max red
51  int b = 255;
52  int r = 255;
53  int g = 255;
54  if (value > 0)
55  b = g = 255 - 180 * value / max;
56  else
57  r = 255 - 200 * value / min;
58 
59  stream << " bgcolor=" << std::setfill('0') << std::hex;
60  stream << std::setw(2) << r;
61  stream << std::setw(2) << g;
62  stream << std::setw(2) << b;
63  stream << std::dec << std::setfill(' ');
64  }
65  stream << ">" << std::setw(11) << value;
66  stream << "</td>";
67  }
68  stream << "</tr>";
69  }
70  stream << "</table>";
71  stream << "<br>";
72 
73  return stream.str();
74 }
75 
76 std::string HTML::getString(const ROOT::Math::XYZVector& vec, int precision)
77 {
78  std::stringstream stream;
79  stream.precision(precision);
80 
81  stream << std::fixed << "(" << vec.X() << ", " << vec.Y() << ", " << vec.Z() << ")";
82  return stream.str();
83 }
84 
85 std::string HTML::getStringConvertToUnit(const ROOT::Math::XYZVector& vec, int precision, const std::string& unitType)
86 {
87  std::stringstream stream;
88  stream.precision(precision);
89  std::string displayedUnitType = unitType;
90 
91  if (unitType == "um")
92  displayedUnitType = "\x0b5m";
93 
94 
95  stream << std::fixed << "(" << Unit::convertValueToUnit(vec.X(), unitType) << ", "
96  << Unit::convertValueToUnit(vec.Y(), unitType) << ", " << Unit::convertValueToUnit(vec.Z(), unitType)
97  << ") " << displayedUnitType;
98 
99 
100  return stream.str();
101 }
102 std::string HTML::chooseUnitOfLength(const ROOT::Math::XYZVector& vec)
103 {
104  double xyz [3];
105  std::string unitType;
106  vec.GetCoordinates(xyz);
107  double max = 0;
108 
109  for (auto entry : xyz)
110  if (std::abs(entry) > max)
111  max = std::abs(entry);
112 
113  // choose specific range for that the unit is useful
114  if (max < 0.1)
115  unitType = "um";
116  else
117  unitType = "cm";
118  return unitType;
119 }
120 
121 std::string HTML::getHexDump(const int* buf, int length)
122 {
123  std::stringstream stream;
124  stream << "<small><tt>";
125  char str[10];
126  //print everything in blocks of 4 bytes, 4 blocks per line
127  for (int i = 0; i < length; i++) {
128  //byte = 2letters
129  //4byte = 8 letters
130  snprintf(str, sizeof(str), "%08x ", buf[i]);
131  stream << str;
132  }
133  stream << "</tt></small>";
134  return stream.str();
135 }
136 
137 
138 std::string HTML::htmlToPlainText(const std::string& html)
139 {
140  std::string tmp = html;
141  //conversions to plaintext
142  replace_all(tmp, "<br>", "\n");
143  replace_all(tmp, "</p>", "\n");
144  replace_all(tmp, "</tr>", "\n");
145  replace_all(tmp, "&nbsp;", " ");
146 
147  //remove non-ascii \mu
148  replace_all(tmp, "\x0b5", "u");
149 
150  //remove all unknown tags (non-greedy match)
151  const static std::regex tagRegex("<.*?>");
152  tmp = std::regex_replace(tmp, tagRegex, "");
153 
154  tmp = unescape(tmp);
155 
156  return tmp;
157 }
158 
159 std::string HTML::escape(const std::string& str)
160 {
161  std::string tmp = str;
162  replace_all(tmp, "&", "&amp;"); //must be first
163  replace_all(tmp, ">", "&gt;");
164  replace_all(tmp, "<", "&lt;");
165  replace_all(tmp, "\"", "&quot;");
166  return tmp;
167 }
168 
169 std::string HTML::unescape(const std::string& str)
170 {
171  std::string tmp = str;
172  //replace entities (important ones at least)
173  replace_all(tmp, "&quot;", "\"");
174  replace_all(tmp, "&gt;", ">");
175  replace_all(tmp, "&lt;", "<");
176  replace_all(tmp, "&amp;", "&"); //must be last
177  return tmp;
178 }
static double convertValueToUnit(double value, const std::string &unitString)
Converts a floating point value from the standard framework unit to the given unit.
Definition: UnitConst.cc:139
std::string escape(const std::string &str)
Convert &, <, > etc.
Definition: HTML.cc:159
std::string getStringConvertToUnit(const ROOT::Math::XYZVector &vec, int precision=2, const std::string &unitType="cm")
get a string with vector coordinates: (x, y, z).
Definition: HTML.cc:85
std::string chooseUnitOfLength(const ROOT::Math::XYZVector &vec)
get a string with a unit type to convert a vector, so that it is easily readable.
Definition: HTML.cc:102
std::string getHexDump(const int *buf, int length)
Create hexdump of given buffer.
Definition: HTML.cc:121
std::string unescape(const std::string &str)
inverse of escape()
Definition: HTML.cc:169
std::string getString(const TMatrixFBase &matrix, int precision=2, bool color=true)
get HTML table representing a matrix.
Definition: HTML.cc:24
std::string htmlToPlainText(const std::string &html)
Reformat given HTML string into terminal-friendly plain text.
Definition: HTML.cc:138
Abstract base class for different kinds of events.