20 #include "l10n_filesize.h"
22 #include "abstractlocalizer.h"
24 #include "exception.h"
31 L10nFileSizeNodeFactory::L10nFileSizeNodeFactory() {}
37 if (parts.isEmpty()) {
38 throw Exception(TagSyntaxError, QStringLiteral(
"Error: l10n_filesize requires at least the file size as first parameter"));
44 if (parts.size() > 1) {
49 if (parts.size() > 2) {
54 if (parts.size() > 3) {
61 L10nFileSizeVarNodeFactory::L10nFileSizeVarNodeFactory() {}
67 if (parts.size() < 2) {
68 throw Exception(TagSyntaxError, QStringLiteral(
"Error: l10n_filesize_var tag takes at least 2 arguments, the file size and the variable name"));
74 if (parts.size() > 2) {
79 if (parts.size() > 3) {
84 if (parts.size() > 4) {
88 auto resultName = parts.last();
98 :
Node(parent), m_size(size), m_unitSystem(unitSystem), m_precision(precision), m_multiplier(multiplier)
104 bool convertNumbers =
true;
107 if (m_size.
resolve(c).canConvert<qreal>()) {
108 size = m_size.
resolve(c).toReal(&convertNumbers);
112 if (!convertNumbers) {
113 qWarning(
"%s",
"Failed to convert input file size into a floating point number.");
117 int unitSystem = m_unitSystem.
isValid() ? m_unitSystem.
resolve(c).toInt(&convertNumbers) : 10;
118 if (!convertNumbers) {
119 qWarning(
"%s",
"Failed to convert unit system for file size into integer value. Using default decimal system as default.");
123 int precision = m_precision.
isValid() ? m_precision.
resolve(c).toInt(&convertNumbers) : 2;
124 if (!convertNumbers) {
125 qWarning(
"%s",
"Failed to convert decimal precision for file size into an integer value. Using default value 2.");
129 qreal multiplier = m_multiplier.
isValid() ? m_multiplier.
resolve(c).toReal(&convertNumbers) : 1.0f;
130 if (!convertNumbers) {
131 qWarning(
"%s",
"Failed to convert multiplier file size into a floating point number. Using default value 1.0.");
135 if (multiplier == 0.0f) {
136 qWarning(
"%s",
"It makes no sense to multiply the file size by zero. Using default value 1.0.");
140 const qreal sizeMult = size * multiplier;
142 if (unitSystem == 10) {
143 if ((sizeMult > -1000) && (sizeMult < 1000)) {
146 }
else if (unitSystem == 2) {
147 if ((sizeMult > - 1024) && (sizeMult < 1024)) {
154 #if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0))
155 if (sizeMult >
static_cast<qreal
>(std::numeric_limits<qint64>::min()) && sizeMult <
static_cast<qreal
>(std::numeric_limits<qint64>::max())) {
157 QLocale l(c->
localizer()->currentLocale());
158 QLocale::DataSizeFormats format = unitSystem == 10 ? QLocale::DataSizeSIFormat : QLocale::DataSizeIecFormat;
160 resultString = l.formattedDataSize(
static_cast<qint64
>(sizeMult), precision, format);
165 const std::pair<qreal,QString> fspair =
calcFileSize(size, unitSystem, multiplier);
167 if (precision == 2) {
168 resultString = c->
localizer()->localizeNumber(fspair.first) + QChar(QChar::Space) + fspair.second;
170 QLocale l(c->
localizer()->currentLocale());
171 resultString = l.toString(fspair.first,
'f', precision) + QChar(QChar::Space) + fspair.second;
174 #if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0))
185 const QString &resultName, QObject *parent)
186 :
Node(parent), m_size(size), m_unitSystem(unitSystem), m_precision(precision), m_multiplier(multiplier),
187 m_resultName(resultName)
194 bool convertNumbers =
true;
197 if (m_size.
resolve(c).canConvert<qreal>()) {
198 size = m_size.
resolve(c).toReal(&convertNumbers);
202 if (!convertNumbers) {
203 qWarning(
"%s",
"Failed to convert input file size into a floating point number.");
207 int unitSystem = m_unitSystem.
isValid() ? m_unitSystem.
resolve(c).toInt(&convertNumbers) : 10;
208 if (!convertNumbers) {
209 qWarning(
"%s",
"Failed to convert unit system for file size into integer value. Using default decimal system.");
213 int precision = m_precision.
isValid() ? m_precision.
resolve(c).toInt(&convertNumbers) : 2;
214 if (!convertNumbers) {
215 qWarning(
"%s",
"Failed to convert decimal precision for file size into an integer value. Using default value 2.");
219 qreal multiplier = m_multiplier.
isValid() ? m_multiplier.
resolve(c).toReal(&convertNumbers) : 1.0f;
220 if (!convertNumbers) {
221 qWarning(
"%s",
"Failed to convert multiplier file size into a floating point number. Using default value 1.0.");
225 if (multiplier == 0.0f) {
226 qWarning(
"%s",
"It makes no sense to mulitply the file size by zero. Using default value 1.0.");
230 const double sizeMult = size * multiplier;
232 if (unitSystem == 10) {
233 if ((sizeMult > -1000) && (sizeMult < 1000)) {
236 }
else if (unitSystem == 2) {
237 if ((sizeMult > - 1024) && (sizeMult < 1024)) {
244 #if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0))
245 if (sizeMult >
static_cast<qreal
>(std::numeric_limits<qint64>::min()) && sizeMult <
static_cast<qreal
>(std::numeric_limits<qint64>::max())) {
247 QLocale l(c->
localizer()->currentLocale());
248 QLocale::DataSizeFormats format = unitSystem == 10 ? QLocale::DataSizeSIFormat : QLocale::DataSizeIecFormat;
250 resultString = l.formattedDataSize(
static_cast<qint64
>(sizeMult), precision, format);
255 const std::pair<qreal,QString> fspair =
calcFileSize(size, unitSystem, multiplier);
257 if (precision == 2) {
258 resultString = c->
localizer()->localizeNumber(fspair.first) + QChar(QChar::Space) + fspair.second;
260 QLocale l(c->
localizer()->currentLocale());
261 resultString = l.toString(fspair.first,
'f', precision) + QChar(QChar::Space) + fspair.second;
264 #if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0))
268 c->
insert(m_resultName, resultString);
Q_INVOKABLE QStringList smartSplit(const QString &str) const
The Context class holds the context to render a Template with.
std::shared_ptr< AbstractLocalizer > localizer() const
void insert(const QString &name, QObject *object)
An exception for use when implementing template tags.
A FilterExpression object represents a filter expression in a template.
QVariant resolve(OutputStream *stream, Context *c) const
Base class for all nodes.
void streamValueInContext(OutputStream *stream, const QVariant &input, Cutelee::Context *c) const
The OutputStream class is used to render templates to a QTextStream.
The Parser class processes a string template into a tree of nodes.
const NestedString & get() const
Node * getNode(const QString &tagContent, Parser *p) const override
void render(OutputStream *stream, Context *c) const override
Node * getNode(const QString &tagContent, Parser *p) const override
void render(OutputStream *stream, Context *c) const override
std::pair< qreal, QString > calcFileSize(qreal size, int unitSystem=10, qreal multiplier=1.0)
Cutelee::SafeString getSafeString(const QVariant &input)
Utility functions used throughout Cutelee.