MongoDB  2.7.0
html.h
1 // @file html.h
2 
31 #pragma once
32 
33 /* Things in the mongoutils namespace
34  (1) are not database specific, rather, true utilities
35  (2) are cross platform
36  (3) may require boost headers, but not libs
37  (4) are clean and easy to use in any c++ project without pulling in lots of other stuff
38 */
39 
40 #include <sstream>
41 
42 namespace mongoutils {
43 
44  namespace html {
45 
46  using namespace std;
47 
48  inline string _end() { return "</body></html>"; }
49  inline string _table() { return "</table>\n\n"; }
50  inline string _tr() { return "</tr>\n"; }
51 
52  inline string tr() { return "<tr>"; }
53  inline string tr(const std::string& a, const std::string& b) {
54  stringstream ss;
55  ss << "<tr><td>" << a << "</td><td>" << b << "</td></tr>\n";
56  return ss.str();
57  }
58  template <class T>
59  inline string td(T x) {
60  stringstream ss;
61  ss << "<td>" << x << "</td>";
62  return ss.str();
63  }
64  inline string td(const std::string& x) {
65  return "<td>" + x + "</td>";
66  }
67  inline string th(const std::string& x) {
68  return "<th>" + x + "</th>";
69  }
70 
71  inline void tablecell( stringstream& ss , bool b ) {
72  ss << "<td>" << (b ? "<b>X</b>" : "") << "</td>";
73  }
74 
75  template< typename T>
76  inline void tablecell( stringstream& ss , const T& t ) {
77  ss << "<td>" << t << "</td>";
78  }
79 
80  inline string table(const char *headers[] = 0, bool border = true) {
81  stringstream ss;
82  ss << "\n<table "
83  << (border?"border=1 ":"")
84  << "cellpadding=2 cellspacing=0>\n";
85  if( headers ) {
86  ss << "<tr>";
87  while( *headers ) {
88  ss << "<th>" << *headers << "</th>";
89  headers++;
90  }
91  ss << "</tr>\n";
92  }
93  return ss.str();
94  }
95 
96  inline string start(const std::string& title) {
97  stringstream ss;
98  ss << "<html><head>\n<title>";
99  ss << title;
100  ss << "</title>\n";
101 
102  ss << "<style type=\"text/css\" media=\"screen\">"
103  "body { font-family: helvetica, arial, san-serif }\n"
104  "table { border-collapse:collapse; border-color:#999; margin-top:.5em }\n"
105  "th { background-color:#bbb; color:#000 }\n"
106  "td,th { padding:.25em }\n"
107  "</style>\n";
108 
109  ss << "</head>\n<body>\n";
110  return ss.str();
111  }
112 
113  inline string red(const std::string& contentHtml, bool color=true) {
114  if( !color ) return contentHtml;
115  stringstream ss;
116  ss << "<span style=\"color:#A00;\">" << contentHtml << "</span>";
117  return ss.str();
118  }
119  inline string grey(const std::string& contentHtml, bool color=true) {
120  if( !color ) return contentHtml;
121  stringstream ss;
122  ss << "<span style=\"color:#888;\">" << contentHtml << "</span>";
123  return ss.str();
124  }
125  inline string blue(const std::string& contentHtml, bool color=true) {
126  if( !color ) return contentHtml;
127  stringstream ss;
128  ss << "<span style=\"color:#00A;\">" << contentHtml << "</span>";
129  return ss.str();
130  }
131  inline string yellow(const std::string& contentHtml, bool color=true) {
132  if( !color ) return contentHtml;
133  stringstream ss;
134  ss << "<span style=\"color:#A80;\">" << contentHtml << "</span>";
135  return ss.str();
136  }
137  inline string green(const std::string& contentHtml, bool color=true) {
138  if( !color ) return contentHtml;
139  stringstream ss;
140  ss << "<span style=\"color:#0A0;\">" << contentHtml << "</span>";
141  return ss.str();
142  }
143 
144  inline string p(const std::string& contentHtml) {
145  stringstream ss;
146  ss << "<p>" << contentHtml << "</p>\n";
147  return ss.str();
148  }
149 
150  inline string h2(const std::string& contentHtml) {
151  stringstream ss;
152  ss << "<h2>" << contentHtml << "</h2>\n";
153  return ss.str();
154  }
155 
156  /* does NOT escape the strings. */
157  inline string a(const std::string& href,
158  const std::string& title="",
159  const std::string& contentHtml = "") {
160  stringstream ss;
161  ss << "<a";
162  if( !href.empty() ) ss << " href=\"" << href << '"';
163  if( !title.empty() ) ss << " title=\"" << title << '"';
164  ss << '>';
165  if( !contentHtml.empty() ) {
166  ss << contentHtml << "</a>";
167  }
168  return ss.str();
169  }
170 
171  /* escape for HTML display */
172  inline string escape(const string& data) {
173  string buffer;
174  buffer.reserve( data.size() );
175  for( size_t pos = 0; pos != data.size(); ++pos ) {
176  switch( data[pos] ) {
177  case '&':
178  buffer.append( "&amp;" );
179  break;
180  case '\"':
181  buffer.append( "&quot;" );
182  break;
183  case '\'':
184  buffer.append( "&apos;" );
185  break;
186  case '<':
187  buffer.append( "&lt;" );
188  break;
189  case '>':
190  buffer.append( "&gt;" );
191  break;
192  default:
193  buffer.append( 1, data[pos] );
194  break;
195  }
196  }
197  return buffer;
198  }
199 
200  }
201 
202 }