8000 Start implementing conversion filters · jinja2cpp/Jinja2Cpp@eac97f1 · GitHub
[go: up one dir, main page]

Skip to content

Commit eac97f1

Browse files
committed
Start implementing conversion filters
1 parent 6fb1ef5 commit eac97f1

File tree

2 files changed

+103
-12
lines changed

2 files changed

+103
-12
lines changed

src/filters.cpp

Lines changed: 98 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
#include <algorithm>
77
#include <numeric>
88
#include <sstream>
9+
#include <string>
10+
11+
using namespace std::string_literals;
912

1013
namespace jinja2
1114
{
@@ -26,6 +29,7 @@ struct FilterFactory
2629
};
2730

2831
std::unordered_map<std::string, ExpressionFilter::FilterFactoryFn> s_filters = {
32+
{"abs", FilterFactory<filters::ValueConverter>::MakeCreator(filters::ValueConverter::AbsMode)},
2933
{"attr", &FilterFactory<filters::Attribute>::Create},
3034
{"batch", FilterFactory<filters::Slice>::MakeCreator(filters::Slice::BatchMode)},
3135
{"camelize", FilterFactory<filters::StringConverter>::MakeCreator(filters::StringConverter::CamelMode)},
@@ -177,7 +181,7 @@ InternalValue Attribute::Filter(const InternalValue& baseVal, RenderContext& con
177181

178182
Default::Default(FilterParams params)
179183
{
180-
ParseParams({{"default_value", false, InternalValue(std::string(""))}, {"boolean", false, InternalValue(false)}}, params);
184+
ParseParams({{"default_value", false, InternalValue(""s)}, {"boolean", false, InternalValue(false)}}, params);
181185
}
182186

183187
InternalValue Default::Filter(const InternalValue& baseVal, Re 10000 nderContext& context)
@@ -196,7 +200,7 @@ InternalValue Default::Filter(const InternalValue& baseVal, RenderContext& conte
196200

197201
DictSort::DictSort(FilterParams params)
198202
{
199-
ParseParams({{"case_sensitive", false}, {"by", false, std::string("key")}, {"reverse", false}}, params);
203+
ParseParams({{"case_sensitive", false}, {"by", false, "key"s}, {"reverse", false}}, params);
200204
}
201205

202206
InternalValue DictSort::Filter(const InternalValue& baseVal, RenderContext& context)
@@ -205,9 +209,9 @@ InternalValue DictSort::Filter(const InternalValue& baseVal, RenderContext& cont
205209
if (map == nullptr)
206210
return InternalValue();
207211

208-
InternalValue isReverseVal = GetArgumentValue("reverse", context, InternalValue(false));
209-
InternalValue isCsVal = GetArgumentValue("case_sensitive", context, InternalValue(false));
210-
InternalValue byVal = GetArgumentValue("by", context, InternalValue(std::string("key")));
212+
InternalValue isReverseVal = GetArgumentValue("reverse", context);
213+
InternalValue isCsVal = GetArgumentValue("case_sensitive", context);
214+
InternalValue byVal = GetArgumentValue("by", context);
211215

212216
bool (*comparator)(const KeyValuePair& left, const KeyValuePair& right);
213217

@@ -284,7 +288,7 @@ Map::Map(FilterParams params)
284288
if (params.kwParams.size() == 1 && params.posParams.empty() && params.kwParams.count("attribute") == 1)
285289
{
286290
newParams.kwParams["name"] = params.kwParams["attribute"];
287-
newParams.kwParams["filter"] = std::make_shared<ConstantExpression>(std::string("attr"));
291+
newParams.kwParams["filter"] = std::make_shared<ConstantExpression>("attr"s);
288292
}
289293
else
290294
{
@@ -382,22 +386,22 @@ struct PrettyPrinter : visitors::BaseVisitor<InternalValue>
382386

383387
InternalValue operator()(const std::string& str) const
384388
{
385-
return "'" + str + "'";
389+
return "'"s + str + "'"s;
386390
}
387391

388392
InternalValue operator()(const std::wstring& str) const
389393
{
390-
return std::string("'<wchar_string>'");
394+
return "'<wchar_string>'"s;
391395
}
392396

393397
InternalValue operator()(bool val) const
394398
{
395-
return std::string(val ? "true" : "false");
399+
return val ? "true"s : "false"s;
396400
}
397401

398402
InternalValue operator()(EmptyValue val) const
399403
{
400-
return std::string("none");
404+
return "none"s;
401405
}
402406

403407
InternalValue operator()(double val) const
@@ -703,10 +707,94 @@ InternalValue Tester::Filter(const InternalValue& baseVal, RenderContext& contex
703707
}
704708

705709
ValueConverter::ValueConverter(FilterParams params, ValueConverter::Mode mode)
710+
: m_mode(mode)
706711
{
712+
switch (mode)
713+
{
714+
case ToFloatMode:
715+
ParseParams({{"default", false}}, params);
716+
break;
717+
case ToIntMode:
718+
ParseParams({{"default", false}, {"base", false, 10ll}}, params);
719+
break;
720+
case ToListMode:
721+
case AbsMode:
722+
break;
723+
case RoundMode:
724+
ParseParams({{"precision", false}, {"method", false, "common"s}}, params);
725+
break;
707726

727+
}
708728
}
709729

730+
struct ConverterParams
731+
{
732+
ValueConverter::Mode mode;
733+
InternalValue defValule;
734+
InternalValue base;
735+
InternalValue prec;
736+
InternalValue roundMethod;
737+
};
738+
739+
struct ValueConverterImpl : visitors::BaseVisitor<>
740+
{
741+
using BaseVisitor::operator();
742+
743+
ValueConverterImpl(ConverterParams params)
744+
: m_params(std::move(params))
745+
{
746+
}
747+
748+
InternalValue operator()(int64_t val) const
749+
{
750+
InternalValue result;
751+
switch (m_params.mode)
752+
{
753+
case ValueConverter::ToFloatMode:
754+
result = InternalValue(static_cast<double>(val));
755+
break;
756+
case ValueConverter::AbsMode:
757+
result = InternalValue(abs(val));
758+
break;
759+
case ValueConverter::ToIntMode:
760+
case ValueConverter::RoundMode:
761+
result = val;
762+
break;
763+
default:
764+
break;
765+
}
766+
767+
return result;
768+
}
769+
770+
InternalValue operator()(double val) const
771+
{
772+
InternalValue result;
773+
switch (m_params.mode)
774+
{
775+
case ValueConverter::ToFloatMode:
776+
result = val;
777+
break;
778+
case ValueConverter::ToIntMode:
779+
result = static_cast<int64_t>(val);
780+
break;
781+
case ValueConverter::AbsMode:
782+
result = InternalValue(fabs(val));
783+
break;
784+
case ValueConverter::RoundMode:
785+
{
786+
auto method = AsString(m_params.roundMethod);
787+
// if (method == 'ceil')
788+
break;
789+
}
790+
default:
791+
break;
792+
}
793+
}
794+
795+
ConverterParams m_params;
796+
};
797+
710798
InternalValue ValueConverter::Filter(const InternalValue& baseVal, RenderContext& context)
711799
{
712800
return InternalValue();

src/filters.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ class StringConverter : public FilterBase
179179
StringConverter(FilterParams params, Mode mode);
180180

181181
InternalValue Filter(const InternalValue& baseVal, RenderContext& context);
182-
182+
183183
private:
184184
Mode m_mode;
185185
};
@@ -226,13 +226,16 @@ class ValueConverter : public FilterBase
226226
ToFloatMode,
227227
ToIntMode,
228228
ToListMode,
229+
AbsMode,
229230
RoundMode,
230-
231231
};
232232

233233
ValueConverter(FilterParams params, Mode mode);
234234

235235
InternalValue Filter(const InternalValue& baseVal, RenderContext& context);
236+
237+
private:
238+
Mode m_mode;
236239
};
237240
} // filters
238241
} // jinja2

0 commit comments

Comments
 (0)
0