Skip to content
Snippets Groups Projects
Page.cpp 3.25 KiB
Newer Older
  • Learn to ignore specific revisions
  • #include <Wt/WText.h>
    #include <Wt/WMenu.h>
    
    
    #include <fstream>
    
    #include "./../calculation/Query.h"
    #include "./../calculation/Computor.h"
    #include "./../util/InvertedIndexJSONParser.h"
    
    #include "Page.h"
    
    Page::Page(const Wt::WEnvironment& env)
    
    Lukáš Paukert's avatar
    Lukáš Paukert committed
        : Wt::WApplication(env),
          database("./../../data/persistence/docs_and_terms.db"),
          space(InvertedIndexJSONParser("./../../data/persistence/invertedList.json").parse())
    {
      availableDocuments = database.getDocumentsCollection();
      container = root()->addWidget(Wt::cpp14::make_unique<Wt::WContainerWidget>());
      displayMainPage();
    }
    
    
    void Page::displayMainPage()
    
    Lukáš Paukert's avatar
    Lukáš Paukert committed
      container->clear();
    
      auto buttonPtr = Wt::cpp14::make_unique<Wt::WPushButton>("Show me more!");
      auto button = buttonPtr.get();
    
    Lukáš Paukert's avatar
    Lukáš Paukert committed
      container->addNew<Wt::WText>("<h1>Available books to display</h1>");
    
      Wt::WMenu *menu = container->addNew<Wt::WMenu>();
    
      menu->setStyleClass("navigation");
    
    Lukáš Paukert's avatar
    Lukáš Paukert committed
      for (int i = 0; i < 10; i++) {
        menu->addItem(getName(availableDocuments.at(i).name));
    
    Lukáš Paukert's avatar
    Lukáš Paukert committed
      menu->select(0);
    
      container->addWidget(std::move(buttonPtr));
    
      button->clicked().connect([=] {
    
    Lukáš Paukert's avatar
    Lukáš Paukert committed
        displayDetail(availableDocuments.at(menu->currentIndex()).id);
    
    std::string Page::getName(const std::string & path)
    
    Lukáš Paukert's avatar
    Lukáš Paukert committed
      std::string name;
      size_t begin = path.find_last_of('/') + 1;
      name = path.substr(begin, path.find_last_of('.') - begin);
    
      name.replace(name.find("___"), 3, ": ");
    
      return name;
    }
    
    
    std::string Page::getContent(const std::string & path)
    
    {
      std::string content;
      std::ifstream file(path);
      content.assign((std::istreambuf_iterator<char>(file)),
                     (std::istreambuf_iterator<char>()   ));
      file.close();
    
      return content;
    }
    
    
    void Page::displayDetail(int document_id)
    
    Lukáš Paukert's avatar
    Lukáš Paukert committed
    {
      container->clear();
    
    Lukáš Paukert's avatar
    Lukáš Paukert committed
      Document document = database.getDocumentByID(document_id);
    
    Lukáš Paukert's avatar
    Lukáš Paukert committed
      auto mainPageButtonPtr = Wt::cpp14::make_unique<Wt::WPushButton>("Back to main page");
      auto mainPageButton = mainPageButtonPtr.get();
      auto nextBookButtonPtr = Wt::cpp14::make_unique<Wt::WPushButton>("Jump to selected book");
      auto nextBookButton = nextBookButtonPtr.get();
    
    
      // threshold je nyni nastaven na -1 --> ve vysledku budou i uplne rozdilne dokumenty
    
    Lukáš Paukert's avatar
    Lukáš Paukert committed
      Query query(database.getTermsAndWightsByDocumentID(document_id), -1);
    
      auto result = Computor(space, query).compute(database);
    
    Lukáš Paukert's avatar
    Lukáš Paukert committed
      container->addNew<Wt::WText>("<h1>The most similar books</h1>");
      
      Wt::WMenu *menu = container->addNew<Wt::WMenu>();
      menu->setStyleClass("similar navigation");
      for (size_t i = 0; i < 5 && i < result.size(); i++) {
        menu->addItem(getName(availableDocuments.at(result.at(i).first - 1).name) + " (similarity: " + std::to_string(result.at(i).second) + ")");
    
    Lukáš Paukert's avatar
    Lukáš Paukert committed
      menu->select(0);
    
      container->addWidget(std::move(nextBookButtonPtr));
      container->addWidget(std::move(mainPageButtonPtr));
    
    
      container->addNew<Wt::WText>("<h1>" + getName(document.name) + "</h1>");
      auto text = Wt::cpp14::make_unique<Wt::WText>();
      text->setTextFormat(Wt::TextFormat::Plain);
    
    Lukáš Paukert's avatar
    Lukáš Paukert committed
      text->setText(getContent(document.name));
    
      container->addWidget(std::move(text));
    
    Lukáš Paukert's avatar
    Lukáš Paukert committed
    
      nextBookButton->clicked().connect([=] {
        if (menu->currentIndex() != 0)
          displayDetail(result.at(menu->currentIndex()).first);
      });
    
      mainPageButton->clicked().connect([=] {
        displayMainPage();
      });