@@ -172,7 +172,7 @@ class MarkCaseNode : public MarkNode {
172172 ptr<MarkNode> other;
173173public:
174174 MarkCaseNode (const std::string_view& s) :MarkNode(s), field(s.substr(0 ,s.find(' ?' ))) {
175- auto paras{ splitPairs (string ( s.substr (s.find (' ?' ) + 1 ) ),' =' ,' &' ) };
175+ auto paras{ splitPairs (s.substr (s.find (' ?' ) + 1 ),' =' ,' &' ) };
176176 for (auto & [key, val] : paras) {
177177 if (key == " else" )other = buildFormatter (val);
178178 else cases[key] = buildFormatter (val);
@@ -191,8 +191,9 @@ class MarkGradeNode : public MarkNode {
191191 grad_map<double , ptr<MarkNode>> grades;
192192public:
193193 MarkGradeNode (const std::string_view& s) :MarkNode(s), field(s.substr(0 , s.find(' ?' ))) {
194- auto paras{ splitPairs (string ( s.substr (s.find (' ?' ) + 1 ) ),' =' ,' &' ) };
194+ auto paras{ splitPairs (s.substr (s.find (' ?' ) + 1 ),' =' ,' &' ) };
195195 for (auto & [key, val] : paras) {
196+ DD::debugLog (" split=" + val);
196197 if (key == " else" )grades.set_else (buildFormatter (val));
197198 else if (isNumeric (key))grades.set_step (stod (key), buildFormatter (val));
198199 }
@@ -224,9 +225,27 @@ class MarkPyNode : public MarkNode {
224225 return {};
225226 }
226227};
228+ class MarkLenNode : public MarkNode {
229+ MarkReference field;
230+ public:
231+ MarkLenNode (const std::string_view& s) :MarkNode(s), field(s) {}
232+ AttrVar format (const AttrObject& context, bool isTrust = true , const dict_ci<string>& global = {})const override {
233+ auto res{ field.concat (context, isTrust, global) };
234+ return (long long )res.len ();
235+ }
236+ };
237+ class MarkExpiredNode : public MarkNode {
238+ MarkReference field;
239+ public:
240+ MarkExpiredNode (const std::string_view& s) :MarkNode(s), field(s) {}
241+ AttrVar format (const AttrObject& context, bool isTrust = true , const dict_ci<string>& global = {})const override {
242+ auto res{ field.concat (context, isTrust, global)};
243+ return !res.is_numberic () || res.to_int () < time (nullptr );
244+ }
245+ };
227246
228- static enumap<string> methods{ " var" ," print" ," help" ," sample" ," case" ," vary" ," grade" ," at" ," ran" ," wait" ," js" ," py" ," len" };
229- enum class FmtMethod { Var, Print, Help, Sample, Case, Vary, Grade, At, Ran, Wait, JS, Py, Len };
247+ static enumap<string> methods{ " var" ," print" ," help" ," sample" ," case" ," vary" ," grade" ," at" ," ran" ," wait" ," js" ," py" ," len" , " expired " };
248+ enum class FmtMethod { Var, Print, Help, Sample, Case, Vary, Grade, At, Ran, Wait, JS, Py, Len, Expired };
230249// Formatter
231250static size_t find_close_brace (const std::string_view& s, size_t pos) {
232251 int diff = 1 ;
@@ -332,6 +351,16 @@ ptr<MarkNode> buildFormatter(const std::string_view& exp) {
332351 cur = &(*cur)->next ;
333352 continue ;
334353 }
354+ else if (method == " len" ) {
355+ *cur = std::static_pointer_cast<MarkNode>(std::make_shared<MarkLenNode>(para));
356+ cur = &(*cur)->next ;
357+ continue ;
358+ }
359+ else if (method == " expired" ) {
360+ *cur = std::static_pointer_cast<MarkNode>(std::make_shared<MarkExpiredNode>(para));
361+ cur = &(*cur)->next ;
362+ continue ;
363+ }
335364 }
336365 if (auto func = strFuncs.find (string (field)); func != strFuncs.end ()) {
337366 *cur = std::make_shared<MarkGlobalIndexNode>(field);
0 commit comments