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();
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"));
118 if (displayTypeString.isEmpty()) {
119 if (settings.
modules.count()) {
120 switch (settings.
modules.first()->type()) {
123 displayTypeString = QStringLiteral(
"bible");
127 displayTypeString = QStringLiteral(
"book");
133 displayTypeString = QStringLiteral(
"singleentry");
136 moduleName = settings.
modules.first()->name();
139 displayTypeString = QStringLiteral(
"bible");
143 const int moduleCount = settings.
modules.count();
145 if (moduleCount >= 2) {
150 for (
auto const *
const mi : settings.
modules)
152 QStringLiteral(
"<th style=\"width:%1%;\">%2</th>")
153 .arg(QString::number(
static_cast<int>(100.0 / moduleCount)),
156 content = QStringLiteral(
"<table><tr>%1</tr>%2</table>")
157 .arg(header, content);
164 QStringLiteral(
"#content{font-family:%1;font-size:%2pt;"
165 "font-weight:%3;font-style:%4}")
167 QString::number(f.pointSizeF(),
'f'),
169 ? QStringLiteral(
"bold")
170 : QStringLiteral(
"normal"),
172 ? QStringLiteral(
"italic")
173 : QStringLiteral(
"normal")));
176 auto const availableLanguages =
179 for (
auto const & lang : *availableLanguages) {
180 if (lang->abbrev().isEmpty())
185 const QFont & f = fp.second;
191 using U = std::underlying_type_t<
decltype(f.weight())>;
192 auto const fontWeight =
193 1.0 + (
static_cast<U>(f.weight()) * 999.0) / 99.0;
195 auto const fontStyleString =
197 switch ((
int) f.style()) {
198 case QFont::StyleItalic:
199 return QStringLiteral(
"italic");
200 case QFont::StyleOblique:
201 return QStringLiteral(
"oblique");
202 case QFont::StyleNormal:
204 return QStringLiteral(
"normal");
208 auto const textDecorationString =
211 ? QStringLiteral(
"underline line-through")
212 : QStringLiteral(
"underline"))
214 ? QStringLiteral(
"line-through")
215 : QStringLiteral(
"none"));
220 QStringLiteral(
"*[lang=%1]{font-family:%2;"
221 "font-size:%3pt;font-weight:%4;"
222 "font-style:%5;text-decoration:%6}")
225 QString::number(f.pointSizeF(),
'f'),
226 QString::number(fontWeight),
228 textDecorationString));
234 auto output =
m_templateMap[templateIsCss ? cssTemplateBase : name];
235 output.replace(QStringLiteral(
"#TITLE#"), settings.
title)
236 .replace(QStringLiteral(
"#LANG_ABBREV#"), settings.
langAbbrev)
237 .replace(QStringLiteral(
"#DISPLAYTYPE#"), displayTypeString)
238 .replace(QStringLiteral(
"#LANG_CSS#"), langCSS)
239 .replace(QStringLiteral(
"#PAGE_DIRECTION#"),
241 ? QStringLiteral(
"ltr")
242 : QStringLiteral(
"rtl"))
243 .replace(QStringLiteral(
"#CONTENT#"), content)
244 .replace(QStringLiteral(
"#BODY_CLASSES#"),
245 QStringLiteral(
"%1 %1_%2").arg(displayTypeString,
247 .replace(QStringLiteral(
"#DISPLAY_TEMPLATES_PATH#"),
248 DU::getDisplayTemplatesDir().absolutePath());
251 output.replace(QStringLiteral(
"#THEME_STYLE#"),
m_cssMap[name]);