diff options
author | Your Name <you@example.com> | 2021-02-17 20:16:29 -0500 |
---|---|---|
committer | Your Name <you@example.com> | 2021-02-17 20:16:29 -0500 |
commit | bc4aab5d69cdab28ab94d3745a1e8c92ca749003 (patch) | |
tree | 4df904ea521f03da9e561a968562a6f8e8b175cb | |
parent | 3339dc7f29540758f59e2c20462d99643a8d225e (diff) | |
download | libbible-bc4aab5d69cdab28ab94d3745a1e8c92ca749003.tar.gz libbible-bc4aab5d69cdab28ab94d3745a1e8c92ca749003.tar.bz2 libbible-bc4aab5d69cdab28ab94d3745a1e8c92ca749003.zip |
Added line wrapping
-rw-r--r-- | bible.cc | 82 |
1 files changed, 73 insertions, 9 deletions
@@ -1,7 +1,11 @@ #include "libbible.h" #include <string> +#include <sstream> #include <algorithm> #include <getopt.h> +#include <sys/ioctl.h> +#include <unistd.h> +#include <iostream> using namespace std; @@ -101,6 +105,37 @@ void removeMod(string mod) { libbible::uninstallMod(mod); } +// Stolen from O'Reilly +void textWrap(istream& in, ostream& out, size_t width) { + string tmp; + char cur = '\0'; + char last = '\0'; + size_t i = 0; + + while(in.get(cur)) { + if((unsigned char) cur < 0x80 || (unsigned char) cur >= 0xC0) { + i++; + } + if(isspace(cur) && !isspace(last)) { + out << tmp; + tmp.clear(); + } else if(i >= width) { + tmp.erase(0, tmp.find_first_not_of(" ")); + out << '\n'; + i = tmp.length(); + } + if(cur == '\n') { + i = 0; + } + if(cur == '\033') { + i -= 6; + } + tmp += cur; + last = cur; + } + out << tmp; +} + int main(int argc, char* argv[]) { static struct option long_options[] = { {"help", no_argument, 0, 'h'}, @@ -186,9 +221,11 @@ int main(int argc, char* argv[]) { int verse = 0; const char* indent = " "; bool isNewline = true; + stringstream out; for(auto tex : text) { if(!omitVerseNums && tex.chapter != chapter) { - printf("\n%s Chapter %d:\n", tex.book.c_str(), tex.chapter); + //printf("\n%s Chapter %d:\n", tex.book.c_str(), tex.chapter); + out << "\n" << tex.book << " Chapter " << tex.chapter << ":\n"; } bool isParagraph = false; bool isIndent = false; @@ -208,35 +245,62 @@ int main(int argc, char* argv[]) { if(isIndent) { isParagraph = false; if(isNewline) { - printf(indent); + //printf(indent); + out << indent; } } if(isParagraph) { - printf(indent); + //printf(indent); + out << indent; } if(isDivineName) { transform(tex.text.begin(), tex.text.end(), tex.text.begin(), ::toupper); } if(isJesus) { - printf("\033[;31m"); + //printf("\033[;31m"); + out << "\033[;31m"; } if(omitVerseNums && tex.verse != verse) { - printf(" "); + //printf(" "); + out << " "; } else if(!omitVerseNums && tex.verse != verse) { - printf(" (%d) ", tex.verse); + //printf(" (%d) ", tex.verse); + out << " (" << tex.verse << ") "; } chapter = tex.chapter; verse = tex.verse; - printf(tex.text.c_str()); + //printf(tex.text.c_str()); + out << tex.text; if(tex.text.back() == '\n') { isNewline = true; } else { isNewline = false; } if(isJesus) { - printf("\033[0m"); + //printf("\033[0m"); + out << "\033[0m"; } } - printf("\n"); + //printf("\n"); + out << "\n"; + + // Get window size + struct winsize size; + ioctl(STDOUT_FILENO, TIOCGWINSZ, &size); + // size.ws_col is number of columns, or 0 if it's a pipe + int cols = size.ws_col; + // If terminal is too small, treat it like a pipe + if(cols < 10) { + cols = 0; + } + + // Now print + if(cols == 0) { + cout << out.str(); + } else { + stringstream out2; + textWrap(out, out2, cols); + cout << out2.str(); + } return 0; } |