const QString Rendering::CChapterDisplay::text( const QList<CSwordModuleInfo*>& modules, const QString& keyName, const CSwordBackend::DisplayOptions displayOptions, const CSwordBackend::FilterOptions filterOptions ) { Q_ASSERT( modules.count() >= 1 ); Q_ASSERT( !keyName.isEmpty() ); CSwordModuleInfo* module = modules.first(); if (modules.count() == 1) module->module()->setSkipConsecutiveLinks( true ); //skip empty, linked verses CTextRendering::KeyTreeItem::Settings settings; settings.keyRenderingFace = displayOptions.verseNumbers ? CTextRendering::KeyTreeItem::Settings::SimpleKey : CTextRendering::KeyTreeItem::Settings::NoKey; QString startKey = keyName; QString endKey = startKey; //check whether there's an intro we have to include Q_ASSERT((module->type() == CSwordModuleInfo::Bible)); if (module->type() == CSwordModuleInfo::Bible) { ((sword::VerseKey*)(module->module()->getKey()))->Headings(1); //HACK: enable headings for VerseKeys CSwordBibleModuleInfo* bible = dynamic_cast<CSwordBibleModuleInfo*>(module); Q_ASSERT(bible); CSwordVerseKey k1(module); k1.Headings(1); k1.key(keyName); if (k1.Chapter() == 1) k1.Chapter(0); //Chapter 1, start with 0:0, otherwise X:0 k1.Verse(0); startKey = k1.key(); if (k1.Chapter() == 0) k1.Chapter(1); k1.Verse(bible->verseCount(k1.book(), k1.Chapter())); endKey = k1.key(); } CDisplayRendering render(displayOptions, filterOptions); return render.renderKeyRange( startKey, endKey, modules, keyName, settings ); }
/*! \fn CInfoDisplay::decodeFootnote( const QString& data ) */ const QString CInfoDisplay::decodeFootnote( const QString& data ) { QStringList list = data.split("/"); Q_ASSERT(list.count() >= 3); if (!list.count()) { return QString::null; } const QString modulename = list.first(); const QString swordFootnote = list.last(); // remove the first and the last and then rejoin it to get a key list.pop_back(); list.pop_front(); const QString keyname = list.join("/"); CSwordModuleInfo* module = CPointers::backend()->findModuleByName(modulename); if (!module) { return QString::null; } boost::scoped_ptr<CSwordKey> key( CSwordKey::createInstance(module) ); key->key(keyname); key->renderedText(); //force entryAttributes const char* note = module->module()->getEntryAttributes() ["Footnote"][swordFootnote.toLatin1().data()]["body"].c_str(); QString text = module->isUnicode() ? QString::fromUtf8(note) : QString(note); text = QString::fromUtf8(module->module()->RenderText( module->isUnicode() ? (const char*)text.toUtf8() : (const char*)text.toLatin1() )); return QString("<div class=\"footnoteinfo\" lang=\"%1\"><h3>%2</h3><p>%3</p></div>") .arg(module->language()->abbrev()) .arg(tr("Footnote")) .arg(text); }
bool ModuleInterface::isLocked(const QString& moduleName) { CSwordModuleInfo* module = CSwordBackend::instance()->findModuleByName(moduleName); if (module) { // Verse intros must be false for checking lock if (module->type() == CSwordModuleInfo::Bible || module->type() == CSwordModuleInfo::Commentary) { ((sword::VerseKey*)(module->module()->getKey()))->setIntros(false); } bool locked = module->isLocked(); return locked; } return false; }
static void searchProgress(char percent, void *data) { typedef QPair<BtMiniMenu*, CSwordModuleInfo*> Pair; Pair *p = reinterpret_cast<Pair*>(data); if(!p) return; BtMiniMenu *dialog = p->first; CSwordModuleInfo *m = p->second; if(dialog && m) { if(dialog->wasCanceled()) m->module()->terminateSearch = true; dialog->setValue(percent); } }
/** Returns the rendered text using the modules in the list and using the key parameter. * The displayoptions and filter options are used, too. */ const QString CEntryDisplay::text( const QList<CSwordModuleInfo*>& modules, const QString& keyName, const CSwordBackend::DisplayOptions displayOptions, const CSwordBackend::FilterOptions filterOptions ) { CDisplayRendering render(displayOptions, filterOptions); //no highlighted key and no extra key link in the text CTextRendering::KeyTreeItem::Settings normal_settings(false, CTextRendering::KeyTreeItem::Settings::CompleteShort); CSwordModuleInfo* module = modules.first(); Rendering::CTextRendering::KeyTree tree; //in Bibles and Commentaries we need to check if 0:0 and X:0 contain something if (module->type() == CSwordModuleInfo::Bible || module->type() == CSwordModuleInfo::Commentary) { ((sword::VerseKey*)(module->module()->getKey()))->Headings(1); //HACK: enable headings for VerseKeys CSwordVerseKey k1(module); k1.Headings(1); k1.key(keyName); // don't print the key CTextRendering::KeyTreeItem::Settings preverse_settings(false, CTextRendering::KeyTreeItem::Settings::NoKey); if (k1.Verse() == 1) { //X:1, prepend X:0 if (k1.Chapter() == 1) { //1:1, also prepend 0:0 before that k1.Chapter(0); k1.Verse(0); if ( k1.rawText().length() > 0 ) { tree.append( new Rendering::CTextRendering::KeyTreeItem(k1.key(), modules, preverse_settings) ); } k1.Chapter(1); } k1.Verse(0); if ( k1.rawText().length() > 0 ) { tree.append( new Rendering::CTextRendering::KeyTreeItem(k1.key(), modules, preverse_settings) ); } } } tree.append( new Rendering::CTextRendering::KeyTreeItem(keyName, modules, normal_settings) ); QString result(render.renderKeyTree(tree)); qDeleteAll(tree); return result; }
void BtSearchResultArea::updatePreview(const QString& key) { using namespace Rendering; CSwordModuleInfo* module = m_moduleListBox->activeModule(); if ( module ) { const QString searchedText = CSearchDialog::getSearchDialog()->searchText(); QString text; CDisplayRendering render; BtConstModuleList modules; modules.append(module); CTextRendering::KeyTreeItem::Settings settings; //for bibles render 5 context verses if (module->type() == CSwordModuleInfo::Bible) { CSwordVerseKey vk(module); vk.setIntros(true); vk.setKey(key); // HACK: enable headings for VerseKeys: static_cast<sword::VerseKey *>(module->module()->getKey()) ->setIntros(true); //first go back and then go forward the keys to be in context vk.previous(CSwordVerseKey::UseVerse); vk.previous(CSwordVerseKey::UseVerse); //include Headings in display, they are indexed and searched too if (vk.getVerse() == 1) { if (vk.getChapter() == 1) { vk.setChapter(0); } vk.setVerse(0); } const QString startKey = vk.key(); vk.setKey(key); vk.next(CSwordVerseKey::UseVerse); vk.next(CSwordVerseKey::UseVerse); const QString endKey = vk.key(); settings.keyRenderingFace = CTextRendering::KeyTreeItem::Settings::CompleteShort; text = render.renderKeyRange(startKey, endKey, modules, key, settings); } //for commentaries only one verse, but with heading else if (module->type() == CSwordModuleInfo::Commentary) { CSwordVerseKey vk(module); vk.setIntros(true); vk.setKey(key); // HACK: enable headings for VerseKeys: static_cast<sword::VerseKey *>(module->module()->getKey()) ->setIntros(true); //include Headings in display, they are indexed and searched too if (vk.getVerse() == 1) { if (vk.getChapter() == 1) { vk.setChapter(0); } vk.setVerse(0); } const QString startKey = vk.key(); vk.setKey(key); const QString endKey = vk.key(); settings.keyRenderingFace = CTextRendering::KeyTreeItem::Settings::NoKey; text = render.renderKeyRange(startKey, endKey, modules, key, settings); } else { text = render.renderSingleKey(key, modules, settings); } m_previewDisplay->setText( CSwordModuleSearch::highlightSearchedText(text, searchedText) ); m_previewDisplay->moveToAnchor( CDisplayRendering::keyToHTMLAnchor(key) ); } }