Revision: 64
http://readthebible.svn.sourceforge.net/readthebible/?rev=64&view=rev
Author: vanyo_g
Date: 2010-08-18 20:02:00 +0000 (Wed, 18 Aug 2010)
Log Message:
-----------
New File Import from .txt file feature is started
Modified Paths:
--------------
trunk/bibleWindow.cpp
trunk/bibleWindow.h
trunk/htdocs/readme-bg.html
trunk/mainWindow.cpp
trunk/mainWindow.h
trunk/mainWindow.ui
trunk/showMessage.cpp
trunk/showMessage.h
Modified: trunk/bibleWindow.cpp
===================================================================
--- trunk/bibleWindow.cpp 2010-07-07 19:58:29 UTC (rev 63)
+++ trunk/bibleWindow.cpp 2010-08-18 20:02:00 UTC (rev 64)
@@ -1,960 +1,1014 @@
-/*
-CD Bible 5 - open source biblical program
-Copyright (C) 2008 Vanyo Georgiev <info@...>
-
-This program is free software; you can redistribute it and/or
-modify it under the terms of the GNU General Public License
-as published by the Free Software Foundation; either version 2
-of the License, or (at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-*/
-
-#include "bibleWindow.h"
-#include "showMessage.h"
-#include "myFileRoutines.h"
-#include "language.h"
-#include "fileDownloader.h"
-#include "preferences.h"
-#include "process.h"
-#include "concordance.h"
-
-#include <QHash>
-#include <QFileInfo>
-#include <QApplication>
-#include <QTextCodec>
-#include <QProgressBar>
-#include <QPushButton>
-#include <QTextBlock>
-#include <QTextDocumentFragment>
-#include <QTextStream>
-
-QProgressBar *downloadProgressBar = 0;
-QPushButton *dounloadCancelButton = 0;
-QString bible_Path = "data/bibles/";
-QHash<QString, int> read_pos;
-//QHash<QString, ConcordanceModel*> concordanceHash;
-
-//------------------VerseCorrection---------------------
-
-VerseCorrection::VerseCorrection(const QStringList &cl){
- bk = cl.at(0).toInt();
- ch0 = cl.at(1).toInt();
- vr0 = cl.at(2).toInt();
- ch1 = cl.at(3).toInt();
- vr1 = cl.at(4).toInt();
-};
-
-//-------------------BibleWindow------------------
-
-BibleWindow::BibleWindow(const QString &bv, QWidget *parent)
- :QTextBrowser(parent)
-{
- setAttribute(Qt::WA_DeleteOnClose);
- bible_Version = bv;
- zipFile = bv+".zip";
- setOpenLinks(false);
-#ifdef Q_WS_WIN
- dir = bible_Path+bv+"\\";
-#else
- dir = bible_Path+bv+"/";
-#endif
- zipFile = dir+zipFile;
-#ifdef Q_WS_MAC
- QString sf = "style.css";
-#else
- QString sf = "style-w.css";
-#endif
- if (QFileInfo(dir+sf).exists()) css = fileContent(dir+sf);
- else css = defaultCss();
- process = 0;
- setWindowTitle( versionCaption(bv) );
- bkl=0; chl=0; vrl=0; fileDownloader=0;
- synchronize = true;
- wordsChanged = false;
- if (!readTitles()){
- downloadBible(bv);
- return;
- };
- bible_Structure = readStructure(dir+"BibleStructure.csv");
- readCorrection();
- concordance_ = new ConcordanceModel(dir, versionCodec(bv), this);
-/* concordance_ = concordanceHash.value(bible_Version);
- if (!concordance_){
- concordance_ = new ConcordanceModel(dir, versionCodec(bv), this);
- concordanceHash[bible_Version] = concordance_;
- }*/
-};
-
-bool BibleWindow::readTitles(){
- QString fn = dir+"BibleTitles.txt";
- QString fnu = dir+"BibleTitles-u.txt";
- if (!QFileInfo(fn).exists()) return false;
- QString fc="";
- if (QFileInfo(fnu).exists()) fc = fileContent(fnu, "UTF-8" );
- else fc = fileContent(fn, versionCodec(bibleVersion()) );
- if (!fc.size()) return false;
- QStringList fl = fc.split("\n");
- if (!fl.size()) return false;
- QStringList l0 = fl.at(0).split(" ");
- book_count = l0.at(0).toInt();
- if (!book_count) return false;
- for(int i=1; i<=book_count; i++){
- int j = l0.at(i).toInt();
- global_book.insert( i, j );
- local_book.insert( j, i );
- longTitles << fl.at(i);
- shortTitles << fl.at(i+book_count);
- QString a = fl.at(i+2*book_count);
- abrevs << a;
- book_index[a] = i;
- }
- return true;
-};
-
-void BibleWindow::readCorrection(){
- QString fn = dir+"_Diff_.txt";
- if ( !QFileInfo(fn).exists() ) return;
- QString fc = fileContent(fn);
- QStringList fl = fc.split("\n");
- for(int i=0; i<fl.size(); i++){
- QStringList cl = fl.at(i).trimmed().split(" ");
- if (cl.size()==5){
- VerseCorrection *vcLG = new VerseCorrection(cl), *vcGL = new VerseCorrection(cl);
- vcGL->ch0 = vcGL->ch0 + vcGL->ch1;
- vcGL->vr0 = vcGL->vr0 + vcGL->vr1;
- correctionLG.append(vcLG);
- correctionGL.append(vcGL);
- }
- }
-};
-
-void BibleWindow::downloadBible(const QString &bv){
- if (yesNo( tr("Would you like to download Bible %1?").arg(windowTitle()) )!=YES) return;
- if (!fileDownloader){
- fileDownloader = new FileDownloader( this, downloadProgressBar, dounloadCancelButton);
- connect(fileDownloader, SIGNAL(done(bool)), this, SLOT(onDownloadDone(bool)));
- }
- QString of = "http://"+downloadSite()+"/bible/v5/"+QFileInfo(zipFile).fileName();
-// showMessage(zipFile);// return;
- fileDownloader->downloadFile(of,zipFile);
-};
-
-void BibleWindow::writeSettings(){
- concordance()->writeSettings();
-};
-
-void BibleWindow::readSettings(){
-
-};
-
-void BibleWindow::createLinksBin(){
- QString fln = dir+"Links.txt";
- QFile lf(fln);
- if (!lf.exists()) {
- showMessage(tr("File do not exist\n%1").arg(fln));
- return;
- }
- QString idfn = dir+"Links.bin"; // Двоични файлове, в които се записват препратките
- QString ipfn = dir+"LinksP.bin";
- QFile idf(idfn);
- QFile ipf(ipfn);
- if (!idf.open(QFile::WriteOnly)){
- showMessage(tr("Can't open file for write\n%1").arg(idfn));
- return;
- }
- if (!ipf.open(QFile::WriteOnly)){
- showMessage(tr("Can't open file for write\n%1").arg(ipfn));
- return;
- }
- QDataStream ds(&idf);
- QDataStream ps(&ipf);
- ds.setByteOrder(QDataStream::LittleEndian);
- ps.setByteOrder(QDataStream::LittleEndian);
- int vi0 = 1; // Локален индекс на последния стих, за който са записани препратки
- qint32 m1 = -1; // Константа -1, която се записва вместо указател за стиховете, от които няма препратки
- QString flc = fileContent(fln); // Чете се файла с описание на препратките
- QStringList lns = flc.split("\n"); // Разделя се на списък от редове
- for (int i=0; i<lns.size(); i++){ // Обработва се всеки ред
- QString ln = lns.at(i).trimmed(); // Това е i-ия ред
- if (!ln.size()) continue;
- QStringList lks = ln.split(QString(9)); // Реда се разделя на две части от табулатор
- if (lks.size()<2){ // Ако няма табулатор реда се прескача
- showMessage( tr("There is no Tab symbol in this line:\n%1").arg(ln) );
- continue;
- }
- QString ln1 = lks.at(0).trimmed(); // Частта пред табулатора означава за кой стих се отнасят препратките
- int vi = verseIndex(ln1); // Локален индекс на стиха, за който се отнасят препратките
- for(int j=vi0+1; j<vi; j++){ // Записва -1 вместо указатели, за стиховете до тук, от които няма препратки
- ps << m1;
- }
- vi0 = vi;
- qint32 p = idf.pos()/2; ps << p; // Записва указател в LinksP.bin
- if (vi*4!=ipf.pos()){ showMessage(ln); break; }
- QStringList ls = lks.at(1).trimmed().split(","); // Останалата част от реда съдържа препратки, разделени със запетая
- QList<quint16> ll; // Списък с локални индекси на стихове, към които има препратки от стих vi
- for (int j=0; j<ls.size(); j++){ // Обработва се всяка препратка.
- QString lk = ls.at(j).trimmed(); // Поредната препратка
- QStringList vs = lk.split("-"); // Препратката се разделя на две части от тире.
- QString vs1 = vs.at(0).trimmed();// Първата част
- if (!vs1.size()){ // Ако първата част е празна
- showMessage(lks.at(1));
- continue;
- }
- int li = verseIndex(vs1); // Локален индекст на стиха, към който сочи първата част на препратката
- if (li<0) showMessage(ln);
- ll << li;
- if (vs.size()>1){ // Ако е имало тире, се добавят и всички стихове до посочения след тирето
- bool ok;
- int v2 = vs.at(1).trimmed().toInt(&ok); // Номер на стиха след тирето
- if (!ok) showMessage( tr("Can't recognize verse number in reference %1").arg(lk) );
- else for(int v = li+1; v <= v2; v++) ll << v;
- }
- }
- quint16 sz = ll.size(); // Записва препратките в Links.bin
- ds << sz;
- for(int j=0; j<sz; j++) ds << ll.at(j);
- }
- showMessage(reference(vi0));
- for(int i=vi0+1; i<verseTotalCount()+1; i++) ps << m1; // Допълва файла с указатели до последния стих на Библията
- idf.close(); ipf.close();
- showMessage(tr("Link file was created."));
-};
-
-void BibleWindow::onDownloadDone(bool e){
- if (e || fileDownloader->notDone){
- showMessage("download error");
- return;
- }
- QStringList a;
- a << "-o" << QFileInfo(zipFile).absoluteFilePath();
-// showMessage(a.join("\n"));
- if (!process){
- process = new QProcess(this);
- connect(process, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(onUnzipFinished(int,QProcess::ExitStatus)));
- }
- process->setWorkingDirectory(QFileInfo(zipFile).absolutePath());
- process->start("unzip",a);
-};
-
-void BibleWindow::onUnzipFinished( int exitCode, QProcess::ExitStatus exitStatus ){
- showMessage( tr("Downloaging is finished. Now you can open the Bible %1.").arg(windowTitle()) );
- QFile( QFileInfo(zipFile).absoluteFilePath() ).remove();
-};
-
-void BibleWindow::globalToLocal(){
- ch = gch; vr = gvr;
- if (!correctionGL.size()) return;
- int i = 0;
- while( (i<correctionGL.size()) && (correctionGL.at(i)->bk < bk) ) i++;
- while( (i<correctionGL.size()) && (correctionGL.at(i)->bk == bk) ){
- if ( (correctionGL.at(i)->ch0 == gch) && (correctionGL.at(i)->vr0 <= gvr) ){
- ch = gch - correctionGL.at(i)->ch1;
-// showMessage(bibleVersion()+" :: " + QString::number(correctionGL.at(i)->ch1)+" "+QString::number(correctionGL.at(i)->vr1));
- vr = gvr - correctionGL.at(i)->vr1;
- }
- i++;
- }
-};
-
-void BibleWindow::localToGlobal(){
- gch = ch; gvr = vr;
- if (!correctionLG.size()) return;
- int i = 0;
- while( (i<correctionLG.size()) && (correctionLG.at(i)->bk < bk) ) i++;
- while( (i<correctionLG.size()) && (correctionLG.at(i)->bk == bk) ){
- if ( (correctionLG.at(i)->ch0 == ch) && (correctionLG.at(i)->vr0 <= vr) ){
- gch = ch + correctionLG.at(i)->ch1;
- gvr = vr + correctionLG.at(i)->vr1;
- }
- i++;
- }
-};
-
-QString BibleWindow::verseText(int i){
- int p = pointer(i-1, dir+"CompactPoint.bin");
- if (p<0) return "";
- return textFragment(p, dir+"CompactText.bin", versionCodec(bibleVersion()) );
-};
-
-QString between(const QString &s, const QString &e, const QString &st){
- int p1 = st.indexOf(s)+s.size(); if (p1<0) p1 = 0;
- int p2 = st.indexOf(e,p1); if (p2<p1) p2 = st.size()-1;
- return st.mid(p1,p2-p1);
-}
-
-void BibleWindow::setVerseColor(int vr, const QString &c1, const QString &c2){
- QTextBlock tb = document()->findBlockByNumber( vr );
- QFont font = tb.charFormat().font();
- setFont(font);
- int p = tb.position();
- if (!p) return;
- QTextCursor tc = textCursor();
- bool up = p>tc.position();
- tc.setPosition(p);
- tc.movePosition(QTextCursor::EndOfBlock,QTextCursor::KeepAnchor);
- QString h = tc.selection().toHtml();
- h = between("<!--StartFragment-->","<!--EndFragment-->",h);
- h = h.replace("color:"+c1+";","color:"+c2+";");
- h.replace("text-decoration: underline","text-decoration: none");
- QString nt = "<font color=\""+c2+"\">"+h+"</font>";
- tc.insertHtml(nt);
- if (up) setTextCursor(tc);
- tc.movePosition(QTextCursor::StartOfBlock,QTextCursor::MoveAnchor);
- setTextCursor(tc);
-};
-
-QStringList *BibleWindow::verseTexts(int i, int c){
- int p = pointer(i-1, dir+"CompactPoint.bin");
- if (p<0) return 0;
- return textFragments(p, c, dir+"CompactText.bin", versionCodec(bibleVersion()) );
-};
-
-QString BibleWindow::wordChapter(){
- return wordChapter(book());
-};
-
-QString BibleWindow::addTags(const QString &s0){
- int i; int j1 = 0;
- bool f1 = true, f2 = false;
- QString s = s0;
- s.replace("<","<");
- QString r = "";
- for(i = 0; i<s.size(); i++){
- switch (s.at(i).unicode()){
- case 0x7B: // {
- if (i>j1) r += s.mid( j1, i-j1-1 );
- j1 = i+1;
- f2 = true;
- break;
- case 0x7C: // |
- if (f2) break;
- r += s.mid( j1, i-j1 );
- if (f1) r += "<i>"; else r += "</i>";
- f1 = !f1;
- j1 = i+1;
- break;
- case 0x7D: // }
- fCount++;
- QString sn = QString::number(fCount);
- switch (preferences()->footnotes()){
- case 0:
- r += "<strong><sup> <a href=\"#f"+sn+"\">"+sn+"</a></sup></strong>";
- footnotes += "<a name=\"f"+sn+"\"></a><p class=\"footnote\"><sup>"+sn+"</sup> " +
- addTags(s.mid( j1, i-j1 ))+"</p>";
- break;
- case 1:
- r += " <font color=\""+preferedColor()->footnoteColor().name()+"\">{"+addTags(s.mid( j1, i-j1 ))+"}</font> ";
- break;
- };
- j1 = i+2;
- f2 = false;
- break;
- }
- }
- r += s.mid(j1,i-j1);
- r = concordance_->colorWords(r);
- return r;
-};
-
-QString BibleWindow::addLinks(int i, int v){
- QString r = ""; QString lnk = "";
- if (QFileInfo(dir+"LinksP.bin").exists()){
- int p = pointer(i-1,dir+"LinksP.bin");
- if (p>=0){//showMessage(p);
- QString ln = QString::number(p);
- switch (preferences()->references()){
- case 0: // Препратките се поставят в края на главата
- r = " <a href=\"#"+ln+"\"><sup><strong>"+QChar(0x21e8)+"</strong></sup></a>";
- lnk += "<a name=\""+ln+"\"></a><p class=\"footnote\"><sup>"+QString::number(v)+"</sup> ";
- break;
- case 1: // Препратките се поставят в края на стиховете
- lnk = " <font color=\""+preferedColor()->footnoteColor().name()+"\">{";
- break;
- };
- QList<int> *ia = indexArray(p, dir+"Links.bin");
- for(int k=0; k<ia->size(); k++){
- int vi = ia->at(k);
- QString t = QString::number(vi);
- lnk += "<a href=\""+t+"\">"+ reference(vi,true)+"</a>";
- if (k==ia->size()-1) lnk += ".";
- else lnk += ", ";
- }
- switch (preferences()->references()){
- case 0: lnk += "</p>"; break;
- case 1: lnk += "}</font>"; break;
- }
- }
- }
- switch (preferences()->references()){
- case 0:
- links += lnk;
- return r;
- case 1:
- return lnk;
- };
- return "";
-};
-
-QString BibleWindow::wordChapter(int b){
- b = global_book.value(b);
- QString ln = language();
- if (b==22) return languageObject()->psalm(ln);
- else return languageObject()->chapter(ln);
-};
-
-void BibleWindow::displayText(){
- if ((bk!=bkl)||(ch!=chl)||wordsChanged) displayFreshText();
- if (!verseCount()) return;
- setVerseColor(vrl, preferedColor()->activeVerseColor().name(), preferedColor()->bibleTextColor().name() );
- setVerseColor(vr, preferedColor()->bibleTextColor().name(), preferedColor()->activeVerseColor().name());
- vrl = vr;
-};
-
-void BibleWindow::displayFreshText(){
- clear();
- QPalette p = palette();
- p.setColor(QPalette::Active, QPalette::Base, preferedColor()->baseColor());
- p.setColor(QPalette::Active, QPalette::Text, preferedColor()->bibleTextColor());
- p.setColor(QPalette::Active, QPalette::Link, preferedColor()->footnoteColor());
- setPalette(p);
- bkl=bk;
- if (book()==0){
- setText(reference());
- return;
- }
- chl=ch;
- int i = referenceToIndex(book(), chapter(), 1, bible_Structure);
- links = ""; footnotes = ""; fCount = 0;
- QString tx = "<html><head><style>"+css+"</style>"+
- "</head><body>\n<h3>"+longTitles.value(book()-1)+"\n"+
- "<br />"+wordChapter()+" "+QString::number(chapter())+"</h3>\n";
- for(int j=0; j<verseCount(); j++){
- QString vtx = verseText(i+j);
- QString sty = "";
- if (vtx.at(0)==QChar(182)){
- vtx = vtx.remove(0,1);
- sty = " class=\"pstart\"";
- }
- if (vtx.size()) tx += "<p"+sty+">"+QString::number(j+1)+". "+ addTags(vtx) + addLinks(i+j,j+1)+"</p>";
- else tx += "<p> </p>";
- }
- if (links.size()) links = "<hr width=\"50%\">"+links;
- if (footnotes.size()) footnotes = "<hr>"+footnotes;
- setHtml(tx+footnotes+links+"</body></html>");
- wordsChanged=false;
-};
-
-QString BibleWindow::toHtml(ExportDialog::Export e){
- int b1=1, b2=bookCount();
- QString r = "";
- if (e!=ExportDialog::Bible){ b1=book(); b2=b1; }
- if (!b1) return r;
- r = "<h1>"+windowTitle()+"</h1>\n\n";
- for(int b=b1; b<=b2; b++){
- r += "<h2>"+longTitles.value(b-1)+"</h2>\n\n";
- int c1=1, c2=bible_Structure->value(b-1)->size()-1;
- if (e==ExportDialog::Chapter){ c1=chapter(); c2=c1; }
- for(int c=c1; c<=c2; c++){
- r += "<h3>"+wordChapter(b)+" "+QString::number(c)+"</h3>\n\n";
- int i = referenceToIndex(b,c,1,bible_Structure);
- int vc = bible_Structure->value(b-1)->value(c);
- QStringList *tx = verseTexts( i, vc );
- for(int v=0; v<vc; v++){
- r += "<p>"+QString::number(v+1)+". "+addTags( tx->at(v) )+"</p>\n";
- }
- }
- }
- QString t1 = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html>\n<head>\n ";
- r = t1+"<title>"+windowTitle()+"</title>\n"+
- " <meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n</head>\n\n"+
- "<body>\n"+r+"\n</body>\n</html>";
- return r;
-};
-
-QString BibleWindow::toTxt(ExportDialog::Export e){
- int b1=1, b2=bookCount();
- QString r = "";
- if (e!=ExportDialog::Bible){ b1=book(); b2=b1; }
- if (!b1) return r;
- r = windowTitle()+"\n\n";
- for(int b=b1; b<=b2; b++){
- r += longTitles.value(b-1)+"\n\n";
- int c1=1, c2=bible_Structure->value(b-1)->size()-1;
- if (e==ExportDialog::Chapter){ c1=chapter(); c2=c1; }
- for(int c=c1; c<=c2; c++){
- r += wordChapter(b)+" "+QString::number(c)+"\n\n";
- int i = referenceToIndex(b,c,1,bible_Structure);
- int vc = bible_Structure->value(b-1)->value(c);
- QStringList *tx = verseTexts( i, vc );
- for(int v=0; v<vc; v++){
- r += QString::number(v+1)+". "+tx->at(v)+"\n";
- }
- }
- }
- return r;
-};
-
-void BibleWindow::about(MyProcess *p){
- QFile af( dir+"about.html" );
- if (!af.exists()){
- showMessage( tr("There is no information about this Bible Version.") );
- return;
- }
- p->browse( QFileInfo(af).absoluteFilePath() );
-};
-
-ConcordanceModel *BibleWindow::concordance(){
- setFileNOpened(false);
- return concordance_;
-};
-
-int BibleWindow::readPos(){
- int r = read_pos.value(bibleVersion());
- if (!r) return 1;
- else return r;
-};
-
-void BibleWindow::setReadPos(){
- if (verseIndex()==readPos()+1) read_pos[bibleVersion()] = verseIndex();
-};
-
-QString BibleWindow::language(){
- return versionLanguage(bibleVersion());
-};
-
-QString BibleWindow::bibleVersion(){
- return bible_Version;
-};
-
-QString BibleWindow::bibleDir(){
-// return QFileInfo(dir).absolutePath();
- return dir;
-};
-
-void BibleWindow::setReference(int b, int c, int v){
- bk = global_book.value(b+1);
- if (c<0) ch = 1; else ch = c+1;
- if (v<0) vr = 1; else vr = v+1;
-};
-
-int BibleWindow::verseIndex(){ //showMessage("verseIndex");
- return referenceToIndex(book(),chapter(),verse(),bible_Structure);
-};
-
-int BibleWindow::verseIndex(const QString &s){
- QStringList l1 = s.split(":");
- static int b0 = 1, c0 = 1; // Номер на книга и глава от последното извикване на функцията
- bool ok; // Ще се използва в toInt(&ok)
- int b,v,c; // Променливи за номера на книга, глава, стих.
- if (l1.size()<2){ // Препратката не съдържа знак :
- v = l1.at(0).toInt(&ok); // Ако е само число, трябва да е номер на стих от книга b0 глава c0
- if (!ok) { showMessage(tr("Can't recognize reference %1").arg(s)); return -1; }
- return referenceToIndex(b0,c0,v,bible_Structure);
- }
- QStringList l2 = l1.at(0).split(" "); // Частта преди : се разделя на части, отделени с интервали.
- QString bn; // Променлива, предназначена за съкратеното име на книгата
- v = l1.at(1).toInt(&ok); // Определяне номера на стиха
- if (!ok) { // Ако номера на стих не е число - съобщение за грешка
- showMessage(tr("Can't recognize verse number in reference %1").arg(s));
- return -1;
- }
- switch (l2.size()){ //
- case 1: // Този случай означава, че първата част е само номер на глава или само име на книга.
- bn = l2.at(0).trimmed();
- c = bn.toInt(&ok);
- if (ok){ // Ако е номер на глава, се използва последно определения номер на книга b0.
- c0 = c;
- return referenceToIndex(b0,c,v,bible_Structure);
- }
- b = book_index.value(bn);
- if (!b){ // Ако не е име на книга - съобщение за грешка
- showMessage(tr("Can't recognize book in reference %1").arg(s)); return -1;
- }
- showMessage( tr("The case of reference like %1 is not programed.").arg(s) ); return -1;
- break;
- case 2: // Към този случай се отнасят книгите с една дума в съкратеното си заглавие
- bn = l2.at(0).trimmed();
- b = book_index.value(bn);
- c = l2.at(1).toInt(&ok);
- if (!b || !ok) {
- showMessage(tr("Can't recognize reference %1").arg(s)); return -1;
- }
- break;
- case 3: // Към този случай се отнасят книгите, на които съкратеното заглавие се състои от две части
- bn = l2.at(0).trimmed()+" "+l2.at(1).trimmed();
- b = book_index.value(bn);
- c = l2.at(2).toInt(&ok);
- if (!b || !ok) {
- showMessage(tr("Can't recognize reference %1").arg(s)); return -1;
- }
- break;
- case 4: // Към този случай се отнасят книгите, на които съкратеното заглавие се състои от три части
- bn = l2.at(0).trimmed()+" "+l2.at(1).trimmed()+" "+l2.at(2).trimmed();
- b = book_index.value(bn);
- c = l2.at(3).toInt(&ok);
- if (!b || !ok) {
- showMessage(tr("Can't recognize reference %1").arg(s)); return -1;
- }
- break;
- default:
- showMessage(tr("Can't recognize reference %1").arg(s)); return -1;
- }
- b0 = b, c0 = c;
- return referenceToIndex(b,c,v,bible_Structure);
-};
-
-void BibleWindow::setVerseByIndex(int i){
- int b,c,v;
- indexToRefrence(i,&b,&c,&v,bible_Structure);
- setReference(b-1,c-1,v-1);
-};
-
-void BibleWindow::globalIndexToLocal(){
- indexToRefrence(globalVerseIndex(), &bk, &gch, &gvr, globalStructure() );
-// showMessage("Global: "+bibleVersion()+" :: " + QString::number(bk)+":"+QString::number(gch)+":"+QString::number(gvr));
- globalToLocal();
-// showMessage("Local: "+bibleVersion()+" :: " + QString::number(bk)+":"+QString::number(ch)+":"+QString::number(vr));
-};
-
-int BibleWindow::localToGlobalIndex(){
- localToGlobal(); //showMessage("localToGlobalIndex");
- return referenceToIndex(bk, gch, gvr, globalStructure() );
-};
-
-int BibleWindow::book(){
- return local_book.value(bk);
-};
-
-int BibleWindow::book(int b){
- return local_book.value(b);
-};
-
-int BibleWindow::globalBook(){
- return bk;
-};
-
-int BibleWindow::globalBook(int b){
- return global_book.value(b);
-};
-
-int BibleWindow::chapter(){
- return ch;
-};
-
-int BibleWindow::verse(){
- return vr;
-};
-
-int BibleWindow::bookCount(){
- return bible_Structure->size();
-};
-
-int BibleWindow::chapterCount(){
- if (!book()) return 0;
- return bible_Structure->value(book()-1)->size()-1;
-};
-
-int BibleWindow::chapterCount(int b){
- if (!b) return 0;
- return bible_Structure->value(b-1)->size()-1;
-};
-
-int BibleWindow::verseCount(){
- if (!book()) return 0;
- return bible_Structure->value(book()-1)->value(chapter());
-};
-
-int BibleWindow::verseCount(int c){
- if (!book()) return 0;
- return bible_Structure->value(book()-1)->value(c);
-};
-
-int BibleWindow::verseCount(int b, int c){
- if (!b) return 0;
- return bible_Structure->value(b-1)->value(c);
-};
-
-int BibleWindow::verseTotalCount(){
- static int tc = 0;
- if (!tc)
- for(int b=0; b<bookCount(); b++){
- for(int c=0; c<chapterCount(b+1); c++)
- tc += verseCount(b+1,c+1);
- }
- return tc;
-};
-
-QString BibleWindow::reference(bool abr){
- QString r = tr("No such book in this version.");
- if (book()==0) return r;
- if (!abr) r = shortTitles.at(book()-1);
- else r = abrevs.at(book()-1);
- r = r + " " + QString::number(chapter())+":"+QString::number(verse());
- return r;
-};
-
-QString BibleWindow::reference(int i, bool abr){
- int b = book(), c=chapter(), v=verse();
- indexToRefrence(i,&b,&c,&v,bible_Structure);
- if ( (c>chapterCount(b)) || (v>verseCount(b,c)) ) return tr("Error");
- else {
- QString r = "";
- if (!abr) r = shortTitles.at(b-1);
- else r = abrevs.at(b-1);
- return r+" "+QString::number(c)+":"+QString::number(v);
- }
-};
-
-void BibleWindow::onGlobalIndexChanged(BibleWindow *bw){
- if (!synchronize) return;
- if (bw!=this) globalIndexToLocal();
- displayText();
-};
-
-void BibleWindow::scrollToActiveVerse(){
- int p = document()->findBlockByNumber( verse() ).position();
- if (!p) return;
- QTextCursor tc = textCursor();
- tc.setPosition(p);
- setTextCursor(tc);
- tc.movePosition(QTextCursor::EndOfBlock,QTextCursor::MoveAnchor);
- setTextCursor(tc);
-};
-
-void BibleWindow::refreshText(){
- displayFreshText();
- setVerseColor(vr,preferedColor()->bibleTextColor().name(), preferedColor()->activeVerseColor().name());
- scrollToActiveVerse();
-};
-
-void BibleWindow::closeEvent(QCloseEvent *event){
- writeSettings();
- emit closing(this);
-};
-
-//------------------------------------------------------
-
-int global_Verse_index = 1;
-QHash<QString, QString> version_Caption, version_Codec, version_Language;
-BibleStructure *global_structure;
-
-QString versionCaption(const QString &bv){
- return version_Caption[bv];
-};
-
-QByteArray versionCodec(const QString &bv){
- return version_Codec[bv].toAscii();
-};
-
-QString versionLanguage(const QString &bv){
- return version_Language[bv];
-};
-
-void setVersionAttributes(const QString &bv, const QString &bc, const QString &vc, const QString &vl){
- version_Caption[bv] = bc;
- version_Codec[bv] = vc;
- version_Language[bv] = vl;
-};
-
-void readGlobalStructure(){
- global_structure = readStructure("data/bibles/Bible_Structure.txt");
-};
-
-BibleStructure *readStructure(const QString &fn){
- QString fc = fileContent(fn);
- QStringList fl = fc.split("\n");
- BibleStructure *r = new BibleStructure;
- r->verseCount = 0;
- for(int i=0; i<fl.size(); i++){
- if (!fl.at(i).size()) break;
- QStringList l1 = fl.at(i).trimmed().split(" ");
- QList<int> *n = new QList<int>;
- int vc = 0;
- for(int j=1; j<l1.size(); j++){
- int k = l1.at(j).toInt();
- vc += k;
- n->append(k);
- }
- n->insert(0,vc);
- r->verseCount += vc;
- r->append(n);
- }
- return r;
-};
-
-BibleStructure *globalStructure(){
- return global_structure;
-};
-
-int globalVerseIndex(){
- return global_Verse_index;
-};
-
-void setGlobalVerseIndex(int i){
- global_Verse_index = i;
-};
-
-void indexToRefrence(int index, int *bk, int *ch, int *vr, const BibleStructure *bs){
- int b=1, c=1, vc = bs->value(0)->value(0);
- while((b<bs->size()) && (index>vc)){
- index -= vc; b++;
- QList<int> *il = bs->value(b-1);
- if (il) vc = il->value(0);
- }
- vc = bs->value(b-1)->value(c);
- while((c<bs->value(b-1)->size()) && (index>vc)){
- index -= vc;
- c++;
- vc = bs->value(b-1)->value(c);
- }
- *bk = b; *ch = c; *vr = index;
-};
-
-int referenceToIndex(int bk, int ch, int vr, const BibleStructure *bs){
- int r = 0;
- if (!bk) return 0;
-// showMessage(QString::number(bk)+" "+QString::number(ch)+" "+QString::number(vr)+" ");
-// if (bk<1) bk=1;
- for(int i=0; i<bk-1; i++) r += bs->value(i)->value(0);
- for(int i=1; i<ch; i++) r += bs->value(bk-1)->value(i);
- return r+vr;
-};
-
-int pointer(int i, const QString &fn){
- QFile file(fn);
- if (!file.open(QFile::ReadOnly)) return -1;
- QDataStream ds(&file);
- ds.setByteOrder(QDataStream::LittleEndian);
- file.seek(i*4);
- qint32 r;
- ds >> r;
- file.close();
- return r;
-};
-
-int pointer2(int i, const QString &fn){
- QFile file(fn);
- if (!file.open(QFile::ReadOnly)) return -1;
- QDataStream ds(&file);
- ds.setByteOrder(QDataStream::LittleEndian);
- file.seek(i*2);
- quint16 r;
- ds >> r;
- file.close();
- return r;
-};
-
-QString textFragment(int p, const QString &fn, const QByteArray &cd){
- QFile file(fn);
- if (!file.open(QFile::ReadOnly)) return "";
- QDataStream ds(&file);
- ds.setByteOrder(QDataStream::LittleEndian);
- file.seek(p);
- quint16 r;
- ds >> r;
- char b[r+1];
- ds.readRawData(b,r); b[r]=0;
- file.close();
- QTextCodec *tc = QTextCodec::codecForName(cd);
- QTextCodec::setCodecForCStrings(tc);
- QString rt(b);
- return rt;
-};
-
-QStringList *textFragments(int p, int c, const QString &fn, const QByteArray &cd){
- QFile file(fn);
- if (!file.open(QFile::ReadOnly)) return 0;
- QStringList *sl = new QStringList();
- QDataStream ds(&file);
- ds.setByteOrder(QDataStream::LittleEndian);
- QTextCodec *tc = QTextCodec::codecForName(cd);
- QTextCodec::setCodecForCStrings(tc);
- file.seek(p);
- do{
- quint16 r;
- ds >> r;
- char b[r+1];
- ds.readRawData(b,r); b[r]=0;
- QString rt(b);
- if (rt.size()==0) showMessage("Null string");
- sl->append(rt);
- c--;
- } while(c>0);
- file.close();
- return sl;
-};
-
-void setDownloadWidgets(QProgressBar *pb, QPushButton *cb){
- downloadProgressBar = pb;
- dounloadCancelButton = cb;
-};
-
-QString download_site = "physics-bg.org";
-
-void setDownloadSite(const QString &ds){
- download_site = ds;
-};
-
-QString downloadSite(){
- return download_site;
-}
-
-QString default_Css = "";
-
-void setDefaultCss(const QString &ds){
- default_Css = ds;
-};
-
-QString defaultCss(){
- return default_Css;
-};
-
-QList<int> *indexArray(int i, const QString &fn){
- QList<int> *r = new QList<int>;
- if (i<0) return r;
- QFile file(fn);
- if (!file.open(QFile::ReadOnly)) return r;
- QDataStream ds(&file);
- ds.setByteOrder(QDataStream::LittleEndian);
- quint16 a;
- file.seek(i*2);
- ds >> a;
- while (a>0){
- quint16 b;
- ds >> b;
- r->append(b);
- a--;
- }
- file.close();
- return r;
-};
-
-QString biblePath(){
- return bible_Path;
-};
-
-void setBiblePath(const QString &s){
- bible_Path = s;
-};
-
-QStringList getReadPositions(){
- QStringList k = read_pos.keys();
- QStringList r;
- for(int i=0; i<k.size(); i++) r << k.at(i) + "=" + QString::number( read_pos.value(k.at(i)) );
- return r;
-};
-
-void setReadPositions(const QStringList &bl){
- for(int i=0; i<bl.size(); i++){
- QStringList l = bl.at(i).split("=");
- read_pos[l.at(0)] = l.at(1).toInt();
- }
-};
+/*
+CD Bible 5 - open source biblical program
+Copyright (C) 2008 Vanyo Georgiev <info@...>
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#include "bibleWindow.h"
+#include "showMessage.h"
+#include "myFileRoutines.h"
+#include "language.h"
+#include "fileDownloader.h"
+#include "preferences.h"
+#include "process.h"
+#include "concordance.h"
+
+#include <QHash>
+#include <QFileInfo>
+#include <QApplication>
+#include <QTextCodec>
+#include <QProgressBar>
+#include <QPushButton>
+#include <QTextBlock>
+#include <QTextDocumentFragment>
+#include <QTextStream>
+
+QProgressBar *downloadProgressBar = 0;
+QPushButton *dounloadCancelButton = 0;
+QString bible_Path = "data/bibles/";
+QHash<QString, int> read_pos;
+//QHash<QString, ConcordanceModel*> concordanceHash;
+
+//------------------VerseCorrection---------------------
+
+VerseCorrection::VerseCorrection(const QStringList &cl){
+ bk = cl.at(0).toInt();
+ ch0 = cl.at(1).toInt();
+ vr0 = cl.at(2).toInt();
+ ch1 = cl.at(3).toInt();
+ vr1 = cl.at(4).toInt();
+};
+
+//-------------------BibleWindow------------------
+
+BibleWindow::BibleWindow(const QString &bv, QWidget *parent)
+ :QTextBrowser(parent)
+{
+ setAttribute(Qt::WA_DeleteOnClose);
+ bible_Version = bv;
+ zipFile = bv+".zip";
+ setOpenLinks(false);
+#ifdef Q_WS_WIN
+ dir = bible_Path+bv+"\\";
+#else
+ dir = bible_Path+bv+"/";
+#endif
+ zipFile = dir+zipFile;
+#ifdef Q_WS_MAC
+ QString sf = "style.css";
+#else
+ QString sf = "style-w.css";
+#endif
+ if (QFileInfo(dir+sf).exists()) css = fileContent(dir+sf);
+ else css = defaultCss();
+ process = 0;
+ setWindowTitle( versionCaption(bv) );
+ bkl=0; chl=0; vrl=0; fileDownloader=0;
+ synchronize = true;
+ wordsChanged = false;
+ if (!readTitles()){
+ downloadBible(bv);
+ return;
+ };
+ bible_Structure = readStructure(dir+"BibleStructure.csv");
+ readCorrection();
+ concordance_ = new ConcordanceModel(dir, versionCodec(bv), this);
+/* concordance_ = concordanceHash.value(bible_Version);
+ if (!concordance_){
+ concordance_ = new ConcordanceModel(dir, versionCodec(bv), this);
+ concordanceHash[bible_Version] = concordance_;
+ }*/
+};
+
+bool BibleWindow::readTitles(){
+ QString fn = dir+"BibleTitles.txt";
+ QString fnu = dir+"BibleTitles-u.txt";
+ if (!QFileInfo(fn).exists()) return false;
+ QString fc="";
+ if (QFileInfo(fnu).exists()) fc = fileContent(fnu, "UTF-8" );
+ else fc = fileContent(fn, versionCodec(bibleVersion()) );
+ if (!fc.size()) return false;
+ QStringList fl = fc.split("\n");
+ if (!fl.size()) return false;
+ QStringList l0 = fl.at(0).split(" ");
+ book_count = l0.at(0).toInt();
+ if (!book_count) return false;
+ for(int i=1; i<=book_count; i++){
+ int j = l0.at(i).toInt();
+ global_book.insert( i, j );
+ local_book.insert( j, i );
+ longTitles << fl.at(i);
+ shortTitles << fl.at(i+book_count);
+ QString a = fl.at(i+2*book_count);
+ abrevs << a;
+ book_index[a] = i;
+ }
+ return true;
+};
+
+void BibleWindow::readCorrection(){
+ QString fn = dir+"_Diff_.txt";
+ if ( !QFileInfo(fn).exists() ) return;
+ QString fc = fileContent(fn);
+ QStringList fl = fc.split("\n");
+ for(int i=0; i<fl.size(); i++){
+ QStringList cl = fl.at(i).trimmed().split(" ");
+ if (cl.size()==5){
+ VerseCorrection *vcLG = new VerseCorrection(cl), *vcGL = new VerseCorrection(cl);
+ vcGL->ch0 = vcGL->ch0 + vcGL->ch1;
+ vcGL->vr0 = vcGL->vr0 + vcGL->vr1;
+ correctionLG.append(vcLG);
+ correctionGL.append(vcGL);
+ }
+ }
+};
+
+void BibleWindow::downloadBible(const QString &bv){
+ if (yesNo( tr("Would you like to download Bible %1?").arg(windowTitle()) )!=YES) return;
+ if (!fileDownloader){
+ fileDownloader = new FileDownloader( this, downloadProgressBar, dounloadCancelButton);
+ connect(fileDownloader, SIGNAL(done(bool)), this, SLOT(onDownloadDone(bool)));
+ }
+ QString of = "http://"+downloadSite()+"/bible/v5/"+QFileInfo(zipFile).fileName();
+// showMessage(zipFile);// return;
+ fileDownloader->downloadFile(of,zipFile);
+};
+
+void BibleWindow::writeSettings(){
+ concordance()->writeSettings();
+};
+
+void BibleWindow::readSettings(){
+
+};
+
+void BibleWindow::createLinksBin(){
+ QString fln = dir+"Links.txt";
+ QFile lf(fln);
+ if (!lf.exists()) {
+ showMessage(tr("File do not exist\n%1").arg(fln));
+ return;
+ }
+ QString idfn = dir+"Links.bin"; // Двоични файлове, в които се записват препратките
+ QString ipfn = dir+"LinksP.bin";
+ QFile idf(idfn);
+ QFile ipf(ipfn);
+ if (!idf.open(QFile::WriteOnly)){
+ showMessage(tr("Can't open file for write\n%1").arg(idfn));
+ return;
+ }
+ if (!ipf.open(QFile::WriteOnly)){
+ showMessage(tr("Can't open file for write\n%1").arg(ipfn));
+ return;
+ }
+ QDataStream ds(&idf);
+ QDataStream ps(&ipf);
+ ds.setByteOrder(QDataStream::LittleEndian);
+ ps.setByteOrder(QDataStream::LittleEndian);
+ int vi0 = 1; // Локален индекс на последния стих, за който са записани препратки
+ qint32 m1 = -1; // Константа -1, която се записва вместо указател за стиховете, от които няма препратки
+ QString flc = fileContent(fln); // Чете се файла с описание на препратките
+ QStringList lns = flc.split("\n"); // Разделя се на списък от редове
+ for (int i=0; i<lns.size(); i++){ // Обработва се всеки ред
+ QString ln = lns.at(i).trimmed(); // Това е i-ия ред
+ if (!ln.size()) continue;
+ QStringList lks = ln.split(QString(9)); // Реда се разделя на две части от табулатор
+ if (lks.size()<2){ // Ако няма табулатор реда се прескача
+ showMessage( tr("There is no Tab symbol in this line:\n%1").arg(ln) );
+ continue;
+ }
+ QString ln1 = lks.at(0).trimmed(); // Частта пред табулатора означава за кой стих се отнасят препратките
+ int vi = verseIndex(ln1); // Локален индекс на стиха, за който се отнасят препратките
+ for(int j=vi0+1; j<vi; j++){ // Записва -1 вместо указатели, за стиховете до тук, от които няма препратки
+ ps << m1;
+ }
+ vi0 = vi;
+ qint32 p = idf.pos()/2; ps << p; // Записва указател в LinksP.bin
+ if (vi*4!=ipf.pos()){ showMessage(ln); break; }
+ QStringList ls = lks.at(1).trimmed().split(","); // Останалата част от реда съдържа препратки, разделени със запетая
+ QList<quint16> ll; // Списък с локални индекси на стихове, към които има препратки от стих vi
+ for (int j=0; j<ls.size(); j++){ // Обработва се всяка препратка.
+ QString lk = ls.at(j).trimmed(); // Поредната препратка
+ QStringList vs = lk.split("-"); // Препратката се разделя на две части от тире.
+ QString vs1 = vs.at(0).trimmed();// Първата част
+ if (!vs1.size()){ // Ако първата част е празна
+ showMessage(lks.at(1));
+ continue;
+ }
+ int li = verseIndex(vs1); // Локален индекст на стиха, към който сочи първата част на препратката
+ if (li<0) showMessage(ln);
+ ll << li;
+ if (vs.size()>1){ // Ако е имало тире, се добавят и всички стихове до посочения след тирето
+ bool ok;
+ int v2 = vs.at(1).trimmed().toInt(&ok); // Номер на стиха след тирето
+ if (!ok) showMessage( tr("Can't recognize verse number in reference %1").arg(lk) );
+ else for(int v = li+1; v <= v2; v++) ll << v;
+ }
+ }
+ quint16 sz = ll.size(); // Записва препратките в Links.bin
+ ds << sz;
+ for(int j=0; j<sz; j++) ds << ll.at(j);
+ }
+ showMessage(reference(vi0));
+ for(int i=vi0+1; i<verseTotalCount()+1; i++) ps << m1; // Допълва файла с указатели до последния стих на Библията
+ idf.close(); ipf.close();
+ showMessage(tr("Link file was created."));
+};
+
+void BibleWindow::import(const QString &fn){
+ showMessage(tr("This feature is not finished yet. See the source code.")); return;
+ QStringList fc = fileContent(fn).split("\n");
+ int i = 0;
+ for(int b=1; b<=bookCount(); b++){
+ // Чете заглавието на книгата bt
+ QString bt = fc.at(i); i++;
+ bt = bt + " " + fc.at(i); i++;
+ if (bt!=longTitles.at(b-1)){ // Ако заглавието не е коректно обработката се прекратява
+ showMessage(tr("Incorrect Book title.<br>%1").arg(bt));
+ return;
+ }
+ for(int c=1; c<chapterCount(b); c++){ // Четене на главите
+ for(int v=1; v<=verseCount(b,c); v++){ // Четене на стиховете
+ QString vn = QString::number(v)+" "; // Номер на стиха
+ QString vt = fc.at(i); i++; // Текст на стиха
+ if (!vt.startsWith(vn)){ // Ако номерът на стиха е некоректен обработката се прекратява
+ showMessage(tr("Incorrect verse number in line %1").arg(vt));
+ return;
+ }
+ vt = vt.right(vt.size()-vn.size()); // Премахва се номера от пред текста на стиха
+
+ // Проверява се дали има бележка под линия към стиха
+ int p = vt.indexOf("*");
+ if (p>-1) { // Изпълнява се ако има бележка под линия
+ QString ft = fc.at(i); i++; // Чете се следващия ред, който е бележка под линия
+ ft = ft.right(ft.size()-1); // Премахва се първия символ *
+ vt.replace("*"," {"+ft+"}"); // Вмъква се бележката под линия
+ }
+
+ // Проверява се дали има препратки към стиха
+ int j=1; // Номер на поредната група препратки
+ QString ln = "(" + QString::number(j) + ") ";
+ if (fc.at(i).startsWith(ln)){
+ int p1 = 0;
+ QString lt = fc.at(i); i++; // Чете се следващия ред, съдържащ препратки
+ while (lt.startsWith(ln)){
+ lt = lt.right(lt.size()-ln.size()); // Изтрива се номера на групата препратки
+ p1 = vt.indexOf(QString::number(j),p1); // Позиция на мястото на групата препратки
+ j++; ln = "(" + QString::number(j) + ") "; // Номер на следващата група препратки
+ p = lt.indexOf(ln); // Позиция на номера на следващата група препратки
+ QString lt1 = lt.left(p); // Отделя се поредната група препратки
+ lt = lt.right(lt.size()-lt1.size()); // Премахва се отелената група препратки
+ vt.insert(p1," {"+lt1+"}"); // Вмъква се групата препратки в текста на стиха
+ p1 += lt1.size()+3;
+ }
+ }
+// showMessage(vt);
+
+ }
+ }
+ }
+};
+
+void BibleWindow::onDownloadDone(bool e){
+ if (e || fileDownloader->notDone){
+ showMessage("download error");
+ return;
+ }
+ QStringList a;
+ a << "-o" << QFileInfo(zipFile).absoluteFilePath();
+// showMessage(a.join("\n"));
+ if (!process){
+ process = new QProcess(this);
+ connect(process, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(onUnzipFinished(int,QProcess::ExitStatus)));
+ }
+ process->setWorkingDirectory(QFileInfo(zipFile).absolutePath());
+ process->start("unzip",a);
+};
+
+void BibleWindow::onUnzipFinished( int exitCode, QProcess::ExitStatus exitStatus ){
+ showMessage( tr("Downloaging is finished. Now you can open the Bible %1.").arg(windowTitle()) );
+ QFile( QFileInfo(zipFile).absoluteFilePath() ).remove();
+};
+
+void BibleWindow::globalToLocal(){
+ ch = gch; vr = gvr;
+ if (!correctionGL.size()) return;
+ int i = 0;
+ while( (i<correctionGL.size()) && (correctionGL.at(i)->bk < bk) ) i++;
+ while( (i<correctionGL.size()) && (correctionGL.at(i)->bk == bk) ){
+ if ( (correctionGL.at(i)->ch0 == gch) && (correctionGL.at(i)->vr0 <= gvr) ){
+ ch = gch - correctionGL.at(i)->ch1;
+// showMessage(bibleVersion()+" :: " + QString::number(correctionGL.at(i)->ch1)+" "+QString::number(correctionGL.at(i)->vr1));
+ vr = gvr - correctionGL.at(i)->vr1;
+ }
+ i++;
+ }
+};
+
+void BibleWindow::localToGlobal(){
+ gch = ch; gvr = vr;
+ if (!correctionLG.size()) return;
+ int i = 0;
+ while( (i<correctionLG.size()) && (correctionLG.at(i)->bk < bk) ) i++;
+ while( (i<correctionLG.size()) && (correctionLG.at(i)->bk == bk) ){
+ if ( (correctionLG.at(i)->ch0 == ch) && (correctionLG.at(i)->vr0 <= vr) ){
+ gch = ch + correctionLG.at(i)->ch1;
+ gvr = vr + correctionLG.at(i)->vr1;
+ }
+ i++;
+ }
+};
+
+QString BibleWindow::verseText(int i){
+ int p = pointer(i-1, dir+"CompactPoint.bin");
+ if (p<0) return "";
+ return textFragment(p, dir+"CompactText.bin", versionCodec(bibleVersion()) );
+};
+
+QString between(const QString &s, const QString &e, const QString &st){
+ int p1 = st.indexOf(s)+s.size(); if (p1<0) p1 = 0;
+ int p2 = st.indexOf(e,p1); if (p2<p1) p2 = st.size()-1;
+ return st.mid(p1,p2-p1);
+}
+
+void BibleWindow::setVerseColor(int vr, const QString &c1, const QString &c2){
+ QTextBlock tb = document()->findBlockByNumber( vr );
+ QFont font = tb.charFormat().font();
+ setFont(font);
+ int p = tb.position();
+ if (!p) return;
+ QTextCursor tc = textCursor();
+ bool up = p>tc.position();
+ tc.setPosition(p);
+ tc.movePosition(QTextCursor::EndOfBlock,QTextCursor::KeepAnchor);
+ QString h = tc.selection().toHtml();
+ h = between("<!--StartFragment-->","<!--EndFragment-->",h);
+ h = h.replace("color:"+c1+";","color:"+c2+";");
+ h.replace("text-decoration: underline","text-decoration: none");
+ QString nt = "<font color=\""+c2+"\">"+h+"</font>";
+ tc.insertHtml(nt);
+ if (up) setTextCursor(tc);
+ tc.movePosition(QTextCursor::StartOfBlock,QTextCursor::MoveAnchor);
+ setTextCursor(tc);
+};
+
+QStringList *BibleWindow::verseTexts(int i, int c){
+ int p = pointer(i-1, dir+"CompactPoint.bin");
+ if (p<0) return 0;
+ return textFragments(p, c, dir+"CompactText.bin", versionCodec(bibleVersion()) );
+};
+
+QString BibleWindow::wordChapter(){
+ return wordChapter(book());
+};
+
+QString BibleWindow::addTags(const QString &s0){
+ int i; int j1 = 0;
+ bool f1 = true, f2 = false;
+ QString s = s0;
+ s.replace("<","<");
+ QString r = "";
+ for(i = 0; i<s.size(); i++){
+ switch (s.at(i).unicode()){
+ case 0x7B: // {
+ if (i>j1) r += s.mid( j1, i-j1-1 );
+ j1 = i+1;
+ f2 = true;
+ break;
+ case 0x7C: // |
+ if (f2) break;
+ r += s.mid( j1, i-j1 );
+ if (f1) r += "<i>"; else r += "</i>";
+ f1 = !f1;
+ j1 = i+1;
+ break;
+ case 0x7D: // }
+ fCount++;
+ QString sn = QString::number(fCount);
+ switch (preferences()->footnotes()){
+ case 0:
+ r += "<strong><sup> <a href=\"#f"+sn+"\">"+sn+"</a></sup></strong>";
+ footnotes += "<a name=\"f"+sn+"\"></a><p class=\"footnote\"><sup>"+sn+"</sup> " +
+ addTags(s.mid( j1, i-j1 ))+"</p>";
+ break;
+ case 1:
+ r += " <font color=\""+preferedColor()->footnoteColor().name()+"\">{"+addTags(s.mid( j1, i-j1 ))+"}</font> ";
+ break;
+ };
+ j1 = i+2;
+ f2 = false;
+ break;
+ }
+ }
+ r += s.mid(j1,i-j1);
+ r = concordance_->colorWords(r);
+ return r;
+};
+
+QString BibleWindow::addLinks(int i, int v){
+ QString r = ""; QString lnk = "";
+ if (QFileInfo(dir+"LinksP.bin").exists()){
+ int p = pointer(i-1,dir+"LinksP.bin");
+ if (p>=0){//showMessage(p);
+ QString ln = QString::number(p);
+ switch (preferences()->references()){
+ case 0: // Препратките се поставят в края на главата
+ r = " <a href=\"#"+ln+"\"><sup><strong>"+QChar(0x21e8)+"</strong></sup></a>";
+ lnk += "<a name=\""+ln+"\"></a><p class=\"footnote\"><sup>"+QString::number(v)+"</sup> ";
+ break;
+ case 1: // Препратките се поставят в края на стиховете
+ lnk = " <font color=\""+preferedColor()->footnoteColor().name()+"\">{";
+ break;
+ };
+ QList<int> *ia = indexArray(p, dir+"Links.bin");
+ for(int k=0; k<ia->size(); k++){
+ int vi = ia->at(k);
+ QString t = QString::number(vi);
+ lnk += "<a href=\""+t+"\">"+ reference(vi,true)+"</a>";
+ if (k==ia->size()-1) lnk += ".";
+ else lnk += ", ";
+ }
+ switch (preferences()->references()){
+ case 0: lnk += "</p>"; break;
+ case 1: lnk += "}</font>"; break;
+ }
+ }
+ }
+ switch (preferences()->references()){
+ case 0:
+ links += lnk;
+ return r;
+ case 1:
+ return lnk;
+ };
+ return "";
+};
+
+QString BibleWindow::wordChapter(int b){
+ b = global_book.value(b);
+ QString ln = language();
+ if (b==22) return languageObject()->psalm(ln);
+ else return languageObject()->chapter(ln);
+};
+
+void BibleWindow::displayText(){
+ if ((bk!=bkl)||(ch!=chl)||wordsChanged) displayFreshText();
+ if (!verseCount()) return;
+ setVerseColor(vrl, preferedColor()->activeVerseColor().name(), preferedColor()->bibleTextColor().name() );
+ setVerseColor(vr, preferedColor()->bibleTextColor().name(), preferedColor()->activeVerseColor().name());
+ vrl = vr;
+};
+
+void BibleWindow::displayFreshText(){
+ clear();
+ QPalette p = palette();
+ p.setColor(QPalette::Active, QPalette::Base, preferedColor()->baseColor());
+ p.setColor(QPalette::Active, QPalette::Text, preferedColor()->bibleTextColor());
+ p.setColor(QPalette::Active, QPalette::Link, preferedColor()->footnoteColor());
+ setPalette(p);
+ bkl=bk;
+ if (book()==0){
+ setText(reference());
+ return;
+ }
+ chl=ch;
+ int i = referenceToIndex(book(), chapter(), 1, bible_Structure);
+ links = ""; footnotes = ""; fCount = 0;
+ QString tx = "<html><head><style>"+css+"</style>"+
+ "</head><body>\n<h3>"+longTitles.value(book()-1)+"\n"+
+ "<br />"+wordChapter()+" "+QString::number(chapter())+"</h3>\n";
+ for(int j=0; j<verseCount(); j++){
+ QString vtx = verseText(i+j);
+ QString sty = "";
+ if (vtx.at(0)==QChar(182)){
+ vtx = vtx.remove(0,1);
+ sty = " class=\"pstart\"";
+ }
+ if (vtx.size()) tx += "<p"+sty+">"+QString::number(j+1)+". "+ addTags(vtx) + addLinks(i+j,j+1)+"</p>";
+ else tx += "<p> </p>";
+ }
+ if (links.size()) links = "<hr width=\"50%\">"+links;
+ if (footnotes.size()) footnotes = "<hr>"+footnotes;
+ setHtml(tx+footnotes+links+"</body></html>");
+ wordsChanged=false;
+};
+
+QString BibleWindow::toHtml(ExportDialog::Export e){
+ int b1=1, b2=bookCount();
+ QString r = "";
+ if (e!=ExportDialog::Bible){ b1=book(); b2=b1; }
+ if (!b1) return r;
+ r = "<h1>"+windowTitle()+"</h1>\n\n";
+ for(int b=b1; b<=b2; b++){
+ r += "<h2>"+longTitles.value(b-1)+"</h2>\n\n";
+ int c1=1, c2=bible_Structure->value(b-1)->size()-1;
+ if (e==ExportDialog::Chapter){ c1=chapter(); c2=c1; }
+ for(int c=c1; c<=c2; c++){
+ r += "<h3>"+wordChapter(b)+" "+QString::number(c)+"</h3>\n\n";
+ int i = referenceToIndex(b,c,1,bible_Structure);
+ int vc = bible_Structure->value(b-1)->value(c);
+ QStringList *tx = verseTexts( i, vc );
+ for(int v=0; v<vc; v++){
+ r += "<p>"+QString::number(v+1)+". "+addTags( tx->at(v) )+"</p>\n";
+ }
+ }
+ }
+ QString t1 = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html>\n<head>\n ";
+ r = t1+"<title>"+windowTitle()+"</title>\n"+
+ " <meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n</head>\n\n"+
+ "<body>\n"+r+"\n</body>\n</html>";
+ return r;
+};
+
+QString BibleWindow::toTxt(ExportDialog::Export e){
+ int b1=1, b2=bookCount();
+ QString r = "";
+ if (e!=ExportDialog::Bible){ b1=book(); b2=b1; }
+ if (!b1) return r;
+ r = windowTitle()+"\n\n";
+ for(int b=b1; b<=b2; b++){
+ r += longTitles.value(b-1)+"\n\n";
+ int c1=1, c2=bible_Structure->value(b-1)->size()-1;
+ if (e==ExportDialog::Chapter){ c1=chapter(); c2=c1; }
+ for(int c=c1; c<=c2; c++){
+ r += wordChapter(b)+" "+QString::number(c)+"\n\n";
+ int i = referenceToIndex(b,c,1,bible_Structure);
+ int vc = bible_Structure->value(b-1)->value(c);
+ QStringList *tx = verseTexts( i, vc );
+ for(int v=0; v<vc; v++){
+ r += QString::number(v+1)+". "+tx->at(v)+"\n";
+ }
+ }
+ }
+ return r;
+};
+
+void BibleWindow::about(MyProcess *p){
+ QFile af( dir+"about.html" );
+ if (!af.exists()){
+ showMessage( tr("There is no information about this Bible Version.") );
+ return;
+ }
+ p->browse( QFileInfo(af).absoluteFilePath() );
+};
+
+ConcordanceModel *BibleWindow::concordance(){
+ setFileNOpened(false);
+ return concordance_;
+};
+
+int BibleWindow::readPos(){
+ int r = read_pos.value(bibleVersion());
+ if (!r) return 1;
+ else return r;
+};
+
+void BibleWindow::setReadPos(){
+ if (verseIndex()==readPos()+1) read_pos[bibleVersion()] = verseIndex();
+};
+
+QString BibleWindow::language(){
+ return versionLanguage(bibleVersion());
+};
+
+QString BibleWindow::bibleVersion(){
+ return bible_Version;
+};
+
+QString BibleWindow::bibleDir(){
+// return QFileInfo(dir).absolutePath();
+ return dir;
+};
+
+void BibleWindow::setReference(int b, int c, int v){
+ bk = global_book.value(b+1);
+ if (c<0) ch = 1; else ch = c+1;
+ if (v<0) vr = 1; else vr = v+1;
+};
+
+int BibleWindow::verseIndex(){ //showMessage("verseIndex");
+ return referenceToIndex(book(),chapter(),verse(),bible_Structure);
+};
+
+int BibleWindow::verseIndex(const QString &s){
+ QStringList l1 = s.split(":");
+ static int b0 = 1, c0 = 1; // Номер на книга и глава от последното извикване на функцията
+ bool ok; // Ще се използва в toInt(&ok)
+ int b,v,c; // Променливи за номера на книга, глава, стих.
+ if (l1.size()<2){ // Препратката не съдържа знак :
+ v = l1.at(0).toInt(&ok); // Ако е само число, трябва да е номер на стих от книга b0 глава c0
+ if (!ok) { showMessage(tr("Can't recognize reference %1").arg(s)); return -1; }
+ return referenceToIndex(b0,c0,v,bible_Structure);
+ }
+ QStringList l2 = l1.at(0).split(" "); // Частта преди : се разделя на части, отделени с интервали.
+ QString bn; // Променлива, предназначена за съкратеното име на книгата
+ v = l1.at(1).toInt(&ok); // Определяне номера на стиха
+ if (!ok) { // Ако номера на стих не е число - съобщение за грешка
+ showMessage(tr("Can't recognize verse number in reference %1").arg(s));
+ return -1;
+ }
+ switch (l2.size()){ //
+ case 1: // Този случай означава, че първата част е само номер на глава или само име на книга.
+ bn = l2.at(0).trimmed();
+ c = bn.toInt(&ok);
+ if (ok){ // Ако е номер на глава, се използва последно определения номер на книга b0.
+ c0 = c;
+ return referenceToIndex(b0,c,v,bible_Structure);
+ }
+ b = book_index.value(bn);
+ if (!b){ // Ако не е име на книга - съобщение за грешка
+ showMessage(tr("Can't recognize book in reference %1").arg(s)); return -1;
+ }
+ showMessage( tr("The case of reference like %1 is not programed.").arg(s) ); return -1;
+ break;
+ case 2: // Към този случай се отнасят книгите с една дума в съкратеното си заглавие
+ bn = l2.at(0).trimmed();
+ b = book_index.value(bn);
+ c = l2.at(1).toInt(&ok);
+ if (!b || !ok) {
+ showMessage(tr("Can't recognize reference %1").arg(s)); return -1;
+ }
+ break;
+ case 3: // Към този случай се отнасят книгите, на които съкратеното заглавие се състои от две части
+ bn = l2.at(0).trimmed()+" "+l2.at(1).trimmed();
+ b = book_index.value(bn);
+ c = l2.at(2).toInt(&ok);
+ if (!b || !ok) {
+ showMessage(tr("Can't recognize reference %1").arg(s)); return -1;
+ }
+ break;
+ case 4: // Към този случай се отнасят книгите, на които съкратеното заглавие се състои от три части
+ bn = l2.at(0).trimmed()+" "+l2.at(1).trimmed()+" "+l2.at(2).trimmed();
+ b = book_index.value(bn);
+ c = l2.at(3).toInt(&ok);
+ if (!b || !ok) {
+ showMessage(tr("Can't recognize reference %1").arg(s)); return -1;
+ }
+ break;
+ default:
+ showMessage(tr("Can't recognize reference %1").arg(s)); return -1;
+ }
+ b0 = b, c0 = c;
+ return referenceToIndex(b,c,v,bible_Structure);
+};
+
+void BibleWindow::setVerseByIndex(int i){
+ int b,c,v;
+ indexToRefrence(i,&b,&c,&v,bible_Structure);
+ setReference(b-1,c-1,v-1);
+};
+
+void BibleWindow::globalIndexToLocal(){
+ indexToRefrence(globalVerseIndex(), &bk, &gch, &gvr, globalStructure() );
+// showMessage("Global: "+bibleVersion()+" :: " + QString::number(bk)+":"+QString::number(gch)+":"+QString::number(gvr));
+ globalToLocal();
+// showMessage("Local: "+bibleVersion()+" :: " + QString::number(bk)+":"+QString::number(ch)+":"+QString::number(vr));
+};
+
+int BibleWindow::localToGlobalIndex(){
+ localToGlobal(); //showMessage("localToGlobalIndex");
+ return referenceToIndex(bk, gch, gvr, globalStructure() );
+};
+
+int BibleWindow::book(){
+ return local_book.value(bk);
+};
+
+int BibleWindow::book(int b){
+ return local_book.value(b);
+};
+
+int BibleWindow::globalBook(){
+ return bk;
+};
+
+int BibleWindow::globalBook(int b){
+ return global_book.value(b);
+};
+
+int BibleWindow::chapter(){
+ return ch;
+};
+
+int BibleWindow::verse(){
+ return vr;
+};
+
+int BibleWindow::bookCount(){
+ return bible_Structure->size();
+};
+
+int BibleWindow::chapterCount(){
+ if (!book()) return 0;
+ return bible_Structure->value(book()-1)->size()-1;
+};
+
+int BibleWindow::chapterCount(int b){
+ if (!b) return 0;
+ return bible_Structure->value(b-1)->size()-1;
+};
+
+int BibleWindow::verseCount(){
+ if (!book()) return 0;
+ return bible_Structure->value(book()-1)->value(chapter());
+};
+
+int BibleWindow::verseCount(int c){
+ if (!book()) return 0;
+ return bible_Structure->value(book()-1)->value(c);
+};
+
+int BibleWindow::verseCount(int b, int c){
+ if (!b) return 0;
+ return bible_Structure->value(b-1)->value(c);
+};
+
+int BibleWindow::verseTotalCount(){
+ static int tc = 0;
+ if (!tc)
+ for(int b=0; b<bookCount(); b++){
+ for(int c=0; c<chapterCount(b+1); c++)
+ tc += verseCount(b+1,c+1);
+ }
+ return tc;
+};
+
+QString BibleWindow::reference(bool abr){
+ QString r = tr("No such book in this version.");
+ if (book()==0) return r;
+ if (!abr) r = shortTitles.at(book()-1);
+ else r = abrevs.at(book()-1);
+ r = r + " " + QString::number(chapter())+":"+QString::number(verse());
+ return r;
+};
+
+QString BibleWindow::reference(int i, bool abr){
+ int b = book(), c=chapter(), v=verse();
+ indexToRefrence(i,&b,&c,&v,bible_Structure);
+ if ( (c>chapterCount(b)) || (v>verseCount(b,c)) ) return tr("Error");
+ else {
+ QString r = "";
+ if (!abr) r = shortTitles.at(b-1);
+ else r = abrevs.at(b-1);
+ return r+" "+QString::number(c)+":"+QString::number(v);
+ }
+};
+
+void BibleWindow::onGlobalIndexChanged(BibleWindow *bw){
+ if (!synchronize) return;
+ if (bw!=this) globalIndexToLocal();
+ displayText();
+};
+
+void BibleWindow::scrollToActiveVerse(){
+ int p = document()->findBlockByNumber( verse() ).position();
+ if (!p) return;
+ QTextCursor tc = textCursor();
+ tc.setPosition(p);
+ setTextCursor(tc);
+ tc.movePosition(QTextCursor::EndOfBlock,QTextCursor::MoveAnchor);
+ setTextCursor(tc);
+};
+
+void BibleWindow::refreshText(){
+ displayFreshText();
+ setVerseColor(vr,preferedColor()->bibleTextColor().name(), preferedColor()->activeVerseColor().name());
+ scrollToActiveVerse();
+};
+
+void BibleWindow::closeEvent(QCloseEvent *event){
+ writeSettings();
+ emit closing(this);
+};
+
+//------------------------------------------------------
+
+int global_Verse_index = 1;
+QHash<QString, QString> version_Caption, version_Codec, version_Language;
+BibleStructure *global_structure;
+
+QString versionCaption(const QString &bv){
+ return version_Caption[bv];
+};
+
+QByteArray versionCodec(const QString &bv){
+ return version_Codec[bv].toAscii();
+};
+
+QString versionLanguage(const QString &bv){
+ return version_Language[bv];
+};
+
+void setVersionAttributes(const QString &bv, const QString &bc, const QString &vc, const QString &vl){
+ version_Caption[bv] = bc;
+ version_Codec[bv] = vc;
+ version_Language[bv] = vl;
+};
+
+void readGlobalStructure(){
+ global_structure = readStructure("data/bibles/Bible_Structure.txt");
+};
+
+BibleStructure *readStructure(const QString &fn){
+ QString fc = fileContent(fn);
+ QStringList fl = fc.split("\n");
+ BibleStructure *r = new BibleStructure;
+ r->verseCount = 0;
+ for(int i=0; i<fl.size(); i++){
+ if (!fl.at(i).size()) break;
+ QStringList l1 = fl.at(i).trimmed().split(" ");
+ QList<int> *n = new QList<int>;
+ int vc = 0;
+ for(int j=1; j<l1.size(); j++){
+ int k = l1.at(j).toInt();
+ vc += k;
+ n->append(k);
+ }
+ n->insert(0,vc);
+ r->verseCount += vc;
+ r->append(n);
+ }
+ return r;
+};
+
+BibleStructure *globalStructure(){
+ return global_structure;
+};
+
+int globalVerseIndex(){
+ return global_Verse_index;
+};
+
+void setGlobalVerseIndex(int i){
+ global_Verse_index = i;
+};
+
+void indexToRefrence(int index, int *bk, int *ch, int *vr, const BibleStructure *bs){
+ int b=1, c=1, vc = bs->value(0)->value(0);
+ while((b<bs->size()) && (index>vc)){
+ index -= vc; b++;
+ QList<int> *il = bs->value(b-1);
+ if (il) vc = il->value(0);
+ }
+ vc = bs->value(b-1)->value(c);
+ while((c<bs->value(b-1)->size()) && (index>vc)){
+ index -= vc;
+ c++;
+ vc = bs->value(b-1)->value(c);
+ }
+ *bk = b; *ch = c; *vr = index;
+};
+
+int referenceToIndex(int bk, int ch, int vr, const BibleStructure *bs){
+ int r = 0;
+ if (!bk) return 0;
+// showMessage(QString::number(bk)+" "+QString::number(ch)+" "+QString::number(vr)+" ");
+// if (bk<1) bk=1;
+ for(int i=0; i<bk-1; i++) r += bs->value(i)->value(0);
+ for(int i=1; i<ch; i++) r += bs->value(bk-1)->value(i);
+ return r+vr;
+};
+
+int pointer(int i, const QString &fn){
+ QFile file(fn);
+ if (!file.open(QFile::ReadOnly)) return -1;
+ QDataStream ds(&file);
+ ds.setByteOrder(QDataStream::LittleEndian);
+ file.seek(i*4);
+ qint32 r;
+ ds >> r;
+ file.close();
+ return r;
+};
+
+int pointer2(int i, const QString &fn){
+ QFile file(fn);
+ if (!file.open(QFile::ReadOnly)) return -1;
+ QDataStream ds(&file);
+ ds.setByteOrder(QDataStream::LittleEndian);
+ file.seek(i*2);
+ quint16 r;
+ ds >> r;
+ file.close();
+ return r;
+};
+
+QString textFragment(int p, const QString &fn, const QByteArray &cd){
+ QFile file(fn);
+ if (!file.open(QFile::ReadOnly)) return "";
+ QDataStream ds(&file);
+ ds.setByteOrder(QDataStream::LittleEndian);
+ file.seek(p);
+ quint16 r;
+ ds >> r;
+ char b[r+1];
+ ds.readRawData(b,r); b[r]=0;
+ file.close();
+ QTextCodec *tc = QTextCodec::codecForName(cd);
+ QTextCodec::setCodecForCStrings(tc);
+ QString rt(b);
+ return rt;
+};
+
+QStringList *textFragments(int p, int c, const QString &fn, const QByteArray &cd){
+ QFile file(fn);
+ if (!file.open(QFile::ReadOnly)) return 0;
+ QStringList *sl = new QStringList();
+ QDataStream ds(&file);
+ ds.setByteOrder(QDataStream::LittleEndian);
+ QTextCodec *tc = QTextCodec::codecForName(cd);
+ QTextCodec::setCodecForCStrings(tc);
+ file.seek(p);
+ do{
+ quint16 r;
+ ds >> r;
+ char b[r+1];
+ ds.readRawData(b,r); b[r]=0;
+ QString rt(b);
+ if (rt.size()==0) showMessage("Null string");
+ sl->append(rt);
+ c--;
+ } while(c>0);
+ file.close();
+ return sl;
+};
+
+void setDownloadWidgets(QProgressBar *pb, QPushButton *cb){
+ downloadProgressBar = pb;
+ dounloadCancelButton = cb;
+};
+
+QString download_site = "physics-bg.org";
+
+void setDownloadSite(const QString &ds){
+ download_site = ds;
+};
+
+QString downloadSite(){
+ return download_site;
+}
+
+QString default_Css = "";
+
+void setDefaultCss(const QString &ds){
+ default_Css = ds;
+};
+
+QString defaultCss(){
+ return default_Css;
+};
+
+QList<int> *indexArray(int i, const QString &fn){
+ QList<int> *r = new QList<int>;
+ if (i<0) return r;
+ QFile file(fn);
+ if (!file.open(QFile::ReadOnly)) return r;
+ QDataStream ds(&file);
+ ds.setByteOrder(QDataStream::LittleEndian);
+ quint16 a;
+ file.seek(i*2);
+ ds >> a;
+ while (a>0){
+ quint16 b;
+ ds >> b;
+ r->append(b);
+ a--;
+ }
+ file.close();
+ return r;
+};
+
+QString biblePath(){
+ return bible_Path;
+};
+
+void setBiblePath(const QString &s){
+ bible_Path = s;
+};
+
+QStringList getReadPositions(){
+ QStringList k = read_pos.keys();
+ QStringList r;
+ for(int i=0; i<k.size(); i++) r << k.at(i) + "=" + QString::number( read_pos.value(k.at(i)) );
+ return r;
+};
+
+void setReadPositions(const QStringList &bl){
+ for(int i=0; i<bl.size(); i++){
+ QStringList l = bl.at(i).split("=");
+ read_pos[l.at(0)] = l.at(1).toInt();
+ }
+};
Modified: trunk/bibleWindow.h
===================================================================
--- trunk/bibleWindow.h 2010-07-07 19:58:29 UTC (rev 63)
+++ trunk/bibleWindow.h 2010-08-18 20:02:00 UTC (rev 64)
@@ -1,270 +1,270 @@
-/*
-CD Bible 5 - open source biblical program
-Copyright (C) 2008 Vanyo Georgiev <info@...>
-
-This program is free software; you can redistribute it and/or
-modify it under the terms of the GNU General Public License
-as published by the Free Software Foundation; either version 2
-of the License, or (at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
-Този модул съдържа класове, необходими за отваряне и показване текста
-на резлични издания на Библията.
-
-*/
-
-#ifndef BIBLEWINDOW_H
-#define BIBLEWINDOW_H
-
-#include "exportDialog.h"
-
-#include <QAbstractListModel>
-#include <QTextBrowser>
-#include <QHash>
-#include <QProcess>
-
-class QFile;
-class QProgressBar;
-class QPushButton;
-class FileDownloader;
-class MyProcess;
-class ConcordanceModel;
-
-/* -------BibleStructure---------
- Клас за описване структурата на Библията -
- колко глави има всяка книга, и колко стиха има всяка глава.
- Понеже има разлики между различните издания на Библията,
- за установяване съответствието между стиховете, се използват следните понятия:
- Глобална структура се нарича структурата на едно несъществуващо издание на
- Библията, в което: има толкова книги, колкото има в изданието с най-много книги;
- всяка книга има толкова глави колкото в изданието с най-много глави в тази книга;
- всяка глава има толкова стихове, колкото в изданието с най-много стихове в тази глава.
- Локална структура се нарича структурата на конкретно издание на Библията.
- Индекс на стих е поредния номер на даден стих, отчетен от началото на Библията.
- Всеки стих има локален и глобален индекс. Локалният индекс се пресмята според локалната
- структура, а глобалния - според глобалната.
-*/
-
-class BibleStructure : public QList<QList<int>*>
-{
-public:
- int verseCount;
-};
-
-/*--------VerseCorrection---------
- Клас за описване на корекциите за преминаване от локална към глобална структура
- и обратно.
-*/
-
-class VerseCorrection: public QObject{
-public:
- VerseCorrection(const QStringList &cl);
- int bk, // Глобален номер на книга
- ch0, // Локален номер на глава
- vr0, // Локален номер на стих, от който нататък, до края на главата, трябва да се направи корекция.
- ch1, // Корекция на локалния номер на глава
- vr1; /* Корекция на локалния номер на стиха
- При преход от локални към глобални номера, корекцията се прибавя.
- При преход от глобални към локални номера, корекцията се изважда.
- */
-};
-
-/*-----------VerseCorrectionList---------
- Списък на корекциите за дадено издание на Библията.
- Чете се от файл _Diff_.txt. Всеки ред от този файл съдържа четирите полета за class VerseCorrection.
-*/
-
-class VerseCorrectionList : public QList<VerseCorrection*>{};
-
-/*-----------BibleWindow---------------
- Клас, представляващ прозорец, в който се показва една глава от дадено
- издание на Библията. Класът съдържа и друга информация за самото издание.
-*/
-
-class BibleWindow: public QTextBrowser
-{
- Q_OBJECT
-
-public:
- QStringList longTitles, // Пълни заглавия на книгите, както се показват в текста.
- shortTitles, // Кратки заглавия на книгите, както се показват в менюто.
- abrevs; /* Съкращения на заглавията на книгите.
- Тези три форми на заглавията се прочитат от файл BibleTitles.txt от директорията
- на съответното издание.
- */
- bool synchronize, // Определя дали прозореца да се синхронизира с активния стих
- wordsChanged; // Става истина при смяна на думите за търсене
-
- BibleWindow( const QString &bv, QWidget *parent = 0); // Конструктор на класа. bv е идентификатор на версия на Библията
-
- QString bibleVersion(); /* Идентификатор на версията на Библията, който съвпада с името на директорията й.*/
- QString bibleDir(); // Връща пътя на директорията с файловете от дадената Библия
- void setReference(int b, int c, int v); /* Задаване номерата на текущите книга, глава и стих.*/
- int verseIndex(); // Пресмята локалния индекс на текущия стих
- int verseIndex(const QString &s); // Пресмята локалния индекс на текущия стих, зададен с текстова препратка s.
- void setVerseByIndex(int i); // Задава текущ стих по локален индекс
- void globalIndexToLocal(); // Трансформация от глобален към локален индекс на стих
- int localToGlobalIndex(); // Трансформация от глобален към локален индекс на стих
- int book(); // Локален номер на текущата книга
- int book(int b); // Локален номер на книгата с глобален номер b
- int globalBook(); // Глобавен номер на текущата книга
- int globalBook(int b); // Глобавен номер книга с локален номер b
- int chapter(); // Локален номер на текущата глава
- int verse(); // Локален номер на текущия стих
- int bookCount(); // Брой на книгите от даденото издание на Библията
- int chapterCount(); // Брой на главите в текущата книга
- int chapterCount(int b); // Брой на главите в книга b
- int verseCount(); // Брой на стиховете в текущата глава
- int verseCount(int c); // Брой на стиховете в глава c на текущата книга
- int verseCount(int b, int c); // Брой на стиховете в книга b, глава c
- int verseTotalCount(); // Брой на всички стихове от Библията
- QString reference(bool abr = false); // Препратка за текущия стих, когато abr=true, името на книгата е съкратено
- QString reference(int i, bool abr = false); // Връща припратка към стих с локален индекс i. Когато abr=true името на книгата е съкратено
- void displayText(); // Опресняване на текста в прозореца
- void displayFreshText(); // Четене и показване на нов текст
- QString toHtml(ExportDialog::Export e); // Част от текста на Библията в html формат
- QString toTxt(ExportDialog::Export e); // Част от текста на Библията в txt формат
- void about(MyProcess *p); // Отваря "Относно" информацията за Библията
- ConcordanceModel *concordance(); // Модел на списъка с думи. Използва се в конкорданса.
- int readPos(); // Връща номера на стиха, достигнат с последователно четене.
- void setReadPos(); // Запазва номера на стиха, достигнат с последователно четене.
- QString language(); // Връща иентификатор на езика
- void downloadBible(const QString &bv); // Изтегля от Интернет и разархивира Библия bv
- void writeSettings(); // Записва настройките
- void readSettings(); // Чете настройките
- void createLinksBin(); // Създава файловете Links.bin и LinksP.bin
-
-signals:
- void closing(BibleWindow *bw); // Сигнал, който се излъчва при затваряне на прозореца.
-
-public slots:
- void onGlobalIndexChanged(BibleWindow *bw); // Слот, който прихваща промяната на текущия стих
- void scrollToActiveVerse(); // "Превърта" прозореца така че да се вижда активния стих
- void refreshText(); // Показва отново текста в прозореца след промяна на опция, засягаща нечина на показване
-
-protected:
- void closeEvent(QCloseEvent *event); // Функция, която се изпълнява при събитие затваряне на прозореца.
-
-private slots:
- void onDownloadDone(bool e); // Приема сигнал за край на тегленето от Интернет
- void onUnzipFinished( int exitCode, QProcess::ExitStatus exitStatus ); /* Приема сигнал, че е завършено разархивирането
- на изтегления zip файл */
-
-private:
- QString bible_Version, // Идентификатор на версията на Библията, който съвпада с името на директорията й.
- dir, // Пълно име до директорията с файлове от дадената версия.
- zipFile, // Пълно име на изтегления от Интернет zip файл
- css, // Стил (CSS)
- links, // Препратки
- footnotes; // Бележки под линия
- int book_count, // Брой на книгите в дадената версия на Библията
- bk, // Глобален номер на текущата книга
- ch, // Локален номер на текущата глава
- vr, // Локален номер на текущия стих
- gch, // Глобален номер на текущата глава
- gvr, // Глобален номер на текущия стих
- bkl, chl, vrl, // Променливи, в които се записват стойностите на bk, ch и vr след промяната им.
- // Служат за откриване дали са настъпили промени в стойностите им.
- fCount; // Брой на бележките под линия към текущата глава.
- QHash<int, int> global_book, // Хеш за бързо преминаване от локални към глобални номера на книгите.
- local_book; // Хеш за бързо преминаване от глобални към локални номера на книгите.
- // Информацията за това съответствие е в първия ред на файл BibleTitles.txt
- QHash<QString,int> book_index; // Хеш за откриване номера на книгата по съкратеното й заглавие.
- BibleStructure *bible_Structure; // Локална структура на Библията
- VerseCorrectionList correctionLG, // Списък на корекциите от локални към глабални означения
- correctionGL; // Списък на корекциите от глобални към локални означения
- FileDownloader *fileDownloader;
- QProcess *process;
- ConcordanceModel *concordance_;
-
- bool readTitles(); // Четене на заглавията от файл BibleTitles.txt
- void readCorrection(); // Четене на корекциите от файл _Diff_.txt
- void globalToLocal(); // Пресмята стойности на gch и gvr, съответстващи не текущите стойности на ch и vr.
- void localToGlobal(); // Пресмята стойности на ch и vr, съответстващи не текущите стойности на gch и gvr.
- QString verseText(int i); // Чете текста на i-ия стих.
- void setVerseColor(int vr, const QString &c1, const QString &c2); // Оцветява i-я стих във цвят c (цвета се задава като в html формат)
- QStringList *verseTexts(int i, int c); // Чете текста на c стихове, започвайки от i-ия.
- QString wordChapter(); // Връща думите "Глава" или "Псалом" на съответния език
- QString wordChapter(int b); // Връща думите "Глава" или "Псалом" на съответния език
- QString addTags(const QString &s); /* Вмъква html тагове за да се форматира текста, защото в текстовите фрагменти
- текста, който трябва да е italic e заграден с вертикални черти |, а bold - в обратно наклонени черти \.*/
- QString addLinks(int i, int v); // Добавя препратки, ато те са описани в отделни файлове Links.bin и LinksP.bin.
-};
-
-//----------функции-------------
-
-QString versionCaption(const QString &bv); // По идентификатора на версията връща заглавието й.
-
-QByteArray versionCodec(const QString &bv); // По идентификатора на версията връща кодовата й таблица.
-
-QString versionLanguage(const QString &bv); // По идентификатора на версията връща езика й.
-
-void setVersionAttributes(const QString &bv, const QString &bc, const QString &vc, const QString &vl);
-/* Запазва информацията за версия на Библията с идентификатор bv.
- А именно: заглавието bc, кодовата таблица vc и език vl.
- Тази информация се намира в редовете на файл data/bibles/list.txt и се съхранява в хешове.
- (Виж реализацията на функцията в bibleWindow.cpp) */
-
-void readGlobalStructure(); // Чете глобалната структура от файл data/bibles/BibleStructure.txt.
-
-BibleStructure *readStructure(const QString &fn); // Чете структура от файл fn
-
-BibleStructure *globalStructure(); // Връща глобалната структура
-
-int globalVerseIndex(); // Връща глобалния индекс на текущия стих
-
-void setGlobalVerseIndex(int i); // Задава стойност на глобалния индекс
-
-void indexToRefrence(int index, int *bk, int *ch, int *vr, const BibleStructure *bs); /* Пресмята съответстващите
- на стойността на индекса i, стойности на номерата на книгата bk, главата ch и стиха vr,
- съответстващи на структура на Библията, описана в bs */
-
-int referenceToIndex(int bk, int ch, int vr, const BibleStructure *bs); /* Връща индекса на стиха, съответстващ
- на номерата на книгата bk, главата ch и стиха vr, при структура на Библията bs. */
-
-int pointer(int i, const QString &fn); // Чете i-ия четирибайтов указател от файла с указатели fn
-int pointer2(int i, const QString &fn);// Чете i-то двубайтово число от файла с указатели fn
-
-QString textFragment(int p, const QString &fn, const QByteArray &cd = "cp1251"); /* Чете текстов фрагмент,
- посочен от указателя p във файла fn, при кодировка cd.
- Текстовият фрагмент е структура, която съдържа първо двубайтово число, което показва дължината на стринг и
- след това толкова байтове, колкото са необходими за представяне на текст с тази дължина, при
- определена кодировка. Във файл CompactText.bin в текстови фрагменти са записани един след друг стиховете
- от дадена версия на Библията. Указателите, които посочват къде започва текстовия фрагмент на всеки стих са
- във файл CompactPoint.bin.*/
-
-QStringList *textFragments(int p, int c, const QString &fn, const QByteArray &cd = "cp1251"); /* Чете от позиция
- посочена от указателя p, c на брой текстови фрагменти, от файл fn, с кодировка cd. */
-
-void setDownloadWidgets(QProgressBar *pb, QPushButton *cb); /* Задава индикаторна лента и бутон за прекратяване,
- които се показват при теглене от Интернет. */
-
-void setDownloadSite(const QString &ds); // Съхранява домейна на сайта, от който става теглене на файлове
-
-QString downloadSite(); // Връща домейна на сайта, от който става теглене на файлове
-
-void setDefaultCss(const QString &ds); // Задава подразбиращ се стил (CSS)
-
-QString defaultCss(); // Връща подразбиращия се стил (CSS)
-
-QList<int> *indexArray(int i, const QString &fn); /* чете от позиция i на файл с име fn масив от двубайтови
- цели числа */
-
-QString biblePath(); // връща пътя до директорията с библии
-void setBiblePath(const QString &s); // запазва пътя до директорията с библии
-
-QStringList getReadPositions(); /* Връща във вид на списък стрингове локалните номера на стиховете,
- до които потребителя е стигнал с последователно четене на всяка Библия */
-void setReadPositions(const QStringList &bl); /* Преобразува от стрингове в цели числа и запазва
- в хеша read_pos локалните номера на стиховете, на местата на последователно четене.
- Тези две функции се използват от функциите writeSettings и readSettings. */
-
-#endif
+/*
+CD Bible 5 - open source biblical program
+Copyright (C) 2008 Vanyo Georgiev <info@...>
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+Този модул съдържа класове, необходими за отваряне и показване текста
+на резлични издания на Библията.
+
+*/
+
+#ifndef BIBLEWINDOW_H
+#define BIBLEWINDOW_H
+
+#include "exportDialog.h"
+
+#include <QAbstractListModel>
+#include <QTextBrowser>
+#include <QHash>
+#include <QProcess>
+
+class QFile;
+class QProgressBar;
+class QPushButton;
+class FileDownloader;
+class MyProcess;
+class ConcordanceModel;
+
+/* -------BibleStructure---------
+ Клас за описване структурата на Библията -
+ колко глави има всяка книга, и колко стиха има всяка глава.
+ Понеже има разлики между различните издания на Библията,
+ за установяване съответствието между стиховете, се използват следните понятия:
+ Глобална структура се нарича структурата на едно несъществуващо издание на
+ Библията, в което: има толкова книги, колкото има в изданието с най-много книги;
+ всяка книга има толкова глави колкото в изданието с най-много глави в тази книга;
+ всяка глава има толкова стихове, колкото в изданието с най-много стихове в тази глава.
+ Локална структура се нарича структурата на конкретно издание на Библията.
+ Индекс на стих е поредния номер на даден стих, отчетен от началото на Библията.
+ Всеки стих има локален и глобален индекс. Локалният индекс се пресмята според локалната
+ структура, а глобалния - според глобалната.
+*/
+
+class BibleStructure : public QList<QList<int>*>
+{
+public:
+ int verseCount;
+};
+
+/*--------VerseCorrection---------
+ Клас за описване на корекциите за преминаване от локална към глобална структура
+ и обратно.
+*/
+
+class VerseCorrection: public QObject{
+public:
+ VerseCorrection(const QStringList &cl);
+ int bk, // Глобален номер на книга
+ ch0, // Локален номер на глава
+ vr0, // Локален номер на стих, от който нататък, до края на главата, трябва да се направи корекция.
+ ch1, // Корекция на локалния номер на глава
+ vr1; /* Корекция на локалния номер на стиха
+ При преход от локални към глобални номера, корекцията се прибавя.
+ При преход от глобални към локални номера, корекцията се изважда.
+ */
+};
+
+/*-----------VerseCorrectionList---------
+ Списък на корекциите за дадено издание на Библията.
+ Чете се от файл _Diff_.txt. Всеки ред от този файл съдържа четирите полета за class VerseCorrection.
+*/
+
+class VerseCorrectionList : public QList<VerseCorrection*>{};
+
+/*-----------BibleWindow---------------
+ Клас, представляващ прозорец, в който се показва една глава от дадено
+ издание на Библията. Класът съдържа и друга информация за самото издание.
+*/
+
+class BibleWindow: public QTextBrowser
+{
+ Q_OBJECT
+
+public:
+ QStringList longTitles, // Пълни заглавия на книгите, както се показват в текста.
+ shortTitles, // Кратки заглавия на книгите, както се показват в менюто.
+ abrevs; /* Съкращения на заглавията на книгите.
+ Тези три форми на заглавията се прочитат от файл BibleTitles.txt от директорията
+ на съответното издание.
+ */
+ bool synchronize, // Определя дали прозореца да се синхронизира с активния стих
+ wordsChanged; // Става истина при смяна на думите за търсене
+
+ BibleWindow( const QString &bv, QWidget *parent = 0); // Конструктор на класа. bv е идентификатор на версия на Библията
+
+ QString bibleVersion(); /* Идентификатор на версията на Библията, който съвпада с името на директорията й.*/
+ QString bibleDir(); // Връща пътя на директорията с файловете от дадената Библия
+ void setReference(int b, int c, int v); /* Задаване номерата на текущите книга, глава и стих.*/
+ int verseIndex(); // Пресмята локалния индекс на текущия стих
+ int verseIndex(const QString &s); // Пресмята локалния индекс на текущия стих, зададен с текстова препратка s.
+ void setVerseByIndex(int i); // Задава текущ стих по локален индекс
+ void globalIndexToLocal(); // Трансформация от глобален към локален индекс на стих
+ int localToGlobalIndex(); // Трансформация от глобален към локален индекс на стих
+ int book(); // Локален номер на текущата книга
+ int book(int b); // Локален номер на книгата с глобален номер b
+ int globalBook(); // Глобавен номер на текущата книга
+ int globalBook(int b); // Глобавен номер книга с локален номер b
+ int chapter(); // Локален номер на текущата глава
+ int verse(); // Локален номер на текущия стих
+ int bookCount(); // Брой на книгите от даденото издание на Библията
+ int chapterCount(); // Брой на главите в текущата книга
+ int chapterCount(int b); // Брой на главите в книга b
+ int verseCount(); // Брой на стиховете в текущата глава
+ int verseCount(int c); // Брой на стиховете в глава c на текущата книга
+ int verseCount(int b, int c); // Брой на стиховете в книга b, глава c
+ int verseTotalCount(); // Брой на всички стихове от Библията
+ QString reference(bool abr = false); // Препратка за текущия стих, когато abr=true, името на книгата е съкратено
+ QString reference(int i, bool abr = false); // Връща припратка към стих с локален индекс i. Когато abr=true името на книгата е съкратено
+ void displayText(); // Опресняване на текста в прозореца
+ void displayFreshText(); // Четене и показване на нов текст
+ QString toHtml(ExportDialog::Export e); // Част от текста на Библията в html формат
+ QString toTxt(ExportDialog::Export e); // Част от текста на Библията в txt формат
+ void about(MyProcess *p); // Отваря "Относно" информацията за Библията
+ ConcordanceModel *concordance(); // Модел на списъка с думи. Използва се в конкорданса.
+ int readPos(); // Връща номера на стиха, достигнат с последователно четене.
+ void setReadPos(); // Запазва номера на стиха, достигнат с последователно четене.
+ QString language(); // Връща иентификатор на езика
+ void downloadBible(const QString &bv); // Изтегля от Интернет и разархивира Библия bv
+ void writeSettings(); // Записва настройките
+ void readSettings(); // Чете настройките
+ void createLinksBin(); // Създава файловете Links.bin и LinksP.bin
+ void import(const QString &fn); // Импортиране текста на Библията от .txt файл.
+signals:
+ void closing(BibleWindow *bw); // Сигнал, който се излъчва при затваряне на прозореца.
+
+public slots:
+ void onGlobalIndexChanged(BibleWindow *bw); // Слот, който прихваща промяната на текущия стих
+ void scrollToActiveVerse(); // "Превърта" прозореца така че да се вижда активния стих
+ void refreshText(); // Показва отново текста в прозореца след промяна на опция, засягаща нечина на показване
+
+protected:
+ void closeEvent(QCloseEvent *event); // Функция, която се изпълнява при събитие затваряне на прозореца.
+
+private slots:
+ void onDownloadDone(bool e); // Приема сигнал за край на тегленето от Интернет
+ void onUnzipFinished( int exitCode, QProcess::ExitStatus exitStatus ); /* Приема сигнал, че е завършено разархивирането
+ на изтегления zip файл */
+
+private:
+ QString bible_Version, // Идентификатор на версията на Библията, който съвпада с името на директорията й.
+ dir, // Пълно име до директорията с файлове от дадената версия.
+ zipFile, // Пълно име на изтегления от Интернет zip файл
+ css, // Стил (CSS)
+ links, // Препратки
+ footnotes; // Бележки под линия
+ int book_count, // Брой на книгите в дадената версия на Библията
+ bk, // Глобален номер на текущата книга
+ ch, // Локален номер на текущата глава
+ vr, // Локален номер на текущия стих
+ gch, // Глобален номер на текущата глава
+ gvr, // Глобален номер на текущия стих
+ bkl, chl, vrl, // Променливи, в които се записват стойностите на bk, ch и vr след промяната им.
+ // Служат за откриване дали са настъпили промени в стойностите им.
+ fCount; // Брой на бележките под линия към текущата глава.
+ QHash<int, int> global_book, // Хеш за бързо преминаване от локални към глобални номера на книгите.
+ local_book; // Хеш за бързо преминаване от глобални към локални номера на книгите.
+ // Информацията за това съответствие е в първия ред на файл BibleTitles.txt
+ QHash<QString,int> book_index; // Хеш за откриване номера на книгата по съкратеното й заглавие.
+ BibleStructure *bible_Structure; // Локална структура на Библията
+ VerseCorrectionList correctionLG, // Списък на корекциите от локални към глабални означения
+ correctionGL; // Списък на корекциите от глобални към локални означения
+ FileDownloader *fileDownloader;
+ QProcess *process;
+ ConcordanceModel *concordance_;
+
+ bool readTitles(); // Четене на заглавията от файл BibleTitles.txt
+ void readCorrection(); // Четене на корекциите от файл _Diff_.txt
+ void globalToLocal(); // Пресмята стойности на gch и gvr, съответстващи не текущите стойности на ch и vr.
+ void localToGlobal(); // Пресмята стойности на ch и vr, съответстващи не текущите стойности на gch и gvr.
+ QString verseText(int i); // Чете текста на i-ия стих.
+ void setVerseColor(int vr, const QString &c1, const QString &c2); // Оцветява i-я стих във цвят c (цвета се задава като в html формат)
+ QStringList *verseTexts(int i, int c); // Чете текста на c стихове, започвайки от i-ия.
+ QString wordChapter(); // Връща думите "Глава" или "Псалом" на съответния език
+ QString wordChapter(int b); // Връща думите "Глава" или "Псалом" на съответния език
+ QString addTags(const QString &s); /* Вмъква html тагове за да се форматира текста, защото в текстовите фрагменти
+ текста, който трябва да е italic e заграден с вертикални черти |, а bold - в обратно наклонени черти \.*/
+ QString addLinks(int i, int v); // Добавя препратки, ато те са описани в отделни файлове Links.bin и LinksP.bin.
+};
+
+//----------функции-------------
+
+QString versionCaption(const QString &bv); // По идентификатора на версията връща заглавието й.
+
+QByteArray versionCodec(const QString &bv); // По идентификатора на версията връща кодовата й таблица.
+
+QString versionLanguage(const QString &bv); // По идентификатора на версията връща езика й.
+
+void setVersionAttributes(const QString &bv, const QString &bc, const QString &vc, const QString &vl);
+/* Запазва информацията за версия на Библията с идентификатор bv.
+ А именно: заглавието bc, кодовата таблица vc и език vl.
+ Тази информация се намира в редовете на файл data/bibles/list.txt и се съхранява в хешове.
+ (Виж реализацията на функцията в bibleWindow.cpp) */
+
+void readGlobalStructure(); // Чете глобалната структура от файл data/bibles/BibleStructure.txt.
+
+BibleStructure *readStructure(const QString &fn); // Чете структура от файл fn
+
+BibleStructure *globalStructure(); // Връща глобалната структура
+
+int globalVerseIndex(); // Връща глобалния индекс на текущия стих
+
+void setGlobalVerseIndex(int i); // Задава стойност на глобалния индекс
+
+void indexToRefrence(int index, int *bk, int *ch, int *vr, const BibleStructure *bs); /* Пресмята съответстващите
+ на стойността на индекса i, стойности на номерата на книгата bk, главата ch и стиха vr,
+ съответстващи на структура на Библията, описана в bs */
+
+int referenceToIndex(int bk, int ch, int vr, const BibleStructure *bs); /* Връща индекса на стиха, съответстващ
+ на номерата на книгата bk, главата ch и стиха vr, при структура на Библията bs. */
+
+int pointer(int i, const QString &fn); // Чете i-ия четирибайтов указател от файла с указатели fn
+int pointer2(int i, const QString &fn);// Чете i-то двубайтово число от файла с указатели fn
+
+QString textFragment(int p, const QString &fn, const QByteArray &cd = "cp1251"); /* Чете текстов фрагмент,
+ посочен от указателя p във файла fn, при кодировка cd.
+ Текстовият фрагмент е структура, която съдържа първо двубайтово число, което показва дължината на стринг и
+ след това толкова байтове, колкото са необходими за представяне на текст с тази дължина, при
+ определена кодировка. Във файл CompactText.bin в текстови фрагменти са записани един след друг стиховете
+ от дадена версия на Библията. Указателите, които посочват къде започва текстовия фрагмент на всеки стих са
+ във файл CompactPoint.bin.*/
+
+QStringList *textFragments(int p, int c, const QString &fn, const QByteArray &cd = "cp1251"); /* Чете от позиция
+ посочена от указателя p, c на брой текстови фрагменти, от файл fn, с кодировка cd. */
+
+void setDownloadWidgets(QProgressBar *pb, QPushButton *cb); /* Задава индикаторна лента и бутон за прекратяване,
+ които се показват при теглене от Интернет. */
+
+void setDownloadSite(const QString &ds); // Съхранява домейна на сайта, от който става теглене на файлове
+
+QString downloadSite(); // Връща домейна на сайта, от който става теглене на файлове
+
+void setDefaultCss(const QString &ds); // Задава подразбиращ се стил (CSS)
+
+QString defaultCss(); // Връща подразбиращия се стил (CSS)
+
+QList<int> *indexArray(int i, const QString &fn); /* чете от позиция i на файл с име fn масив от двубайтови
+ цели числа */
+
+QString biblePath(); // връща пътя до директорията с библии
+void setBiblePath(const QString &s); // запазва пътя до директорията с библии
+
+QStringList getReadPositions(); /* Връща във вид на списък стрингове локалните номера на стиховете,
+ до които потребителя е стигнал с последователно четене на всяка Библия */
+void setReadPositions(const QStringList &bl); /* Преобразува от стрингове в цели числа и запазва
+ в хеша read_pos локалните номера на стиховете, на местата на последователно четене.
+ Тези две функции се използват от функциите writeSettings и readSettings. */
+
+#endif
Modified: trunk/htdocs/readme-bg.html
===================================================================
--- trunk/htdocs/readme-bg.html 2010-07-07 19:58:29 UTC (rev 63)
+++ trunk/htdocs/readme-bg.html 2010-08-18 20:02:00 UTC (rev 64)
@@ -3,33 +3,35 @@
<head>
<title>\xCA\xEE\xEC\xEF\xFE\xF2\xFA\xF0\xED\xE0 \xC1\xE8\xE1\xEB\xE8\xFF 5 - readme file</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
- <link href="style.css" rel="stylesheet" type="text/css" />
+ <link href="style.css" rel="stylesheet" type="text/css">
</head>
<body>
<h1>\xCA\xEE\xEC\xEF\xFE\xF2\xFA\xF0\xED\xE0 \xC1\xE8\xE1\xEB\xE8\xFF - \xE2\xE5\xF0\xF1\xE8\xFF 5</h1>
-<p><img src="images/scr-min-3.png" alt="screenshot" align="right" vspace="0px" hspace="20px" />
+<p><img src="images/scr-min-3.png" alt="screenshot" align="right" vspace="0px" hspace="20px">
\xCF\xF0\xEE\xE3\xF0\xE0\xEC\xE0 \xE7\xE0 \xF7\xE5\xF2\xE5\xED\xE5 \xE8 \xE8\xE7\xF3\xF7\xE0\xE2\xE0\xED\xE5 \xED\xE0 \xC1\xE8\xE1\xEB\xE8\xFF\xF2\xE0
-<br />\xCE\xF4\xE8\xF6\xE8\xE0\xEB\xE5\xED \xF1\xE0\xE9\xF2 <a href="http://readthebible.sourceforge.net">readthebible.sourceforge.net</a></p>
+<br>\xCE\xF4\xE8\xF6\xE8\xE0\xEB\xE5\xED \xF1\xE0\xE9\xF2 <a href="http://readthebible.sourceforge.net">readthebible.sourceforge.net</a></p>
<a name="toc"></a>
<h2>\xD1\xFA\xE4\xFA\xF0\xE6\xE0\xED\xE8\xE5</h2>
<p class="toc">
-<a href="#new">\xD1\xFA\xEE\xE1\xF9\xE5\xED\xE8\xFF \xE7\xE0 \xED\xEE\xE2\xEE\xF1\xF2\xE8</a><br />
-<a href="#info">\xCE\xE1\xF9\xE0 \xC8\xED\xF4\xEE\xF0\xEC\xE0\xF6\xE8\xFF</a><br />
-<a href="#help">\xCF\xEE\xEC\xEE\xE3\xED\xE5\xF2\xE5</a><br />
-<strong><a href="#download">\xC8\xE7\xF2\xE5\xE3\xEB\xFF\xED\xE5</a><br /></strong>
-<a href="#code">\xC7\xE0 \xEF\xF0\xEE\xE3\xF0\xE0\xEC\xE8\xF1\xF2\xE8</a><br />
-<a href="#versions">\xC2\xE5\xF0\xF1\xE8\xE8</a><br />
+<a href="#new">\xD1\xFA\xEE\xE1\xF9\xE5\xED\xE8\xFF \xE7\xE0 \xED\xEE\xE2\xEE\xF1\xF2\xE8</a><br>
+<a href="#info">\xCE\xE1\xF9\xE0 \xC8\xED\xF4\xEE\xF0\xEC\xE0\xF6\xE8\xFF</a><br>
+<a href="#help">\xCF\xEE\xEC\xEE\xE3\xED\xE5\xF2\xE5</a><br>
+<strong><a href="#download">\xC8\xE7\xF2\xE5\xE3\xEB\xFF\xED\xE5</a><br></strong>
+<a href="#code">\xC7\xE0 \xEF\xF0\xEE\xE3\xF0\xE0\xEC\xE8\xF1\xF2\xE8</a><br>
+<a href="#versions">\xC2\xE5\xF0\xF1\xE8\xE8</a><br>
<a href="#maillists">\xCF\xEE\xF9\xE5\xED\xF1\xEA\xE8 \xF1\xEF\xE8\xF1\xFA\xF6\xE8</a>
</p>
<a name="new"></a>
<h2>\xD1\xFA\xEE\xE1\xF9\xE5\xED\xE8\xFF \xE7\xE0 \xED\xEE\xE2\xEE\xF1\xF2\xE8</h2>
+<p><strong>18 \xE0\xE2\xF3\xF1\xF2 2010 \xE3.</strong> \xD0\xE0\xE1\xEE\xF2\xE8 \xF1\xE5 \xEF\xEE \xED\xEE\xE2\xE0 \xE2\xE5\xF0\xF1\xE8\xFF 5 \xE0\xEB\xF4\xE0 20. \xC2\xE8\xE6\xF2\xE5 <a href="#versions">\xC2\xE5\xF0\xF1\xE8\xE8</a>.</p>
+
<p><strong>8 \xE0\xEF\xF0\xE8\xEB 2010 \xE3.</strong> \xCD\xEE\xE2\xE0 \xE2\xE5\xF0\xF1\xE8\xFF 5 \xE0\xEB\xF4\xE0 19. \xC2\xE8\xE6\xF2\xE5 <a href="#versions">\xC2\xE5\xF0\xF1\xE8\xE8</a>.</p>
<p><strong>1 \xE0\xEF\xF0\xE8\xEB 2010 \xE3.</strong> \xCE\xF2 \xEE\xF9\xE5 \xE5\xE4\xE8\xED \xF1\xE0\xE9\xF2 \xE7\xE0 \xF1\xEE\xF4\xF2\xF3\xE5\xF0 \xF1\xE0 \xE7\xE0\xE1\xE5\xEB\xFF\xE7\xE0\xEB\xE8 \xE8 \xEF\xF3\xE1\xEB\xE8\xEA\xF3\xE2\xE0\xEB\xE8 \xE8\xED\xF4\xEE\xF0\xEC\xE0\xF6\xE8\xFF \xE7\xE0 "\xCA\xEE\xEC\xEF\xFE\xF2\xFA\xF0\xED\xE0 \xC1\xE8\xE1\xEB\xE8\xFF" - <a href="http://www.softoxi.com/read-the-bible.html" target="_blank"><strong>softoxi.com</strong></a>.</p>
@@ -67,9 +69,9 @@
<p>\xCA\xFA\xEC \xEC\xEE\xEC\xE5\xED\xF2\xE0 \xE2 \xF0\xE0\xE1\xEE\xF2\xE0\xF2\xE0 \xEF\xEE \xEF\xF0\xEE\xE3\xF0\xE0\xEC\xE0\xF2\xE0 \xF1\xE0 \xF3\xF7\xE0\xF1\xF2\xE2\xE0\xEB\xE8:</p>
<p style="margin-left:20px">\xC2\xE0\xED\xFC\xEE \xC3\xE5\xEE\xF0\xE3\xE8\xE5\xE2 - \xE0\xE2\xF2\xEE\xF0 \xED\xE0 \xCA\xEE\xEC\xEF\xFE\xF2\xFA\xF0\xED\xE0 \xC1\xE8\xE1\xEB\xE8\xFF - \xE2\xE5\xF0\xF1\xE8\xFF 3.4, \xEF\xF0\xEE\xE3\xF0\xE0\xEC\xE8\xF1\xF2, \xE0\xE4\xEC\xE8\xED\xE8\xF1\xF2\xF0\xE0\xF2\xEE\xF0 \xED\xE0 \xF1\xE0\xE9\xF2\xE0 <a href="http://vanyog.com" terget="_blank">vanyog.com</a>;
-<br />\xD2\xE5\xEE\xE4\xEE\xF0 \xC1\xE0\xF5\xF7\xE5\xE2\xE0\xED\xEE\xE2 - \xE3\xF0\xE0\xF4\xE8\xF7\xE5\xED \xE4\xE8\xE7\xE0\xE9\xED, \xF1\xFA\xE7\xE4\xE0\xF2\xE5\xEB \xED\xE0 \xED\xEE\xE2\xEE\xF2\xEE \xEB\xEE\xE3\xEE \xE8 \xE8\xEA\xEE\xED\xE0;
-<br />\xCF\xE5\xF2\xFA\xF0 \xD7\xE5\xF0\xE2\xE5\xED\xEA\xEE\xE2 - \xED\xE0\xE1\xE8\xF0\xE0\xED\xE5 \xED\xE0 \xF2\xE5\xEA\xF1\xF2;
-<br />\xC4\xE5\xFF\xED \xCF\xE0\xE2\xEB\xEE\xE2 - \xEF\xF0\xE5\xE2\xE5\xE6\xE4\xE0\xED\xE5 \xED\xE0 \xE0\xED\xE3\xEB\xE8\xE9\xF1\xEA\xE8.</p>
+<br>\xD2\xE5\xEE\xE4\xEE\xF0 \xC1\xE0\xF5\xF7\xE5\xE2\xE0\xED\xEE\xE2 - \xE3\xF0\xE0\xF4\xE8\xF7\xE5\xED \xE4\xE8\xE7\xE0\xE9\xED, \xF1\xFA\xE7\xE4\xE0\xF2\xE5\xEB \xED\xE0 \xED\xEE\xE2\xEE\xF2\xEE \xEB\xEE\xE3\xEE \xE8 \xE8\xEA\xEE\xED\xE0;
+<br>\xCF\xE5\xF2\xFA\xF0 \xD7\xE5\xF0\xE2\xE5\xED\xEA\xEE\xE2 - \xED\xE0\xE1\xE8\xF0\xE0\xED\xE5 \xED\xE0 \xF2\xE5\xEA\xF1\xF2;
+<br>\xC4\xE5\xFF\xED \xCF\xE0\xE2\xEB\xEE\xE2 - \xEF\xF0\xE5\xE2\xE5\xE6\xE4\xE0\xED\xE5 \xED\xE0 \xE0\xED\xE3\xEB\xE8\xE9\xF1\xEA\xE8.</p>
<p>\xC0\xEA\xEE \xE8\xEC\xE0\xF2\xE5 \xE6\xE5\xEB\xE0\xED\xE8\xE5 \xE8 \xE2\xE8\xE5 \xE4\xE0 \xF1\xE5 \xE2\xEA\xEB\xFE\xF7\xE8\xF2\xE5, \xE2\xE8\xE6\xF2\xE5 \xF0\xE0\xE7\xE4\xE5\xEB\xE0 "<a href="#help">\xCF\xEE\xEC\xEE\xE3\xED\xE5\xF2\xE5</a>".</p>
@@ -143,15 +145,20 @@
<p>\xC2 <strong>\xE4\xE8\xF0\xE5\xEA\xF2\xEE\xF0\xE8\xFF update</strong> \xF1\xE5 \xED\xE0\xEC\xE8\xF0\xE0 \xEF\xFA\xF0\xE2\xE8\xF7\xED\xE8\xFF \xEA\xEE\xE4 \xED\xE0 \xE5\xE4\xED\xE0 \xEC\xE0\xEB\xEA\xE0 \xE4\xEE\xEF\xFA\xEB\xED\xE8\xF2\xE5\xEB\xED\xE0 \xEF\xF0\xEE\xE3\xF0\xE0\xEC\xE0, \xEA\xEE\xFF\xF2\xEE \xF1\xE5 \xF1\xF2\xE0\xF0\xF2\xE8\xF0\xE0 \xF1\xEB\xE5\xE4 \xE8\xE7\xF2\xE5\xE3\xEB\xFF\xED\xE5 \xED\xE0 \xED\xEE\xE2\xE0 \xE2\xE5\xF0\xF1\xE8\xFF \xEE\xF2 \xC8\xED\xF2\xE5\xF0\xED\xE5\xF2. \xD2\xE0\xE7\xE8 \xEF\xF0\xEE\xE3\xF0\xE0\xEC\xE0 \xF0\xE0\xE7\xE0\xF0\xF5\xE8\xE2\xE8\xF0\xE0, \xE8\xE7\xF2\xE5\xE3\xEB\xE5\xED\xE8\xFF zip \xF4\xE0\xE9\xEB \xE8 \xEF\xEE\xF1\xEB\xE5 \xEE\xF2\xED\xEE\xE2\xEE \xF1\xF2\xE0\xF0\xF2\xE8\xF0\xE0 "\xCA\xEE\xEC\xEF\xFE\xF2\xFA\xF0\xED\xE0 \xC1\xE8\xE1\xEB\xE8\xFF - 5.0".</p>
<p><strong>build.bat</strong> \xE8 <strong>build.sh</strong> - \xE8\xE7\xE2\xFA\xF0\xF8\xE2\xE0\xF2 \xEA\xEE\xEC\xEF\xE8\xEB\xE8\xF0\xE0\xED\xE5\xF2\xEE (.bat \xF4\xE0\xE9\xEB\xE0 \xE2 Windows, \xE0 .sh \xF4\xE0\xE9\xEB\xE0 \xE2 Mac \xE8 Linux).
-<br /><strong>cpr.bat</strong> - \xF1\xFA\xE7\xE4\xE0\xE2\xE0 \xED\xEE\xE2\xE0 \xE4\xE8\xF0\xE5\xEA\xF2\xEE\xF0\xE8\xFF rel \xE8 \xEA\xEE\xEF\xE8\xF0\xE0 \xE2 \xED\xE5\xFF \xE8\xE7\xEF\xFA\xEB\xED\xE8\xEC\xE8\xFF \xE8 \xE4\xF0\xF3\xE3\xE8 \xF4\xE0\xE9\xEB\xEE\xE2\xE5;
-<br /><strong>cps.bat</strong> - \xF1\xFA\xE7\xE4\xE0\xE2\xE0 \xED\xEE\xE2\xE0 \xE4\xE8\xF0\xE5\xEA\xF2\xEE\xF0\xE8\xFF src \xE8 \xEA\xEE\xEF\xE8\xF0\xE0 \xE2 \xED\xE5\xFF \xF4\xE0\xE9\xEB\xEE\xE2\xE5\xF2\xE5 \xF1 \xE8\xE7\xF5\xEE\xE4\xED\xE8\xFF \xEA\xEE\xE4;
-<br /><strong>cpm.sh</strong> \xE8 <strong>cps.sh</strong> - \xF1\xFA\xF9\xEE\xF2\xEE \xEA\xE0\xF2\xEE cpr.bat \xE8 cps.bat, \xED\xEE \xE7\xE0 Mac;
-<br /><strong>mac.sh</strong> - \xEF\xEE\xE4\xE3\xEE\xF2\xE2\xFF \xE7\xE0 \xE4\xE8\xF1\xF2\xF0\xE8\xE1\xF3\xF2\xE8\xF0\xE0\xED\xE5 \xE8\xE7\xEF\xFA\xEB\xED\xE8\xEC\xE8\xFF \xEF\xE0\xEA\xE5\xF2 \xE7\xE0 Mac.</p>
+<br><strong>cpr.bat</strong> - \xF1\xFA\xE7\xE4\xE0\xE2\xE0 \xED\xEE\xE2\xE0 \xE4\xE8\xF0\xE5\xEA\xF2\xEE\xF0\xE8\xFF rel \xE8 \xEA\xEE\xEF\xE8\xF0\xE0 \xE2 \xED\xE5\xFF \xE8\xE7\xEF\xFA\xEB\xED\xE8\xEC\xE8\xFF \xE8 \xE4\xF0\xF3\xE3\xE8 \xF4\xE0\xE9\xEB\xEE\xE2\xE5;
+<br><strong>cps.bat</strong> - \xF1\xFA\xE7\xE4\xE0\xE2\xE0 \xED\xEE\xE2\xE0 \xE4\xE8\xF0\xE5\xEA\xF2\xEE\xF0\xE8\xFF src \xE8 \xEA\xEE\xEF\xE8\xF0\xE0 \xE2 \xED\xE5\xFF \xF4\xE0\xE9\xEB\xEE\xE2\xE5\xF2\xE5 \xF1 \xE8\xE7\xF5\xEE\xE4\xED\xE8\xFF \xEA\xEE\xE4;
@@ Diff output truncated at 100000 characters. @@
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|