aboutsummaryrefslogtreecommitdiff
path: root/bible.cc
diff options
context:
space:
mode:
authorYour Name <you@example.com>2020-11-05 15:50:11 -0500
committerYour Name <you@example.com>2020-11-05 15:50:11 -0500
commit2fe897e2cf750339a7e466aeafe64f45fb650f10 (patch)
treed27bbda7c1ef5368a90704843deea014e6c810de /bible.cc
downloadlibbible-2fe897e2cf750339a7e466aeafe64f45fb650f10.tar.gz
libbible-2fe897e2cf750339a7e466aeafe64f45fb650f10.tar.bz2
libbible-2fe897e2cf750339a7e466aeafe64f45fb650f10.zip
Initial commit
Diffstat (limited to 'bible.cc')
-rw-r--r--bible.cc182
1 files changed, 182 insertions, 0 deletions
diff --git a/bible.cc b/bible.cc
new file mode 100644
index 0000000..2846c5f
--- /dev/null
+++ b/bible.cc
@@ -0,0 +1,182 @@
+#include "libbible.h"
+#include <string>
+#include <algorithm>
+#include <getopt.h>
+
+using namespace std;
+
+void usage() {
+ printf("\nUsage:\n bible [options] [reference]\n\n");
+ printf("Print bible passages.\n\n");
+ printf("Options:\n");
+ printf(" -h, --help display this help message\n");
+ printf(" --list-modules list all installed modules\n");
+ printf(" -m, --module <mod> use specified module\n");
+ printf(" --set-default-module <mod> use specified module by default in future runs\n");
+ printf(" --list-books list books available in the current module\n");
+ printf(" --list-chapters <book> list chapters available in book in the current module\n");
+ printf(" -o, --omit-verse-numbers when printing verse text, skip printing verse and chapter numbers\n");
+ printf("\n\nExamples:\n bible Gal 5:22-23\n");
+ printf(" bible John 3:16\n bible Romans 12\n bible Matt 5:3-7:27\n");
+ printf(" bible Genesis 1-3\n");
+}
+
+string getDefaultModule() {
+ return libbible::settingsRead("module");
+}
+
+void listModules() {
+ map<string, vector<string>> mods = libbible::getModules();
+ string defaultMod = getDefaultModule();
+ printf("Modules Installed:\n");
+ for(auto pair : mods) {
+ if(pair.first == defaultMod) {
+ printf(" %s (default)\n", pair.first.c_str());
+ } else {
+ printf(" %s\n", pair.first.c_str());
+ }
+ }
+}
+
+void setDefaultModule(string modname) {
+ libbible::settingsWrite("module", modname);
+}
+
+void listBooks(string modname) {
+ map<string, vector<string>> mods = libbible::getModules();
+ if(mods.find(modname) == mods.end()) {
+ printf("ERROR: Module \"%s\" not installed!", modname.c_str());
+ } else {
+ printf("Books in Module %s:\n", modname.c_str());
+ for(string book : mods[modname]) {
+ printf(" %s\n", book.c_str());
+ }
+ }
+}
+
+void listChapters(string modname, string book) {
+ printf("Valid chapters for book %s in module %s:\n", book.c_str(), modname.c_str());
+ for(auto pass : libbible::getPassages(modname, book)) {
+ printf(" Chapter %d, Verses %d-%d\n", pass.chapterStart, pass.verseStart, pass.verseEnd);
+ }
+}
+
+int main(int argc, char* argv[]) {
+ static struct option long_options[] = {
+ {"help", no_argument, 0, 'h'},
+ {"list-modules", no_argument, 0, 0},
+ {"module", required_argument, 0, 'm'},
+ {"set-default-module", required_argument, 0, 0},
+ {"list-books", no_argument, 0, 0},
+ {"list-chapters", required_argument, 0, 0},
+ {"omit-verse-numbers", no_argument, 0, 'o'}
+ };
+ int opt, option_index;
+ string modname;
+ bool omitVerseNums = false;
+ bool doListBooks = false;
+ string listChaptersBook;
+ string option;
+ while ((opt = getopt_long(argc, argv, "hm:o", long_options, &option_index)) != -1) {
+ switch(opt) {
+ case 'h':
+ usage();
+ return 0;
+ case 'm':
+ modname = string(optarg);
+ break;
+ case 'o':
+ omitVerseNums = true;
+ break;
+ case 0:
+ option = string(long_options[option_index].name);
+ if(option == "list-modules") {
+ listModules();
+ return 0;
+ } else if(option == "set-default-module") {
+ setDefaultModule(string(optarg));
+ } else if(option == "list-books") {
+ doListBooks = true;
+ } else if(option == "list-chapters") {
+ listChaptersBook = string(optarg);
+ }
+ break;
+ default:
+ usage();
+ return 1;
+ }
+ }
+ if(modname.empty()) {
+ modname = getDefaultModule();
+ }
+ if(doListBooks) {
+ listBooks(modname);
+ }
+ if(! listChaptersBook.empty()) {
+ listChapters(modname, listChaptersBook);
+ }
+ string reference;
+ while(optind < argc) {
+ reference += argv[optind++];
+ reference += " ";
+ }
+
+ auto text = libbible::getText(libbible::passage{.modName = modname, .reference = reference});
+ int chapter = 0;
+ int verse = 0;
+ const char* indent = " ";
+ bool isNewline = true;
+ for(auto tex : text) {
+ if(!omitVerseNums && tex.chapter != chapter) {
+ printf("\nChapter %d:\n", tex.chapter);
+ }
+ bool isParagraph = false;
+ bool isIndent = false;
+ bool isDivineName = false;
+ bool isJesus = false;
+ for(string modifier : tex.modifiers) {
+ if(modifier == "paragraph") {
+ isParagraph = true;
+ } else if (modifier == "line indent0") {
+ isIndent = true;
+ } else if (modifier == "divineName") {
+ isDivineName = true;
+ } else if (modifier == "wordsOfJesus") {
+ isJesus = true;
+ }
+ }
+ if(isIndent) {
+ isParagraph = false;
+ if(isNewline) {
+ printf(indent);
+ }
+ }
+ if(isParagraph) {
+ printf(indent);
+ }
+ if(isDivineName) {
+ transform(tex.text.begin(), tex.text.end(), tex.text.begin(), ::toupper);
+ }
+ if(isJesus) {
+ printf("\033[;31m");
+ }
+ if(omitVerseNums && tex.verse != verse) {
+ printf(" ");
+ } else if(!omitVerseNums && tex.verse != verse) {
+ printf(" (%d) ", tex.verse);
+ }
+ chapter = tex.chapter;
+ verse = tex.verse;
+ printf(tex.text.c_str());
+ if(tex.text.back() == '\n') {
+ isNewline = true;
+ } else {
+ isNewline = false;
+ }
+ if(isJesus) {
+ printf("\033[0m");
+ }
+ }
+ printf("\n");
+ return 0;
+}