summaryrefslogtreecommitdiff
path: root/src/modules/texts/ztext/ztext.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/modules/texts/ztext/ztext.cpp')
-rw-r--r--src/modules/texts/ztext/ztext.cpp440
1 files changed, 0 insertions, 440 deletions
diff --git a/src/modules/texts/ztext/ztext.cpp b/src/modules/texts/ztext/ztext.cpp
deleted file mode 100644
index 1fe0e7a..0000000
--- a/src/modules/texts/ztext/ztext.cpp
+++ /dev/null
@@ -1,440 +0,0 @@
-/******************************************************************************
- * ztext.cpp - code for class 'zText'- a module that reads compressed text
- * files: ot and nt using indexs ??.vss
- */
-
-
-#include <ctype.h>
-#include <stdio.h>
-#include <fcntl.h>
-
-#ifndef __GNUC__
-#include <io.h>
-#else
-#include <unistd.h>
-#endif
-
-#include <utilfuns.h>
-#include <ztext.h>
-
-#include <regex.h> // GNU
-
-
-#ifdef USELUCENE
-#include <CLucene/CLucene.h>
-using namespace lucene::search;
-using namespace lucene::queryParser;
-#endif
-
-SWORD_NAMESPACE_START
-
-/******************************************************************************
- * zText Constructor - Initializes data for instance of zText
- *
- * ENT: ipath - path to data files
- * iname - Internal name for module
- * idesc - Name to display to user for module
- * iblockType - verse, chapter, book, etc. of index chunks
- * icomp - Compressor object
- * idisp - Display object to use for displaying
- */
-
-zText::zText(const char *ipath, const char *iname, const char *idesc, int iblockType, SWCompress *icomp, SWDisplay *idisp, SWTextEncoding enc, SWTextDirection dir, SWTextMarkup mark, const char* ilang)
- : zVerse(ipath, -1, iblockType, icomp), SWText(iname, idesc, idisp, enc, dir, mark, ilang) {
- blockType = iblockType;
- lastWriteKey = 0;
-#ifdef USELUCENE
- SWBuf fname;
- fname = path;
- ir = 0;
- is = 0;
- char ch = fname.c_str()[strlen(fname.c_str())-1];
- if ((ch != '/') && (ch != '\\'))
- fname += "/lucene";
- if (IndexReader::indexExists(fname.c_str())) {
- ir = &IndexReader::open(fname);
- is = new IndexSearcher(*ir);
- }
-#endif
-}
-
-
-/******************************************************************************
- * zText Destructor - Cleans up instance of zText
- */
-
-zText::~zText()
-{
- flushCache();
-
- if (lastWriteKey)
- delete lastWriteKey;
-
-#ifdef USELUCENE
- if (is)
- is->close();
-
- if (ir)
- delete ir;
-#endif
-}
-
-
-/******************************************************************************
- * zText::getRawEntry - Returns the current verse buffer
- *
- * RET: buffer with verse
- */
-
-SWBuf &zText::getRawEntryBuf() {
- long start = 0;
- unsigned short size = 0;
- VerseKey &key = getVerseKey();
-
- findOffset(key.Testament(), key.Index(), &start, &size);
- entrySize = size; // support getEntrySize call
-
- entryBuf = "";
- zReadText(key.Testament(), start, size, entryBuf);
-
- rawFilter(entryBuf, &key);
-
-// if (!isUnicode())
- prepText(entryBuf);
-
- return entryBuf;
-}
-
-
-bool zText::sameBlock(VerseKey *k1, VerseKey *k2) {
- if (k1->Testament() != k2->Testament())
- return false;
-
- switch (blockType) {
- case VERSEBLOCKS:
- if (k1->Verse() != k2->Verse())
- return false;
- case CHAPTERBLOCKS:
- if (k1->Chapter() != k2->Chapter())
- return false;
- case BOOKBLOCKS:
- if (k1->Book() != k2->Book())
- return false;
- }
- return true;
-}
-
-
-void zText::setEntry(const char *inbuf, long len) {
- VerseKey &key = getVerseKey();
-
- // see if we've jumped across blocks since last write
- if (lastWriteKey) {
- if (!sameBlock(lastWriteKey, &key)) {
- flushCache();
- }
- delete lastWriteKey;
- }
-
- doSetText(key.Testament(), key.Index(), inbuf, len);
-
- lastWriteKey = (VerseKey *)key.clone(); // must delete
-}
-
-
-void zText::linkEntry(const SWKey *inkey) {
- VerseKey &destkey = getVerseKey();
- const VerseKey *srckey = 0;
-
- // see if we have a VerseKey * or decendant
- try {
- srckey = (const VerseKey *) SWDYNAMIC_CAST(VerseKey, inkey);
- }
- catch ( ... ) {
- }
- // if we don't have a VerseKey * decendant, create our own
- if (!srckey)
- srckey = new VerseKey(inkey);
-
- doLinkEntry(destkey.Testament(), destkey.Index(), srckey->Index());
-
- if (inkey != srckey) // free our key if we created a VerseKey
- delete srckey;
-}
-
-
-/******************************************************************************
- * zFiles::deleteEntry - deletes this entry
- *
- */
-
-void zText::deleteEntry() {
-
- VerseKey &key = getVerseKey();
-
- doSetText(key.Testament(), key.Index(), "");
-}
-
-
-/******************************************************************************
- * zText::increment - Increments module key a number of entries
- *
- * ENT: increment - Number of entries to jump forward
- *
- */
-
-void zText::increment(int steps) {
- long start;
- unsigned short size;
- VerseKey *tmpkey = &getVerseKey();
-
- findOffset(tmpkey->Testament(), tmpkey->Index(), &start, &size);
-
- SWKey lastgood = *tmpkey;
- while (steps) {
- long laststart = start;
- unsigned short lastsize = size;
- SWKey lasttry = *tmpkey;
- (steps > 0) ? (*key)++ : (*key)--;
- tmpkey = &getVerseKey();
-
- if ((error = key->Error())) {
- *key = lastgood;
- break;
- }
- long index = tmpkey->Index();
- findOffset(tmpkey->Testament(), index, &start, &size);
-
- if (
- (((laststart != start) || (lastsize != size)) // we're a different entry
-// && (start > 0)
- && (size)) // and we actually have a size
- ||(!skipConsecutiveLinks)) { // or we don't want to skip consecutive links
- steps += (steps < 0) ? 1 : -1;
- lastgood = *tmpkey;
- }
- }
- error = (error) ? KEYERR_OUTOFBOUNDS : 0;
-}
-
-
-VerseKey &zText::getVerseKey() {
- static VerseKey tmpVK;
- VerseKey *key;
- // see if we have a VerseKey * or decendant
- try {
- key = SWDYNAMIC_CAST(VerseKey, this->key);
- }
- catch ( ... ) { }
- if (!key) {
- ListKey *lkTest = 0;
- try {
- lkTest = SWDYNAMIC_CAST(ListKey, this->key);
- }
- catch ( ... ) { }
- if (lkTest) {
- try {
- key = SWDYNAMIC_CAST(VerseKey, lkTest->GetElement());
- }
- catch ( ... ) { }
- }
- }
- if (!key) {
- tmpVK = *(this->key);
- return tmpVK;
- }
- else return *key;
-}
-
-
-#ifndef O_BINARY
-#define O_BINARY 0
-#endif
-
-signed char zText::createSearchFramework() {
-#ifdef USELUCENE
- SWKey *savekey = 0;
- SWKey *searchkey = 0;
- SWKey textkey;
- char *word = 0;
- char *wordBuf = 0;
-
-
- // save key information so as not to disrupt original
- // module position
- if (!key->Persist()) {
- savekey = CreateKey();
- *savekey = *key;
- }
- else savekey = key;
-
- searchkey = (key->Persist())?key->clone():0;
- if (searchkey) {
- searchkey->Persist(1);
- setKey(*searchkey);
- }
-
- // position module at the beginning
- *this = TOP;
-
- VerseKey *lkey = (VerseKey *)key;
-
- // iterate thru each entry in module
-
- IndexWriter* writer = NULL;
- Directory* d = NULL;
-
- lucene::analysis::SimpleAnalyzer& an = *new lucene::analysis::SimpleAnalyzer();
- SWBuf target = path;
- char ch = target.c_str()[strlen(target.c_str())-1];
- if ((ch != '/') && (ch != '\\'))
- target += "/lucene";
-
- if (IndexReader::indexExists(target.c_str())) {
- d = &FSDirectory::getDirectory(target.c_str(), false);
- if (IndexReader::isLocked(*d)) {
- IndexReader::unlock(*d);
- }
-
- writer = new IndexWriter(*d, an, false);
- } else {
- d = &FSDirectory::getDirectory(target.c_str(), true);
- writer = new IndexWriter( *d ,an, true);
- }
-
-
-
- while (!Error()) {
- Document &doc = *new Document();
- doc.add( Field::Text(_T("key"), (const char *)*lkey ) );
- doc.add( Field::Text(_T("content"), StripText()) );
- writer->addDocument(doc);
- delete &doc;
-
- (*this)++;
- }
-
- writer->optimize();
- writer->close();
- delete writer;
- delete &an;
-
- // reposition module back to where it was before we were called
- setKey(*savekey);
-
- if (!savekey->Persist())
- delete savekey;
-
- if (searchkey)
- delete searchkey;
-
-
-#endif
- return 0;
-}
-
-
-/******************************************************************************
- * SWModule::Search - Searches a module for a string
- *
- * ENT: istr - string for which to search
- * searchType - type of search to perform
- * >=0 - regex
- * -1 - phrase
- * -2 - multiword
- * flags - options flags for search
- * justCheckIfSupported - if set, don't search, only tell if this
- * function supports requested search.
- *
- * RET: listkey set to verses that contain istr
- */
-
-ListKey &zText::search(const char *istr, int searchType, int flags, SWKey *scope, bool *justCheckIfSupported, void (*percent)(char, void *), void *percentUserData) {
-#ifdef USELUCENE
- listkey.ClearList();
-
- if ((is) && (ir)) {
-
- switch (searchType) {
- case -2: { // let lucene replace multiword for now
-
-
- // test to see if our scope for this search is bounded by a
- // VerseKey
- VerseKey *testKeyType = 0, vk;
- try {
- testKeyType = SWDYNAMIC_CAST(VerseKey, ((scope)?scope:key));
- }
- catch ( ... ) {}
- // if we don't have a VerseKey * decendant we can't handle
- // because of scope.
- // In the future, add bool SWKey::isValid(const char *tryString);
- if (!testKeyType)
- break;
-
-
- // check if we just want to see if search is supported.
- // If we've gotten this far, then it is supported.
- if (justCheckIfSupported) {
- *justCheckIfSupported = true;
- return listkey;
- }
-
- (*percent)(10, percentUserData);
-
- standard::StandardAnalyzer analyzer;
- Query &q = QueryParser::Parse(istr, _T("content"), analyzer);
- (*percent)(20, percentUserData);
- Hits &h = is->search(q);
- (*percent)(80, percentUserData);
-
-
- // iterate thru each good module position that meets the search
- for (long i = 0; i < h.Length(); i++) {
- Document &doc = h.doc(i);
-
- // set a temporary verse key to this module position
- vk = doc.get(_T("key"));
-
- // check scope
- // Try to set our scope key to this verse key
- if (scope) {
- *testKeyType = vk;
-
- // check to see if it set ok and if so, add to our return list
- if (*testKeyType == vk)
- listkey << (const char *) vk;
- listkey.GetElement()->userData = (void *)(int)(h.score(i)*100);
- }
- else {
- listkey << (const char*) vk;
- listkey.GetElement()->userData = (void *)(int)(h.score(i)*100);
- }
- }
- (*percent)(98, percentUserData);
-
- delete &h;
- delete &q;
-
- listkey = TOP;
- (*percent)(100, percentUserData);
- return listkey;
- }
-
- default:
- break;
- }
- }
-
- // check if we just want to see if search is supported
- if (justCheckIfSupported) {
- *justCheckIfSupported = false;
- return listkey;
- }
-#endif
- // if we don't support this search, fall back to base class
- return SWModule::search(istr, searchType, flags, scope, justCheckIfSupported, percent, percentUserData);
-}
-
-
-SWORD_NAMESPACE_END