You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
91 lines
2.5 KiB
91 lines
2.5 KiB
// Buffer.cpp
|
|
|
|
#include "Buffer.h"
|
|
|
|
using namespace std;
|
|
|
|
void Buffer::display() const
|
|
{
|
|
int ix_stop_line_ = ix_top_line_ + window_height_;
|
|
for (int i = ix_top_line_; i < ix_stop_line_; ++i) {
|
|
if (i < v_lines_.size())
|
|
cout << std::setw(6) << i+1 << " " << v_lines_[i];
|
|
cout << '\n';
|
|
}
|
|
}
|
|
|
|
string* Buffer::get_lines() const
|
|
{
|
|
string* lines = new string[window_height_];
|
|
int line = 0;
|
|
while (line < window_height_ && line + ix_top_line_ < v_lines_.size()) {
|
|
lines[line - ix_top_line_] = v_lines_[line];
|
|
++line;
|
|
}
|
|
|
|
return lines;
|
|
}
|
|
|
|
bool Buffer::open(const string & new_file_name)
|
|
{
|
|
std::ifstream file(new_file_name);
|
|
if (!file)
|
|
return false;
|
|
|
|
v_lines_.clear();
|
|
// Note: the vector is cleared only after we know the file
|
|
// opened successfully.
|
|
|
|
int curr_link = 0;
|
|
std::string curr_p, line;
|
|
while(getline(file, line))
|
|
{
|
|
// Replace break tags with newlines.
|
|
for(auto char_loc = line.find("<br>"); char_loc != -1; char_loc = line.find("<br>"))
|
|
line.replace(char_loc, 4, "\n");
|
|
|
|
// Find link tags and process them.
|
|
for(auto tag_loc = line.find("<a "); tag_loc != -1; tag_loc = line.find("<a", tag_loc + 1))
|
|
{
|
|
++curr_link;
|
|
|
|
auto tag_len = line.find_first_of('>', tag_loc) - tag_loc;
|
|
std::string link_tag = line.substr(tag_loc + 3, tag_len - 3);
|
|
|
|
auto second_space_loc = link_tag.find_first_of(' ', 0);
|
|
std::string file_name = link_tag.substr(0, second_space_loc - 1);
|
|
std::string link_name = link_tag.substr(second_space_loc + 1);
|
|
|
|
v_links_.push_back({file_name, link_name});
|
|
|
|
line.replace(tag_loc, tag_len + 1, "<" + link_name + ">[" + to_string(curr_link) + "]");
|
|
}
|
|
|
|
// Search for all paragraphs in the line and add them to the v_lines vector.
|
|
for(auto p_tag = line.find("<p>"); p_tag != -1; p_tag = line.find("<p>"))
|
|
{
|
|
std::string extra_text = line.substr(p_tag + 4);
|
|
line.erase(p_tag);
|
|
|
|
curr_p += line;
|
|
|
|
// However, if the paragraph is empty, then it shouldn't be added.
|
|
if(curr_p != "")
|
|
{
|
|
v_lines_.push_back(curr_p);
|
|
curr_p = "";
|
|
}
|
|
|
|
line = extra_text;
|
|
}
|
|
// Append any data left on this line to the current paragraph being read.
|
|
curr_p += " " + line;
|
|
}
|
|
|
|
// Push the contents of curr_p as it has the last paragraph in the file.
|
|
v_lines_.push_back(curr_p);
|
|
|
|
file_name_ = new_file_name;
|
|
ix_top_line_ = 0;
|
|
return true;
|
|
}
|