fltrdr

A TUI text reader for the terminal.


fltrdr

/

src

/

fltrdr

/

fltrdr.hh

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
#ifndef FLTRDR_HH
#define FLTRDR_HH

#include "ob/timer.hh"
#include "ob/term.hh"
namespace aec = OB::Term::ANSI_Escape_Codes;

#include <cstddef>

#include <string>
#include <vector>
#include <sstream>
#include <iostream>
#include <regex>

class Fltrdr
{
public:

  // current rendered line
  struct Line
  {
    std::string prev {};
    std::string curr {};
    std::string next {};
  };

  Fltrdr() = default;

  void init();
  bool parse(std::istream& input);

  Fltrdr& screen_size(std::size_t const width, std::size_t const height);

  bool eof();

  void begin();
  void end();

  std::string buf_prev(std::size_t offset = 0);
  std::string buf_next(std::size_t offset = 0);

  void set_focus_point();

  void set_line(std::size_t offset = 0);
  Line get_line();

  int get_wait();

  void set_index(std::size_t i);
  std::size_t get_index();

  int get_wpm();
  void set_wpm(int const i);
  void inc_wpm();
  void dec_wpm();

  void calc_wpm_avg();
  std::string get_stats();

  void set_show_line(bool const val);
  bool get_show_line();

  void set_show_prev(int const val);
  int get_show_prev();

  void set_show_next(int const val);
  int get_show_next();

  std::size_t progress();

  std::string word();
  void current_word();
  bool prev_word();
  bool next_word();

  void prev_sentence();
  void next_sentence();

  void prev_chapter();
  void next_chapter();

  bool search_next();
  bool search_prev();
  bool search_forward(std::string const& rx);
  bool search_backward(std::string const& rx);

  void reset_timer();
  void reset_wpm_avg();

  OB::Timer timer;

private:

  struct Ctx
  {
    // current terminal size
    std::size_t width {0};
    std::size_t height {0};

    // minimum terminal size
    std::size_t width_min {20};

    // current word focus point
    double const focus {0.25};
    std::size_t focus_point {0};

    // text buffer
    std::string text;

    // current rendered line
    Line line;

    // text position of leading space to current word
    std::size_t pos {0};

    // word index
    std::size_t index {1};

    // min word index
    std::size_t index_min {1};

    // max word index
    std::size_t index_max {1};

    // current word
    std::string word;

    // words per minute
    int const wpm_diff {10};
    int const wpm_min {60};
    int const wpm_max {1200};
    int wpm {250};
    int wpm_avg {0};
    int wpm_count {0};
    int wpm_total {0};

    // wait time in milliseconds
    int ms {0};

    // wait time slow
    bool slow {false};

    // toggle prev and next buffer surrounding current word in line
    bool show_line {false};
    int show_prev {1};
    int show_next {1};
    int show_min {0};
    int show_max {8};

    struct Search
    {
      std::string::const_iterator begin;
      std::string::const_iterator end;
      std::regex rgx;
      std::sregex_iterator it;
      bool forward {true};
    } search;
  } _ctx;
};

#endif // FLTRDR_HH
Back to Top