48 m_multiModuleHeaders(true) {
54 const QDir::Filters readableFileFilter(QDir::Files | QDir::Readable);
55 const QDir & td = DU::getDisplayTemplatesDir();
56 const QDir & utd = DU::getUserDisplayTemplatesDir();
60 const QStringList filter(QStringLiteral(
"*.tmpl"));
62 for (
auto const & file : td.entryList(filter, readableFileFilter))
65 for (
auto const & file : utd.entryList(filter, readableFileFilter))
70 errorMessage = QObject::tr(
"CSS base template not found!");
76 const QStringList cssfilter(QStringLiteral(
"*.css"));
78 for (
auto const & file : td.entryList(cssfilter, readableFileFilter))
81 for (
auto const & file : utd.entryList(cssfilter, readableFileFilter))
86 if (!
m_cssMap.contains(defaultTemplateName)) {
87 errorMessage = QObject::tr(
"Default template \"%1\" not found!")
88 .arg(defaultTemplateName);
100 errorMessage = QString();
104 const QString & content,
108 BT_ASSERT(name.endsWith(QStringLiteral(
".css"))
109 || name.endsWith(QStringLiteral(
".tmpl")));
110 BT_ASSERT(!name.endsWith(QStringLiteral(
".css"))
112 BT_ASSERT(!name.endsWith(QStringLiteral(
".tmpl"))
114 const bool templateIsCss = name.endsWith(QStringLiteral(
".css"));
116 QString displayTypeString;
123 if (settings.
modules.count()) {
124 switch (settings.
modules.first()->type()) {
127 displayTypeString = QStringLiteral(
"bible");
131 displayTypeString = QStringLiteral(
"book");
137 displayTypeString = QStringLiteral(
"singleentry");
140 moduleName = settings.
modules.first()->name();
143 displayTypeString = QStringLiteral(
"bible");
147 QString newContent = content;
148 const int moduleCount = settings.
modules.count();
155 for (
auto const *
const mi : settings.
modules)
157 QStringLiteral(
"<th style=\"width:%1%;\">%2</th>")
158 .arg(QString::number(
static_cast<int>(100.0 / moduleCount)),
161 newContent = QStringLiteral(
"<table><tr>%1</tr>%2</table>")
162 .arg(header, content);
169 QStringLiteral(
"#content{font-family:%1;font-size:%2pt;"
170 "font-weight:%3;font-style:%4}")
172 QString::number(f.pointSizeF(),
'f'),
174 ? QStringLiteral(
"bold")
175 : QStringLiteral(
"normal"),
177 ? QStringLiteral(
"italic")
178 : QStringLiteral(
"normal")));
181 auto const availableLanguages =
184 for (
auto const & lang : *availableLanguages) {
185 if (lang->abbrev().isEmpty())
190 const QFont & f = fp.second;
196 auto const fontWeight = 1.0 + (f.weight() * 999.0) / 99.0;
198 auto const fontStyleString =
200 switch ((
int) f.style()) {
201 case QFont::StyleItalic:
202 return QStringLiteral(
"italic");
203 case QFont::StyleOblique:
204 return QStringLiteral(
"oblique");
205 case QFont::StyleNormal:
207 return QStringLiteral(
"normal");
211 auto const textDecorationString =
214 ? QStringLiteral(
"underline line-through")
215 : QStringLiteral(
"underline"))
217 ? QStringLiteral(
"line-through")
218 : QStringLiteral(
"none"));
223 QStringLiteral(
"*[lang=%1]{font-family:%2;"
224 "font-size:%3pt;font-weight:%4;"
225 "font-style:%5;text-decoration:%6}")
228 QString::number(f.pointSizeF(),
'f'),
229 QString::number(fontWeight),
231 textDecorationString));
240 output.replace(QStringLiteral(
"#TITLE#"), settings.
title)
241 .replace(QStringLiteral(
"#LANG_ABBREV#"), settings.
langAbbrev)
242 .replace(QStringLiteral(
"#DISPLAYTYPE#"), displayTypeString)
243 .replace(QStringLiteral(
"#LANG_CSS#"), langCSS)
244 .replace(QStringLiteral(
"#PAGE_DIRECTION#"),
246 .replace(QStringLiteral(
"#CONTENT#"), newContent)
247 .replace(QStringLiteral(
"#BODY_CLASSES#"),
248 QStringLiteral(
"%1 %1_%2").arg(displayTypeString,
250 .replace(QStringLiteral(
"#DISPLAY_TEMPLATES_PATH#"),
251 DU::getDisplayTemplatesDir().absolutePath());
254 output.replace(QStringLiteral(
"#THEME_STYLE#"),
m_cssMap[name]);