@@ -114,6 +114,12 @@ const TEST_STRINGS = {
114114 FILTER_OPERATOR_15 : `|{{ "abcabcabc" | replace("a", "b") }}|{{ "abcabcabc" | replace("a", "b", 1) }}|{{ "abcabcabc" | replace("a", "b", count=1) }}|` ,
115115 FILTER_OPERATOR_16 : `|{{ undefined | default("hello") }}|{{ false | default("hello") }}|{{ false | default("hello", true) }}|{{ 0 | default("hello", boolean=true) }}|` ,
116116 FILTER_OPERATOR_17 : `{{ [1, 2, 1, -1, 2] | unique | list | length }}` ,
117+ FILTER_OPERATOR_DICTSORT_1 : `{% for key, value in mydict | dictsort %}{{ key }}:{{ value }},{% endfor %}` ,
118+ FILTER_OPERATOR_DICTSORT_2 : `{% for key, value in mydict | dictsort(by='value') %}{{ key }}:{{ value }},{% endfor %}` ,
119+ FILTER_OPERATOR_DICTSORT_3 : `{% for key, value in mydict | dictsort(reverse=true) %}{{ key }}:{{ value }},{% endfor %}` ,
120+ FILTER_OPERATOR_DICTSORT_4 : `{% for key, value in casedict | dictsort %}{{ key }}:{{ value }},{% endfor %}` ,
121+ FILTER_OPERATOR_DICTSORT_5 : `{% for key, value in casedict | dictsort(case_sensitive=true) %}{{ key }}:{{ value }},{% endfor %}` ,
122+ FILTER_OPERATOR_DICTSORT_6 : `{% for key, value in numdict | dictsort(by='value', reverse=true) %}{{ key }}:{{ value }},{% endfor %}` ,
117123
118124 // Filter statements
119125 FILTER_STATEMENTS : `{% filter upper %}text{% endfilter %}` ,
@@ -2389,6 +2395,168 @@ const TEST_PARSED = {
23892395 { value : "length" , type : "Identifier" } ,
23902396 { value : "}}" , type : "CloseExpression" } ,
23912397 ] ,
2398+ FILTER_OPERATOR_DICTSORT_1 : [
2399+ { value : "{%" , type : "OpenStatement" } ,
2400+ { value : "for" , type : "Identifier" } ,
2401+ { value : "key" , type : "Identifier" } ,
2402+ { value : "," , type : "Comma" } ,
2403+ { value : "value" , type : "Identifier" } ,
2404+ { value : "in" , type : "Identifier" } ,
2405+ { value : "mydict" , type : "Identifier" } ,
2406+ { value : "|" , type : "Pipe" } ,
2407+ { value : "dictsort" , type : "Identifier" } ,
2408+ { value : "%}" , type : "CloseStatement" } ,
2409+ { value : "{{" , type : "OpenExpression" } ,
2410+ { value : "key" , type : "Identifier" } ,
2411+ { value : "}}" , type : "CloseExpression" } ,
2412+ { value : ":" , type : "Text" } ,
2413+ { value : "{{" , type : "OpenExpression" } ,
2414+ { value : "value" , type : "Identifier" } ,
2415+ { value : "}}" , type : "CloseExpression" } ,
2416+ { value : "," , type : "Text" } ,
2417+ { value : "{%" , type : "OpenStatement" } ,
2418+ { value : "endfor" , type : "Identifier" } ,
2419+ { value : "%}" , type : "CloseStatement" } ,
2420+ ] ,
2421+ FILTER_OPERATOR_DICTSORT_2 : [
2422+ { value : "{%" , type : "OpenStatement" } ,
2423+ { value : "for" , type : "Identifier" } ,
2424+ { value : "key" , type : "Identifier" } ,
2425+ { value : "," , type : "Comma" } ,
2426+ { value : "value" , type : "Identifier" } ,
2427+ { value : "in" , type : "Identifier" } ,
2428+ { value : "mydict" , type : "Identifier" } ,
2429+ { value : "|" , type : "Pipe" } ,
2430+ { value : "dictsort" , type : "Identifier" } ,
2431+ { value : "(" , type : "OpenParen" } ,
2432+ { value : "by" , type : "Identifier" } ,
2433+ { value : "=" , type : "Equals" } ,
2434+ { value : "value" , type : "StringLiteral" } ,
2435+ { value : ")" , type : "CloseParen" } ,
2436+ { value : "%}" , type : "CloseStatement" } ,
2437+ { value : "{{" , type : "OpenExpression" } ,
2438+ { value : "key" , type : "Identifier" } ,
2439+ { value : "}}" , type : "CloseExpression" } ,
2440+ { value : ":" , type : "Text" } ,
2441+ { value : "{{" , type : "OpenExpression" } ,
2442+ { value : "value" , type : "Identifier" } ,
2443+ { value : "}}" , type : "CloseExpression" } ,
2444+ { value : "," , type : "Text" } ,
2445+ { value : "{%" , type : "OpenStatement" } ,
2446+ { value : "endfor" , type : "Identifier" } ,
2447+ { value : "%}" , type : "CloseStatement" } ,
2448+ ] ,
2449+ FILTER_OPERATOR_DICTSORT_3 : [
2450+ { value : "{%" , type : "OpenStatement" } ,
2451+ { value : "for" , type : "Identifier" } ,
2452+ { value : "key" , type : "Identifier" } ,
2453+ { value : "," , type : "Comma" } ,
2454+ { value : "value" , type : "Identifier" } ,
2455+ { value : "in" , type : "Identifier" } ,
2456+ { value : "mydict" , type : "Identifier" } ,
2457+ { value : "|" , type : "Pipe" } ,
2458+ { value : "dictsort" , type : "Identifier" } ,
2459+ { value : "(" , type : "OpenParen" } ,
2460+ { value : "reverse" , type : "Identifier" } ,
2461+ { value : "=" , type : "Equals" } ,
2462+ { value : "true" , type : "Identifier" } ,
2463+ { value : ")" , type : "CloseParen" } ,
2464+ { value : "%}" , type : "CloseStatement" } ,
2465+ { value : "{{" , type : "OpenExpression" } ,
2466+ { value : "key" , type : "Identifier" } ,
2467+ { value : "}}" , type : "CloseExpression" } ,
2468+ { value : ":" , type : "Text" } ,
2469+ { value : "{{" , type : "OpenExpression" } ,
2470+ { value : "value" , type : "Identifier" } ,
2471+ { value : "}}" , type : "CloseExpression" } ,
2472+ { value : "," , type : "Text" } ,
2473+ { value : "{%" , type : "OpenStatement" } ,
2474+ { value : "endfor" , type : "Identifier" } ,
2475+ { value : "%}" , type : "CloseStatement" } ,
2476+ ] ,
2477+ FILTER_OPERATOR_DICTSORT_4 : [
2478+ { value : "{%" , type : "OpenStatement" } ,
2479+ { value : "for" , type : "Identifier" } ,
2480+ { value : "key" , type : "Identifier" } ,
2481+ { value : "," , type : "Comma" } ,
2482+ { value : "value" , type : "Identifier" } ,
2483+ { value : "in" , type : "Identifier" } ,
2484+ { value : "casedict" , type : "Identifier" } ,
2485+ { value : "|" , type : "Pipe" } ,
2486+ { value : "dictsort" , type : "Identifier" } ,
2487+ { value : "%}" , type : "CloseStatement" } ,
2488+ { value : "{{" , type : "OpenExpression" } ,
2489+ { value : "key" , type : "Identifier" } ,
2490+ { value : "}}" , type : "CloseExpression" } ,
2491+ { value : ":" , type : "Text" } ,
2492+ { value : "{{" , type : "OpenExpression" } ,
2493+ { value : "value" , type : "Identifier" } ,
2494+ { value : "}}" , type : "CloseExpression" } ,
2495+ { value : "," , type : "Text" } ,
2496+ { value : "{%" , type : "OpenStatement" } ,
2497+ { value : "endfor" , type : "Identifier" } ,
2498+ { value : "%}" , type : "CloseStatement" } ,
2499+ ] ,
2500+ FILTER_OPERATOR_DICTSORT_5 : [
2501+ { value : "{%" , type : "OpenStatement" } ,
2502+ { value : "for" , type : "Identifier" } ,
2503+ { value : "key" , type : "Identifier" } ,
2504+ { value : "," , type : "Comma" } ,
2505+ { value : "value" , type : "Identifier" } ,
2506+ { value : "in" , type : "Identifier" } ,
2507+ { value : "casedict" , type : "Identifier" } ,
2508+ { value : "|" , type : "Pipe" } ,
2509+ { value : "dictsort" , type : "Identifier" } ,
2510+ { value : "(" , type : "OpenParen" } ,
2511+ { value : "case_sensitive" , type : "Identifier" } ,
2512+ { value : "=" , type : "Equals" } ,
2513+ { value : "true" , type : "Identifier" } ,
2514+ { value : ")" , type : "CloseParen" } ,
2515+ { value : "%}" , type : "CloseStatement" } ,
2516+ { value : "{{" , type : "OpenExpression" } ,
2517+ { value : "key" , type : "Identifier" } ,
2518+ { value : "}}" , type : "CloseExpression" } ,
2519+ { value : ":" , type : "Text" } ,
2520+ { value : "{{" , type : "OpenExpression" } ,
2521+ { value : "value" , type : "Identifier" } ,
2522+ { value : "}}" , type : "CloseExpression" } ,
2523+ { value : "," , type : "Text" } ,
2524+ { value : "{%" , type : "OpenStatement" } ,
2525+ { value : "endfor" , type : "Identifier" } ,
2526+ { value : "%}" , type : "CloseStatement" } ,
2527+ ] ,
2528+ FILTER_OPERATOR_DICTSORT_6 : [
2529+ { value : "{%" , type : "OpenStatement" } ,
2530+ { value : "for" , type : "Identifier" } ,
2531+ { value : "key" , type : "Identifier" } ,
2532+ { value : "," , type : "Comma" } ,
2533+ { value : "value" , type : "Identifier" } ,
2534+ { value : "in" , type : "Identifier" } ,
2535+ { value : "numdict" , type : "Identifier" } ,
2536+ { value : "|" , type : "Pipe" } ,
2537+ { value : "dictsort" , type : "Identifier" } ,
2538+ { value : "(" , type : "OpenParen" } ,
2539+ { value : "by" , type : "Identifier" } ,
2540+ { value : "=" , type : "Equals" } ,
2541+ { value : "value" , type : "StringLiteral" } ,
2542+ { value : "," , type : "Comma" } ,
2543+ { value : "reverse" , type : "Identifier" } ,
2544+ { value : "=" , type : "Equals" } ,
2545+ { value : "true" , type : "Identifier" } ,
2546+ { value : ")" , type : "CloseParen" } ,
2547+ { value : "%}" , type : "CloseStatement" } ,
2548+ { value : "{{" , type : "OpenExpression" } ,
2549+ { value : "key" , type : "Identifier" } ,
2550+ { value : "}}" , type : "CloseExpression" } ,
2551+ { value : ":" , type : "Text" } ,
2552+ { value : "{{" , type : "OpenExpression" } ,
2553+ { value : "value" , type : "Identifier" } ,
2554+ { value : "}}" , type : "CloseExpression" } ,
2555+ { value : "," , type : "Text" } ,
2556+ { value : "{%" , type : "OpenStatement" } ,
2557+ { value : "endfor" , type : "Identifier" } ,
2558+ { value : "%}" , type : "CloseStatement" } ,
2559+ ] ,
23922560
23932561 // Filter statements
23942562 FILTER_STATEMENTS : [
@@ -4020,6 +4188,24 @@ const TEST_CONTEXT = {
40204188 FILTER_OPERATOR_15 : { } ,
40214189 FILTER_OPERATOR_16 : { } ,
40224190 FILTER_OPERATOR_17 : { } ,
4191+ FILTER_OPERATOR_DICTSORT_1 : {
4192+ mydict : { c : 3 , a : 1 , b : 2 } ,
4193+ } ,
4194+ FILTER_OPERATOR_DICTSORT_2 : {
4195+ mydict : { c : 3 , a : 1 , b : 2 } ,
4196+ } ,
4197+ FILTER_OPERATOR_DICTSORT_3 : {
4198+ mydict : { c : 3 , a : 1 , b : 2 } ,
4199+ } ,
4200+ FILTER_OPERATOR_DICTSORT_4 : {
4201+ casedict : { B : 2 , a : 1 , C : 3 } ,
4202+ } ,
4203+ FILTER_OPERATOR_DICTSORT_5 : {
4204+ casedict : { B : 2 , a : 1 , C : 3 } ,
4205+ } ,
4206+ FILTER_OPERATOR_DICTSORT_6 : {
4207+ numdict : { apple : 5 , banana : 2 , cherry : 8 } ,
4208+ } ,
40234209
40244210 // Filter statements
40254211 FILTER_STATEMENTS : { } ,
@@ -4236,6 +4422,12 @@ const EXPECTED_OUTPUTS = {
42364422 FILTER_OPERATOR_15 : `|bbcbbcbbc|bbcabcabc|bbcabcabc|` ,
42374423 FILTER_OPERATOR_16 : `|hello|false|hello|hello|` ,
42384424 FILTER_OPERATOR_17 : `3` ,
4425+ FILTER_OPERATOR_DICTSORT_1 : `a:1,b:2,c:3,` ,
4426+ FILTER_OPERATOR_DICTSORT_2 : `a:1,b:2,c:3,` ,
4427+ FILTER_OPERATOR_DICTSORT_3 : `c:3,b:2,a:1,` ,
4428+ FILTER_OPERATOR_DICTSORT_4 : `a:1,B:2,C:3,` ,
4429+ FILTER_OPERATOR_DICTSORT_5 : `B:2,C:3,a:1,` ,
4430+ FILTER_OPERATOR_DICTSORT_6 : `cherry:8,apple:5,banana:2,` ,
42394431
42404432 // Filter statements
42414433 FILTER_STATEMENTS : `TEXT` ,
0 commit comments