const QString Rendering::CChapterDisplay::text( const BtConstModuleList &modules, const QString &keyName, const DisplayOptions &displayOptions, const FilterOptions &filterOptions) { using CSBMI = CSwordBibleModuleInfo; BT_ASSERT(modules.count() >= 1); BT_ASSERT(!keyName.isEmpty()); const 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 BT_ASSERT((module->type() == CSwordModuleInfo::Bible)); if (module->type() == CSwordModuleInfo::Bible) { // HACK: enable headings for VerseKeys: static_cast<sword::VerseKey *>(module->module().getKey()) ->setIntros(true); BT_ASSERT(dynamic_cast<CSBMI const *>(module)); const CSBMI *bible = static_cast<const CSBMI*>(module); CSwordVerseKey k1(module); k1.setIntros(true); k1.setKey(keyName); if (k1.getChapter() == 1) k1.setChapter(0); // Chapter 1, start with 0:0, otherwise X:0 k1.setVerse(0); startKey = k1.key(); if (k1.getChapter() == 0) k1.setChapter(1); k1.setVerse(bible->verseCount(k1.book(), k1.getChapter())); endKey = k1.key(); } CDisplayRendering render(displayOptions, filterOptions); return render.renderKeyRange( startKey, endKey, modules, keyName, settings ); }
StrongsResultList::StrongsResultList(const CSwordModuleInfo *module, const sword::ListKey & result, const QString &strongsNumber) { using namespace Rendering; int count = result.getCount(); if (!count) return; CTextRendering::KeyTreeItem::Settings settings; BtConstModuleList modules; modules.append(module); clear(); // for whatever reason the text "Parsing...translations." does not appear. // this is not critical but the text is necessary to get the dialog box // to be wide enough. QProgressDialog progress(QObject::tr("Parsing Strong's Numbers"), 0, 0, count); //0, "progressDialog", tr("Parsing Strong's Numbers"), tr("Parsing Strong's numbers for translations."), true); //progress->setAllowCancel(false); //progress->setMinimumDuration(0); progress.show(); progress.raise(); qApp->processEvents(QEventLoop::AllEvents, 1); //1 ms only for (int index = 0; index < count; index++) { progress.setValue(index); qApp->processEvents(QEventLoop::AllEvents, 1); //1 ms only QString key = QString::fromUtf8(result.getElement(index)->getText()); QString text = CDisplayRendering().renderSingleKey(key, modules, settings); for (int sIndex = 0;;) { continueloop: QString rText = getStrongsNumberText(text, sIndex, strongsNumber); if (rText.isEmpty()) break; for (iterator it = begin(); it != end(); ++it) { if ((*it).keyText() == rText) { (*it).addKeyName(key); goto continueloop; // break, then continue } } append(StrongsResult(rText, key)); } } }
const QString CEntryDisplay::textKeyRendering( const BtConstModuleList &modules, const QString &keyName, const DisplayOptions &displayOptions, const FilterOptions &filterOptions, CTextRendering::KeyTreeItem::Settings::KeyRenderingFace keyRendering, bool introdutions) { if (keyName.isEmpty()) return QString(""); CDisplayRendering render(displayOptions, filterOptions); //no highlighted key and no extra key link in the text CTextRendering::KeyTreeItem::Settings normal_settings(false, keyRendering); const 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 (introdutions && (module->type() == CSwordModuleInfo::Bible || module->type() == CSwordModuleInfo::Commentary)) { // HACK: enable headings for VerseKeys static_cast<sword::VerseKey *>(module->module()->getKey()) ->setIntros(true); CSwordVerseKey k1(module); k1.setIntros(true); k1.setKey(keyName); // don't print the key CTextRendering::KeyTreeItem::Settings preverse_settings(false, CTextRendering::KeyTreeItem::Settings::NoKey); if (k1.getVerse() == 1) { // X:1, prepend X:0 if (k1.getChapter() == 1) { // 1:1, also prepend 0:0 before that k1.setChapter(0); k1.setVerse(0); if ( k1.rawText().length() > 0 ) { tree.append( new Rendering::CTextRendering::KeyTreeItem(k1.key(), modules, preverse_settings) ); } k1.setChapter(1); } k1.setVerse(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) ); return render.renderKeyTree(tree); }
QString CDisplayRendering::finishText(const QString &text, const KeyTree &tree) { BtConstModuleList modules = collectModules(tree); //marking words is very slow, we have to find a better solution /* //mark all words by spans QString text = oldText; QRegExp re("(\\b)(?=\\w)"); //word begin marker int pos = text.find(re, 0); while (pos != -1) { //word begin found //qWarning("found word at %i in %i", pos, text.length()); int endPos = pos + 1; if (!util::tool::inHTMLTag(pos+1, text)) { //the re has a positive look ahead which matches one char before the word start //qWarning("matched %s", text.mid(pos+1, 4).latin1()); //find end of word and put a marker around it endPos = text.find(QRegExp("\\b|[,.:]"), pos+1); if ((endPos != -1) && !util::tool::inHTMLTag(endPos, text) && (endPos - pos >= 3)) { //reuire wordslonger than 3 chars text.insert(endPos, "</span>"); text.insert(pos, "<span class=\"word\">"); endPos += 26; } } pos = text.find(re, endPos); } */ const CLanguageMgr::Language* const lang = (modules.count() >= 1) ? modules.first()->language() : CLanguageMgr::instance()->defaultLanguage(); CDisplayTemplateMgr *tMgr = CDisplayTemplateMgr::instance(); //Q_ASSERT(modules.count() >= 1); CDisplayTemplateMgr::Settings settings; settings.modules = modules; if (modules.count() == 1 && lang->isValid()) settings.langAbbrev = lang->abbrev(); if (modules.count() == 1) settings.textDirection = modules.first()->textDirection(); return tMgr->fillTemplate(CDisplayTemplateMgr::activeTemplateName(), text, settings); }
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) ); } }