1 /*********
2 *
3 * This file is part of BibleTime's source code, http://www.bibletime.info/.
4 *
5 * Copyright 1999-2016 by the BibleTime developers.
6 * The BibleTime source code is licensed under the GNU General Public License version 2.0.
7 *
8 **********/
9 
10 #include "btprinter.h"
11 #include "bibletime.h"
12 #include <QPrintDialog>
13 #include <QPrinter>
14 #include <QTextEdit>
15 #include "../util/btassert.h"
16 #include "backend/config/btconfig.h"
17 #include "backend/keys/cswordversekey.h"
18 #include "backend/managers/cdisplaytemplatemgr.h"
19 
20 
21 namespace {
22 
mangleFilterOptions(FilterOptions fo)23 inline FilterOptions mangleFilterOptions(FilterOptions fo) {
24     fo.footnotes = false;
25     fo.scriptureReferences = false;
26     fo.strongNumbers = false;
27     fo.morphTags = false;
28     fo.headings = false;
29     return fo;
30 }
31 
32 } // anonymous namespace
33 
BtPrinter(DisplayOptions const & displayOptions,FilterOptions const & filterOptions,QObject * const parent)34 BtPrinter::BtPrinter(DisplayOptions const & displayOptions,
35                      FilterOptions const & filterOptions,
36                      QObject * const parent)
37         : QObject{parent}
38         , CDisplayRendering{displayOptions, mangleFilterOptions(filterOptions)}
39 {}
40 
printKeyTree(KeyTree const & tree)41 void BtPrinter::printKeyTree(KeyTree const & tree) {
42     QTextEdit htmlPage;
43     htmlPage.setHtml(renderKeyTree(tree));
44 
45     QPrinter printer;
46     QPrintDialog printDialog(&printer);
47     if (printDialog.exec() == QDialog::Accepted)
48         htmlPage.print(&printer);
49 }
50 
entryLink(KeyTreeItem const & item,CSwordModuleInfo const * module)51 QString BtPrinter::entryLink(KeyTreeItem const & item,
52                              CSwordModuleInfo const * module)
53 {
54     BT_ASSERT(module);
55     if (module->type() != CSwordModuleInfo::Bible)
56         return item.key();
57 
58     CSwordVerseKey vk(module);
59     vk.setKey(item.key());
60     switch (item.settings().keyRenderingFace) {
61         case KeyTreeItem::Settings::CompleteShort:
62             return QString::fromUtf8(vk.getShortText());
63 
64         case KeyTreeItem::Settings::CompleteLong:
65             return vk.key();
66 
67         case KeyTreeItem::Settings::NoKey:
68             return QString::null;
69 
70         case KeyTreeItem::Settings::SimpleKey: // fall through:
71         default:
72             return QString::number(vk.getVerse());
73     }
74 }
75 
renderEntry(KeyTreeItem const & i,CSwordKey * key)76 QString BtPrinter::renderEntry(KeyTreeItem const & i, CSwordKey * key) {
77     Q_UNUSED(key);
78     BT_ASSERT(dynamic_cast<BtPrinter::KeyTreeItem const *>(&i));
79     BtPrinter::KeyTreeItem const * const printItem =
80             static_cast<BtPrinter::KeyTreeItem const *>(&i);
81 
82     if (printItem->hasAlternativeContent()) {
83         QString ret =
84                 QString::fromLatin1("<div class=\"entry\"><div class=\""
85                                     "rangeheading\">%1</div>").arg(
86                                             printItem->getAlternativeContent());
87         if (!i.childList()->isEmpty())
88             Q_FOREACH (const KeyTreeItem * const c, *i.childList())
89                 ret.append(CDisplayRendering::renderEntry(*c));
90         ret.append("</div>");
91         return ret;
92     }
93     return CDisplayRendering::renderEntry(i);
94 }
95 
finishText(QString const & text,KeyTree const & tree)96 QString BtPrinter::finishText(QString const & text, KeyTree const & tree) {
97     BtConstModuleList const modules = collectModules(tree);
98     BT_ASSERT(!modules.empty());
99 
100     CLanguageMgr::Language const * const lang = modules.first()->language();
101     BT_ASSERT(lang);
102 
103     CDisplayTemplateMgr::Settings settings;
104     //settings.modules = modules;
105     settings.pageCSS_ID = "printer";
106     if (modules.count() == 1 && lang->isValid())
107         settings.langAbbrev = lang->abbrev();
108 
109     if (modules.count() == 1)
110         settings.textDirection = modules.first()->textDirection();
111 
112     return CDisplayTemplateMgr::instance()->fillTemplate(
113                 CDisplayTemplateMgr::activeTemplateName(),
114                 text,
115                 settings);
116 }
117