summaryrefslogtreecommitdiff
path: root/src/modules/texts/rawgbf/gbf.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/modules/texts/rawgbf/gbf.cpp')
-rw-r--r--src/modules/texts/rawgbf/gbf.cpp735
1 files changed, 0 insertions, 735 deletions
diff --git a/src/modules/texts/rawgbf/gbf.cpp b/src/modules/texts/rawgbf/gbf.cpp
deleted file mode 100644
index dc67a1c..0000000
--- a/src/modules/texts/rawgbf/gbf.cpp
+++ /dev/null
@@ -1,735 +0,0 @@
-enum TToken {
-tokNull, tokEOF, tokHeader, tokContent, tokTail, tokStyle,
- tokWord, tokSpace, tokSync, tokControl, tokChar, tokFont};
-
-enum TCharacterAttribute { caBold, caSmallCaps, caItalic, caOTQuote, caRed,
- caSuperscript, caUnderline, caSubscript};
-
-// TCharAttribs = set of TCharacterAttribute;
-
-
-struct TBookNameRec {
- string Name, Abbr;
- char Num;
-}
-
-const struct TBookNameRec TBookAbbr[116] = {
- {"1 Chronicles", "1CH", 13}, //0
- {"1 Corinthians", "1CO", 70}, //1
- {"1 Esdras", "1E", 52}, //2
- {"1 John", "1J", 86}, //3
- {"1 Kings", "1K", 11}, //4
- {"1 Maccabees", "1M", 50}, //5
- {"1 Peter", "1P", 84}, //6
- {"1 Samuel", "1S", 9}, //7
- {"1 Thessalonians", "1TH", 76}, //8
- {"1 Timothy", "1TI", 78}, //9
- {"2 Chronicles", "2CH", 14}, //10
- {"2 Corinthians", "2CO", 71}, //11
- {"2 Esdras", "2E", 56}, //12
- {"2 John", "2J", 87}, //13
- {"2 Kings", "2K", 12}, //14
- {"2 Maccabees", "2M", 51}, //15
- {"2 Peter", "2P", 85}, //16
- {"2 Samuel", "2S", 10}, //17
- {"2 Thessalonians", "2TH", 77}, //18
- {"2 Timothy", "2TI", 79}, //19
- {"3 John", "3J", 88}, //20
- {"3 Maccabees", "3M", 55}, //21
- {"4 Maccabees", "4M", 57}, //22
- {"1 Chronicles", "1 CH", 13}, //0
- {"1 Corinthians", "1 CO", 70}, //1
- {"1 Esdras", "1 E", 52}, //2
- {"1 John", "1 J", 86}, //3
- {"1 Kings", "1 K", 11}, //4
- {"1 Maccabees", "1 M", 50}, //5
- {"1 Peter", "1 P", 84}, //6
- {"1 Samuel", "1 S", 9}, //7
- {"1 Thessalonians", "1 TH", 76}, //8
- {"1 Timothy", "1 TI", 78}, //9
- {"2 Chronicles", "2 CH", 14}, //10
- {"2 Corinthians", "2 CO", 71}, //11
- {"2 Esdras", "2 E", 56}, //12
- {"2 John", "2 J", 87}, //13
- {"2 Kings", "2 K", 12}, //14
- {"2 Maccabees", "2 M", 51}, //15
- {"2 Peter", "2 P", 85}, //16
- {"2 Samuel", "2 S", 10}, //17
- {"2 Thessalonians", "2 TH", 77}, //18
- {"2 Timothy", "2 TI", 79}, //19
- {"3 John", "3 J", 88}, //20
- {"3 Maccabees", "3 M", 55}, //21
- {"4 Maccabees", "4 M", 57}, //22
- {"Acts", "AC", 68}, //23
- {"Amos", "AM", 30}, //24
- {"Prayer of Asariah and the Song of the Three Jews", "AZ", 47},
- {"Baruch", "BA", 45}, //26
- {"Bel and the Dragon","BE", 49}, //27
- {"Colossians", "CO", 75}, //28
- {"Daniel", "DA", 27}, //29
- {"Deuteronomy", "DE", 5}, //30
- {"Deuteronomy", "DT", 5}, //31
- {"Ecclesiasties", "EC", 21}, //32
- {"Esther", "ES", 17}, //33
- {"Exodus", "EX", 2}, //34
- {"Ezekiel", "EZE", 26}, //35
- {"Ezra", "EZR", 15}, //36
- {"Galatians", "GA", 72}, //37
- {"Genesis", "GE", 1}, //38
- {"Genesis", "GN", 1}, //39
- {"Ephesians", "EP", 73}, //40
- {"Esther (Greek}", "GR", 42), //41
- {"Habakkuk", "HAB", 35}, //42
- {"Haggai", "HAG", 37}, //43
- {"Hebrews", "HE", 82}, //44
- {"Hosea", "HO", 28}, //45
- {"Isaiah", "IS", 23}, //46
- {"James", "JA", 83}, //47
- {"Jeremiah", "JE", 24}, //48
- {"Job", "JOB", 18}, //49
- {"Joel", "JOE", 29}, //50
- {"John", "JOH", 67}, //51
- {"Jonah", "JON", 32}, //52
- {"Joshua", "JOS", 6}, //53
- {"Jude", "JUDE", 89}, //54
- {"Judges", "JUDG", 7}, //55
- {"Judith", "JUDI", 41}, //56
- {"Lamentations", "LA", 25}, //57
- {"Letter of Jeremiah",Abbr:"LET", 46}, //58
- {"Leviticus", "LEV", 3}, //59
- {"Luke", "LK", 66}, //60
- {"Leviticus", "LV", 3}, //61
- {"Luke", "LU", 66}, //62
- {"Malachi", "MAL", 39}, //63
- {"Prayer of Manasseh",Abbr:"MAN", 53}, //64
- {"Mark", "MAR", 65}, //65
- {"Matthew", "MAT", 64}, //66
- {"Micah", "MI", 33}, //67
- {"Nahum", "NA", 34}, //68
- {"Nehemiah", "NE", 16}, //69
- {"Numbers", "NU", 4}, //70
- {"Obadiah", "OB", 31}, //71
- {"Psalm 151", "P1", 54}, //72
- {"Philemon", "PHILE", 81}, //73
- {"Philippians", "PHILI", 74}, //74
- {"Philemon", "PHM", 81}, //75
- {"Philippians", "PHP", 74}, //76
- {"Proverbs", "PR", 20}, //77
- {"Psalms", "PS", 19}, //78
- {"Revelation", "RE", 90}, //79
- {"Romans", "RM", 69}, //80
- {"Romans", "RO", 69}, //81
- {"Ruth", "RU", 8}, //82
- {"Sirach", "SI", 44}, //83
- {"Song of Solomon", "SOL", 22}, //84
- {"Song of Solomon", "SON", 22}, //85
- {"Song of Solomon", "SS", 22}, //86
- {"Susanna", "SU", 48}, //87
- {"Titus", "TI", 80}, //88
- {"Tobit", "TO", 40}, //89
- {"Wisdom", "WI", 43}, //90
- {"Zechariah", "ZEC", 38}, //91
- {"Zephaniah", "ZEP", 36} //92
- },
-
-string BookFileName[91] = {
- "","Genesis","Exodus","Lev","Num","Deut","Joshua","Judges", // 0 - 7
- "Ruth","1Sam","2Sam","1Kings","2Kings","1Chron","2Chron", // 8 - 14
- "Ezra","Nehemiah","Esther","Job","Psalms","Proverbs", // 15-20
- "Eccl","Song","Isaiah","Jeremiah","Lament","Ezekiel", // 21-26
- "Daniel","Hosea","Joel","Amos","Obadiah","Jonah","Micah", // 27-33
- "Nahum","Habakkuk","Zeph","Haggai","Zech","Malachi", // 34-39
- "Tobit","Judith","Esther","Wisdom","Sirach","Baruch", // 40-45
- "Let","Azar","Susanna","Bel","1Mac","2Mac","1Esdras", // 46-52
- "Man","P1","3Mac","2Esdras","4Mac","","","","","","", // 53-63
- "Matthew","Mark","Luke","John","Acts","Romans","1Cor", // 64-70
- "2Cor","Gal","Eph","Philip","Col","1Thes","2Thes","1Tim", // 71-78
- "2Tim","Titus","Philemon","Hebrews","James","1Peter", // 79-84
- "2Peter","1John","2John","3John","Jude","Rev"}; // 85-90
-
-class TReadGBF {
-private:
- FILE *fp;
- string FName, TokenLine;
- int TokenPos;
- bool fFileIsOpen, fParagraphEnd, fInTitle, fInPsalmBookTitle, fInHebrewTitle, fInSectionTitle;
-
-public:
- string sBook, sChapter, sVerse, sMode;
- string sContext; // Last text type (header, body, or tail)
- string sTitle; // Title of this book of the Bible
- string sPsalmBookTitle; // Title of this Psalm book
- string sHebrewTitle; // Psalm Hebrew title
- string sSectionTitle; // Section headings
- string sDate;
- string sFontName;
- int iTotalWords;
- char chJustification, chDirection;
- bool fIndent, fPoetry;
- int CharAttribs;
- char bBk, bChap, bVs, bWd;
-
- bool Init(const string sFileName);
- void Done();
- string GetToken(TToken &TokenKind);
- end;
-
-class TWriteGBF {
- private:
- F: TextFile;
- FName, LineOut: string;
- fFileIsOpen: boolean;
- bBk, bChap, bVs, bWd: byte;
-
- public
-
- function Init(const sFileName: string): boolean;
- function Done: boolean;
- procedure Out(const s: string);
- end;
-
-function isletter(const ch: char): boolean;
-function isinword(const ch: char): boolean;
-function IsDigit(const ch: char): Boolean;
-function IsUpper(const ch: char): Boolean;
-function ConformCase(const sPat, sSrc: string): string;
-function BookNameToNumber(const sBookName: string): byte;
-
-implementation
-
-function isletter(const ch: char): boolean;
-begin
- case ch of
- 'A'..'Z': isletter := true;
- 'a'..'z': isletter := true;
- else
- isletter := false;
- end;
-end;
-
-function isinword(const ch: char): boolean;
-begin
- case ch of
- '-': isinword := true;
- 'A'..'Z': isinword := true;
- 'a'..'z': isinword := true;
- else
- isinword := false;
- end;
-end;
-
-function IsUpper(const ch: char): Boolean;
-begin
- case ch of
- 'A'..'Z': IsUpper := true;
- else
- IsUpper := false;
- end;
-end;
-
-function IsDigit(const ch: char): Boolean;
-begin
- case ch of
- '0'..'9': IsDigit := true;
- else
- IsDigit := false;
- end;
-end;
-
-
-function MatchAbbrev(const sName, sAbbrev: string): boolean;
-var i: integer;
-begin
- if Length(sName) < Length(sAbbrev) then
- Result := false
- else
- Result := true;
- i := 1;
- while (i <= Length(sAbbrev)) and Result do
- begin
- if UpCase(sName[i]) <> sAbbrev[i] then
- Result := false;
- inc(i);
- end;
-end;
-
-function BookNameToNumber(const sBookName: string): byte;
-var i: integer;
-begin
- Result := 0;
- try
- if IsDigit(sBookName[Length(sBookName)]) and IsDigit(sBookName[1]) then
- Result := StrToInt(sBookName);
- except
- Result := 0;
- end;
- i := 0;
- while (Result = 0) and (i <= 115) do // Yuk! Linear search.
- begin
- if MatchAbbrev(sBookName,BookAbbr[i].Abbr) then
- begin
- Result := BookAbbr[i].Num;
- end;
- inc(i);
- end;
-end;
-
-function BookNumberToName(const bBookNum: byte): string;
-begin
- if bBookNum <= 115 then
- Result := BookAbbr[bBookNum].Name
- else
- Result := '';
-end;
-
-function ConformCase(const sPat, sSrc: string): string;
-var i: integer;
-begin
- Result := sSrc;
- if (Length(sPat) > 0) and (Length(sSrc) > 0) then
- begin
- Result := LowerCase(sSrc);
- if IsUpper(sPat[1]) then
- Result[1] := UpCase(Result[1]);
- if (Length(sPat) > 1) and (Length(sSrc) > 1) then
- begin
- if IsUpper(sPat[2]) then
- begin
- for i := 2 to Length(Result) do
- Result[i] := UpCase(Result[i]);
- end;
- end;
- end;
-end;
-
-function TReadGBF.Init(const sFileName: string): boolean;
-var s: string;
- tok: TToken;
-begin
- try
- fParagraphEnd := false;
- bBk := 0;
- bChap := 0;
- bVs := 0;
- bWd := 0;
- iTotalWords := 0;
- FName := sFileName;
- Assign(F, FName);
- reset(F);
- readln(F, TokenLine);
- TokenPos := 1;
- fFileIsOpen := true;
- repeat
- s := GetToken(tok)
- until (tok = tokEOF) or ((tok = tokHeader) and (s[3] = '0'));
- Init := true;
- except
- Init := false;
- fFileIsOpen := false;
- end
-end;
-
-procedure TReadGBF.Done;
-begin
- if fFileIsOpen then
- begin
- closefile(F);
- fFileIsOpen := false;
- end;
-end;
-
-function TReadGBF.GetToken(var TokenKind: TToken): string;
-var m: integer;
-begin
- Result := '';
- TokenKind := tokNull;
- if TokenPos = 0 then
- begin
- if (not fFileIsOpen) or EOF(F) then
- TokenKind := tokEOF
- else
- begin
- ReadLn(F,TokenLine);
- TokenPos := 1;
- end;
- end;
- if TokenKind <> tokEOF then
- begin
- m := Length(TokenLine);
- if TokenPos > m then
- begin
- TokenKind := tokSpace;
- if fParagraphEnd then
- fParagraphEnd := false
- else
- Result := ' ';
- TokenPos := 0;
- end
- else
- begin
- if (TokenLine[TokenPos] = '<') then
- begin
- fParagraphEnd := false;
- repeat
- Result := Result + TokenLine[TokenPos];
- inc(TokenPos);
- until (TokenLine[TokenPos] = '>') or (TokenPos > m);
- Result := Result + '>';
- inc(TokenPos);
- case result[2] of
- 'B': begin // File body text type
- TokenKind := tokContent;
- sContext := Result;
- end;
- 'C': begin // Special characters
- TokenKind := tokControl;
- if (Result[3] = 'M') or (Result[3] = 'L') then
- fParagraphEnd := true;
- end;
- 'D': begin // Direction
- TokenKind := tokControl;
- chDirection := Result[3];
- end;
- 'H': begin
- TokenKind := tokHeader;
- sContext := Result;
- end;
- 'F': begin // Font attributes
- TokenKind := tokFont;
- case Result[3] of
- 'B': CharAttribs := CharAttribs + [caBold];
- 'C': CharAttribs := CharAttribs + [caSmallCaps];
- 'I': CharAttribs := CharAttribs + [caItalic];
- 'N': sFontName := copy(Result,4,Length(Result)-4);
- 'O': CharAttribs := CharAttribs + [caOTQuote];
- 'R': CharAttribs := CharAttribs + [caRed];
- 'S': CharAttribs := CharAttribs + [caSuperscript];
- 'U': CharAttribs := CharAttribs + [caUnderline];
- 'V': CharAttribs := CharAttribs + [caSubscript];
- 'b': CharAttribs := CharAttribs - [caBold];
- 'c': CharAttribs := CharAttribs - [caSmallCaps];
- 'i': CharAttribs := CharAttribs - [caItalic];
- 'n': sFontName := '';
- 'o': CharAttribs := CharAttribs - [caOTQuote];
- 'r': CharAttribs := CharAttribs - [caRed];
- 's': CharAttribs := CharAttribs - [caSuperscript];
- 'u': CharAttribs := CharAttribs - [caUnderline];
- 'v': CharAttribs := CharAttribs - [caSubscript];
-
- end;
- end;
- 'J': begin // Justification
- TokenKind := tokStyle;
- chJustification := Result[3];
- end;
- 'P': begin // Poetry/prose, indent
- TokenKind := tokControl;
- case Result[3] of
- 'I': fIndent := true;
- 'P': fPoetry := true;
- 'i': fIndent := false;
- 'p': fPoetry := false;
- end;
- end;
- 'R': begin // References and footnotes
- TokenKind := tokControl;
- end;
- 'S': begin // sync mark
- TokenKind := TokSync;
- case Result[3] of
- 'B': begin // Book
- sBook := system.copy(Result, 4, length(Result)-4);
- sPsalmBookTitle := '';
- if sBook = '' then
- begin
- inc(bBk);
- sBook := BookNumberToName(bBk);
- end
- else
- bBk := BookNameToNumber(sBook);
- sTitle := sBook;
- end;
- 'C': begin //chapter
- sChapter := system.copy(Result, 4, length(Result)-4);
- if sChapter = '' then
- begin
- inc(bChap);
- sChapter := IntToStr(bChap);
- end
- else
- begin
- try
- bChap := StrToInt(sChapter);
- except
- showmessage('Non-numeric chapter: '+sBook+' '+sChapter);
- end;
- end;
- sHebrewTitle := '';
- end;
- 'V': begin // Verse
- bWd := 0;
- sVerse := system.copy(Result, 4, length(Result)-4);
- if sVerse = '' then
- begin
- inc(bVs);
- sVerse := IntToStr(bVs);
- end
- else
- begin
- try
- bVs := StrToInt(sVerse);
- except
- showmessage('Non-numeric verse: '+sBook+' '+sChapter+':'+sVerse);
- end;
- end;
- end;
- 'D': begin // Date
- sDate := system.copy(Result, 3, length(Result)-4);
- end;
- end;
- end;
- 'T': begin // Titles
- TokenKind := TokContent;
- case Result[3] of
- 'B':
- begin
- sPsalmBookTitle := '';
- fInPsalmBookTitle := true;
- end;
- 'b': fInPsalmBookTitle := true;
- 'H':
- begin
- sHebrewTitle := '';
- fInHebrewTitle := true;
- end;
- 'h': fInHebrewTitle := false;
- 'S':
- begin
- sSectionTitle := '';
- fInSectionTitle := true;
- end;
- 's': fInSectionTitle := false;
- 'T':
- begin
- sTitle := '';
- fInTitle := true;
- end;
- 't': fInTitle := false;
- end;
- end;
- 'Z': begin // File tail
- TokenKind := tokTail;
- sContext := Result;
- if Result[3] = 'Z' then
- done;
- end;
- else
- TokenKind := TokControl;
-
- end;
- end
- else if isletter(TokenLine[TokenPos]) then
- begin {Word}
- fParagraphEnd := false;
- TokenKind := tokWord;
- repeat
- Result := Result + TokenLine[TokenPos];
- inc(TokenPos);
- until (TokenPos > m) or (not isinword(TokenLine[TokenPos]));
- inc(bWd);
- inc(iTotalWords);
- end
- else if ((TokenLine[TokenPos] = ' ') or (TokenLine[TokenPos] = #9)) then
- begin
- fParagraphEnd := false;
- TokenKind := tokSpace;
- Result := Result + TokenLine[TokenPos];
- inc(TokenPos);
- end
- else
- begin
- fParagraphEnd := false;
- TokenKind := tokChar;
- Result := Result + TokenLine[TokenPos];
- inc(TokenPos);
- end
- end;
- end;
- if ((TokenKind = tokWord) or (TokenKind = tokSpace) or
- (TokenKind = tokChar)) then
- begin
- if fInTitle then
- sTitle := sTitle + Result
- else if fInPsalmBookTitle then
- sPsalmBookTitle := sPsalmBookTitle + Result
- else if fInHebrewTitle then
- sHebrewTitle := sHebrewTitle + Result
- else if fInSectionTitle then
- sSectionTitle := sSectionTitle + Result;
- end;
-end;
-
-function TWriteGBF.Init(const sFileName: string): boolean;
-begin
- try
- bBk := 0;
- bChap := 0;
- bVs := 0;
- bWd := 0;
- LineOut := '';
- FName := sFileName;
- Assign(F, FName);
- filemode := 1;
- rewrite(F);
- fFileIsOpen := true;
- Init := true;
- except
- Init := false;
- fFileIsOpen := false;
- end
-end;
-
-function TWriteGBF.Done: boolean;
-begin
- try
- if fFileIsOpen then
- begin
- if LineOut <> '' then
- begin
- WriteLn(F, LineOut);
- LineOut := '';
- end;
- CloseFile(F);
- end;
- Done := true;
- except
- Done := false;
- end;
-end;
-
-procedure TWriteGBF.Out(const s: string);
-var sPrint, sSave, sBook, sChapter, sVerse: string;
- i: integer;
- b: byte;
-begin
- if (Length(s) > 0) and IsLetter(s[1]) then
- begin
- inc(bWd);
- LineOut := LineOut + s;
- end
- else if Length(s) > 3 then
- begin
- if (s[1] = '<') and (s[2] = 'S') then
- begin
- case s[3] of
- 'B': begin // Book
- sBook := system.copy(s, 4, length(s)-4);
- if sBook = '' then
- begin
- inc(bBk);
- LineOut := LineOut + s;
- end
- else
- begin
- b := bBk;
- bBk := BookNameToNumber(sBook);
- if b <> bBk then
- LineOut := LineOut + s;
- end;
- end;
- 'C': begin //chapter
- sChapter := system.copy(s, 4, length(s)-4);
- if sChapter = '' then
- begin
- inc(bChap);
- LineOut := LineOut + s;
- end
- else
- begin
- try
-// b := bChap;
- bChap := StrToInt(sChapter);
-// if b <> bChap then
- LineOut := LineOut + s;
- except
- showmessage('Non-numeric chapter: '+sBook+' '+sChapter);
- end;
- end;
- end;
- 'V': begin // Verse
- bWd := 0;
- sVerse := system.copy(s, 4, length(s)-4);
- if sVerse = '' then
- begin
- inc(bVs);
- LineOut := LineOut + s;
- end
- else
- begin
- try
-// b := bVs;
- bVs := StrToInt(sVerse);
-// if b <> bVs then
- LineOut := LineOut + s;
- except
- showmessage('Non-numeric verse: '+sBook+' '+sChapter+':'+sVerse);
- end;
- end;
- end;
- else
- LineOut := LineOut + s;
- end
- end
- else
- LineOut := LineOut + s; // Not a sync mark
- end
- else // other token, space, or punctuation
- LineOut := LineOut + s; // Length <= 3
- if ((s = '<CM>') or (s = '<CL>')) then
- begin
- if (Length(LineOut) > 78) then
- begin
- i := 78;
- while (i > 0) and (LineOut[i] <> ' ') do
- dec(i);
- if i < 1 then
- begin
- WriteLn(F,LineOut);
- LineOut := '';
- end
- else
- begin
- sPrint := system.copy(LineOut,1,i-1);
- sSave := system.copy(LineOut,i+1,Length(LineOut)-i);
- WriteLn(F,sPrint);
- WriteLn(F, sSave);
- LineOut := '';
- end
- end
- else
- begin
- WriteLn(F, LineOut);
- LineOut := '';
- end
- end
- else if (Length(LineOut) > 78) then
- begin
- i := 78;
- while (i > 0) and (LineOut[i] <> ' ') do
- dec(i);
- if i < 1 then
- begin
- WriteLn(F,LineOut);
- LineOut := '';
- end
- else
- begin
- sPrint := system.copy(LineOut,1,i-1);
- sSave := system.copy(LineOut,i+1,Length(LineOut)-i);
- WriteLn(F,sPrint);
- LineOut := sSave;
- end
- end
-end;
-
-end.