vocabtree  0.0.1
matches_page.cxx
Go to the documentation of this file.
1 #include "matches_page.hpp"
2 
3 #include <utils/filesystem.hpp>
4 
5 #include <sstream>
6 #include <iomanip>
7 
8 const static std::string s_stylesheet_name = "style.css";
9 
10 MatchesPage::MatchesPage(uint32_t max_matches_per_page, uint32_t max_images_per_match) {
11  max_matches_per_page_ = max_matches_per_page;
12  max_images_per_match_ = max_images_per_match;
13 }
14 
16 
17 }
18 
19 void MatchesPage::add_match(uint32_t query_id, std::vector<uint64_t> &match_ids, const Dataset &dataset,
20  std::shared_ptr< std::vector<int> > validated) {
21 
22  std::stringstream html_string;
23  html_string << "<table><tr>";
24  html_string << "<td><img src='" << dataset.location(dataset.image(query_id)->location()) << "' /></td><td> </td>";
25  for(size_t i=0; i< MIN(match_ids.size(), max_images_per_match_); i++) {
26  std::shared_ptr<Image> image = dataset.image(match_ids[i]);
27  const std::string &impath = dataset.location(image->location());
28  if(validated == nullptr || i >= validated->size()) {
29  html_string << "<td><img src='" << impath << "' /></td>";
30  } else {
31  std::stringstream borderstr;
32  borderstr << "border: 1px solid " << ((*validated)[i] > 0 ? "green" : ((*validated)[i] == 0 ? "black" : "red"));
33  html_string << "<td><img src='" << impath << "' style='" << borderstr.str() << "' /></td>";
34  }
35  }
36  html_string << "</tr></table>";
37  html_strings.push_back(html_string.str());
38 }
39 
40 void MatchesPage::write(const std::string &folder) const {
41  if(!filesystem::file_exists(folder)) {
42  filesystem::create_file_directory(folder + "/index.html");
43  }
44 
45  // style sheet
46  const std::string stylesheet_string = this->stylesheet();
47  filesystem::write_text(folder + "/" + s_stylesheet_name, stylesheet_string);
48 
49  for(size_t i=0; i<html_strings.size(); i+=max_matches_per_page_) {
50  uint32_t cur_page = i / max_images_per_match_;
51  std::stringstream current_page_str;
52  current_page_str << header();
53  current_page_str << navbar(cur_page, html_strings.size() / max_matches_per_page_ + 1);
54 
55  for(size_t j=i; j<MIN(html_strings.size(), i+max_matches_per_page_); j++) {
56  current_page_str << html_strings[j];
57  }
58  current_page_str << footer();
59 
60  filesystem::write_text(folder + "/" + this->pagename(cur_page), current_page_str.str());
61  }
62 }
63 
64 std::string MatchesPage::pagename(uint32_t cur_page) const {
65  std::stringstream current_page_name;
66  current_page_name << "matches_" << std::setw(5) << std::setfill('0') << cur_page << ".html";
67  return current_page_name.str();
68 }
69 
70 std::string MatchesPage::stylesheet() const {
71  std::string stylesheet_str = R"( body { margin: 0px; color : #fcfcfc; background: #111; font-size: 14px; font-family: sans-serif; } table { margin: 5px; border: 2px solid #fcfcfc; border-spacing: 0; border-collapse: collapse; } a { color: #fff; text-decoration: none; font-weight: bold; } img { height: 120px; } )";
72  return stylesheet_str;
73 }
74 
75 std::string MatchesPage::header() const {
76  std::string header_str = R"( <html> <head> <link rel='stylesheet' type='text/css' href=')" + s_stylesheet_name + R"(' /> </head> <body> )";
77  return header_str;
78 }
79 
80 std::string MatchesPage::footer() const {
81  std::string footer_str = R"( </body> </html> )";
82  return footer_str;
83 }
84 
85 std::string MatchesPage::navbar(uint32_t cur_page, uint32_t max_pages) const {
86  std::stringstream navbar_str;
87  navbar_str << "<table><tr>";
88  for(uint32_t i=0; i<max_pages; i++) {
89  navbar_str << "<td><a href='" << pagename(i) << "'>" << i << "</a></td>";
90  }
91  navbar_str << "</tr></table>";
92  return navbar_str.str();
93 }
94