binja 0.4.6 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -30,7 +30,7 @@
30
30
  | Django DTL Compatible | ✅ 100% | ❌ Partial |
31
31
  | Jinja2 Compatible | ✅ Full | ⚠️ Limited |
32
32
  | Template Inheritance | ✅ | ⚠️ |
33
- | 70+ Built-in Filters | ✅ | ❌ |
33
+ | 80+ Built-in Filters | ✅ | ❌ |
34
34
  | 28 Built-in Tests | ✅ | ❌ |
35
35
  | Debug Panel | ✅ | ❌ |
36
36
  | CLI Tool | ✅ | ⚠️ |
@@ -260,6 +260,8 @@ app.get('/user/:id', ({ params }) => templates.user({ id: params.id }))
260
260
  | `ljust` | `{{ "hi"\|ljust:10 }}` | `hi ` |
261
261
  | `rjust` | `{{ "hi"\|rjust:10 }}` | ` hi` |
262
262
  | `cut` | `{{ "hello"\|cut:"l" }}` | `heo` |
263
+ | `addslashes` | `{{ "it's"\|addslashes }}` | `it\'s` |
264
+ | `stringformat` | `{{ 5\|stringformat:"03d" }}` | `005` |
263
265
 
264
266
  ### Number Filters
265
267
 
@@ -270,6 +272,8 @@ app.get('/user/:id', ({ params }) => templates.user({ id: params.id }))
270
272
  | `floatformat` | `{{ 3.14159\|floatformat:2 }}` | `3.14` |
271
273
  | `filesizeformat` | `{{ 1048576\|filesizeformat }}` | `1.0 MB` |
272
274
  | `divisibleby` | `{{ 10\|divisibleby:2 }}` | `true` |
275
+ | `get_digit` | `{{ 12345\|get_digit:2 }}` | `4` |
276
+ | `widthratio` | `{% widthratio value max 100 %}` | Calculated ratio |
273
277
 
274
278
  ### List Filters
275
279
 
@@ -324,7 +328,12 @@ Common timezone values: `UTC`, `Europe/London`, `Europe/Rome`, `Europe/Paris`, `
324
328
  | `escape` | `{{ html\|escape }}` | HTML escape |
325
329
  | `safe` | `{{ html\|safe }}` | Mark as safe (no escape) |
326
330
  | `urlencode` | `{{ url\|urlencode }}` | URL encode |
331
+ | `iriencode` | `{{ url\|iriencode }}` | IRI encode (unicode-safe) |
327
332
  | `json` | `{{ data\|json }}` | JSON stringify |
333
+ | `json_script` | `{{ data\|json_script:"id" }}` | Safe JSON in script tag |
334
+ | `truncatechars_html` | `{{ html\|truncatechars_html:10 }}` | Truncate preserving HTML |
335
+ | `truncatewords_html` | `{{ html\|truncatewords_html:5 }}` | Truncate words in HTML |
336
+ | `urlizetrunc` | `{{ text\|urlizetrunc:15 }}` | URLs with truncated display |
328
337
 
329
338
  ### Default Values
330
339
 
@@ -389,13 +398,28 @@ binja is designed to be a drop-in replacement for Django templates:
389
398
  {% url 'home' %}
390
399
  {% static 'css/style.css' %}
391
400
 
392
- {% csrf_token %} {# Returns empty for JS compatibility #}
401
+ {% csrf_token %}
393
402
 
394
403
  {{ forloop.counter }}
395
404
  {{ forloop.first }}
396
405
  {{ forloop.parentloop.counter }}
397
406
  ```
398
407
 
408
+ ### Django-Specific Tags
409
+
410
+ | Tag | Description | Example |
411
+ |-----|-------------|---------|
412
+ | `{% csrf_token %}` | CSRF token input | `<input type="hidden" ...>` |
413
+ | `{% cycle %}` | Cycle through values | `{% cycle 'odd' 'even' %}` |
414
+ | `{% firstof %}` | First truthy value | `{% firstof var1 var2 "default" %}` |
415
+ | `{% ifchanged %}` | Output on change | `{% ifchanged %}{{ item }}{% endifchanged %}` |
416
+ | `{% ifequal %}` | Equality check | `{% ifequal a b %}equal{% endifequal %}` |
417
+ | `{% lorem %}` | Lorem ipsum text | `{% lorem 3 p %}` |
418
+ | `{% regroup %}` | Group list by attr | `{% regroup list by attr as grouped %}` |
419
+ | `{% templatetag %}` | Literal tag chars | `{% templatetag openblock %}` → `{%` |
420
+ | `{% widthratio %}` | Calculate ratio | `{% widthratio value max 100 %}` |
421
+ | `{% debug %}` | Debug context | Outputs context as JSON |
422
+
399
423
  ---
400
424
 
401
425
  ## Configuration
package/dist/cli.js CHANGED
@@ -624,6 +624,28 @@ class Parser {
624
624
  case "autoescape":
625
625
  case "verbatim":
626
626
  return this.parseSimpleBlock(start, tagName.value);
627
+ case "cycle":
628
+ return this.parseCycle(start);
629
+ case "firstof":
630
+ return this.parseFirstof(start);
631
+ case "ifchanged":
632
+ return this.parseIfchanged(start);
633
+ case "regroup":
634
+ return this.parseRegroup(start);
635
+ case "widthratio":
636
+ return this.parseWidthratio(start);
637
+ case "lorem":
638
+ return this.parseLorem(start);
639
+ case "csrf_token":
640
+ return this.parseCsrfToken(start);
641
+ case "debug":
642
+ return this.parseDebug(start);
643
+ case "templatetag":
644
+ return this.parseTemplatetag(start);
645
+ case "ifequal":
646
+ return this.parseIfequal(start, false);
647
+ case "ifnotequal":
648
+ return this.parseIfequal(start, true);
627
649
  default:
628
650
  this.skipToBlockEnd();
629
651
  return null;
@@ -927,7 +949,7 @@ class Parser {
927
949
  column: start.column
928
950
  };
929
951
  }
930
- parseComment(start) {
952
+ parseComment(_start) {
931
953
  this.expect("BLOCK_END" /* BLOCK_END */);
932
954
  while (!this.isAtEnd()) {
933
955
  if (this.checkBlockTag("endcomment"))
@@ -937,7 +959,7 @@ class Parser {
937
959
  this.expectBlockTag("endcomment");
938
960
  return null;
939
961
  }
940
- parseSimpleBlock(start, tagName) {
962
+ parseSimpleBlock(_start, tagName) {
941
963
  this.skipToBlockEnd();
942
964
  const endTag = `end${tagName}`;
943
965
  while (!this.isAtEnd()) {
@@ -952,6 +974,236 @@ class Parser {
952
974
  }
953
975
  return null;
954
976
  }
977
+ parseCycle(start) {
978
+ const values = [];
979
+ let asVar = null;
980
+ let silent = false;
981
+ while (!this.check("BLOCK_END" /* BLOCK_END */)) {
982
+ if (this.check("NAME" /* NAME */) && this.peek().value === "as") {
983
+ this.advance();
984
+ asVar = this.expect("NAME" /* NAME */).value;
985
+ if (this.check("NAME" /* NAME */) && this.peek().value === "silent") {
986
+ this.advance();
987
+ silent = true;
988
+ }
989
+ break;
990
+ }
991
+ values.push(this.parseExpression());
992
+ }
993
+ this.expect("BLOCK_END" /* BLOCK_END */);
994
+ return {
995
+ type: "Cycle",
996
+ values,
997
+ asVar,
998
+ silent,
999
+ line: start.line,
1000
+ column: start.column
1001
+ };
1002
+ }
1003
+ parseFirstof(start) {
1004
+ const values = [];
1005
+ let fallback = null;
1006
+ let asVar = null;
1007
+ while (!this.check("BLOCK_END" /* BLOCK_END */)) {
1008
+ if (this.check("NAME" /* NAME */) && this.peek().value === "as") {
1009
+ this.advance();
1010
+ asVar = this.expect("NAME" /* NAME */).value;
1011
+ break;
1012
+ }
1013
+ values.push(this.parseExpression());
1014
+ }
1015
+ if (values.length > 0) {
1016
+ const last = values[values.length - 1];
1017
+ if (last.type === "Literal" && typeof last.value === "string") {
1018
+ fallback = values.pop();
1019
+ }
1020
+ }
1021
+ this.expect("BLOCK_END" /* BLOCK_END */);
1022
+ return {
1023
+ type: "Firstof",
1024
+ values,
1025
+ fallback,
1026
+ asVar,
1027
+ line: start.line,
1028
+ column: start.column
1029
+ };
1030
+ }
1031
+ parseIfchanged(start) {
1032
+ const values = [];
1033
+ while (!this.check("BLOCK_END" /* BLOCK_END */)) {
1034
+ values.push(this.parseExpression());
1035
+ }
1036
+ this.expect("BLOCK_END" /* BLOCK_END */);
1037
+ const body = [];
1038
+ let else_ = [];
1039
+ while (!this.isAtEnd()) {
1040
+ if (this.checkBlockTag("else") || this.checkBlockTag("endifchanged"))
1041
+ break;
1042
+ const node = this.parseStatement();
1043
+ if (node)
1044
+ body.push(node);
1045
+ }
1046
+ if (this.checkBlockTag("else")) {
1047
+ this.advance();
1048
+ this.advance();
1049
+ this.expect("BLOCK_END" /* BLOCK_END */);
1050
+ while (!this.isAtEnd()) {
1051
+ if (this.checkBlockTag("endifchanged"))
1052
+ break;
1053
+ const node = this.parseStatement();
1054
+ if (node)
1055
+ else_.push(node);
1056
+ }
1057
+ }
1058
+ this.expectBlockTag("endifchanged");
1059
+ return {
1060
+ type: "Ifchanged",
1061
+ values,
1062
+ body,
1063
+ else_,
1064
+ line: start.line,
1065
+ column: start.column
1066
+ };
1067
+ }
1068
+ parseRegroup(start) {
1069
+ const target = this.parseExpression();
1070
+ this.expectName("by");
1071
+ const key = this.expect("NAME" /* NAME */).value;
1072
+ this.expectName("as");
1073
+ const asVar = this.expect("NAME" /* NAME */).value;
1074
+ this.expect("BLOCK_END" /* BLOCK_END */);
1075
+ return {
1076
+ type: "Regroup",
1077
+ target,
1078
+ key,
1079
+ asVar,
1080
+ line: start.line,
1081
+ column: start.column
1082
+ };
1083
+ }
1084
+ parseWidthratio(start) {
1085
+ const value = this.parseExpression();
1086
+ const maxValue = this.parseExpression();
1087
+ const maxWidth = this.parseExpression();
1088
+ let asVar = null;
1089
+ if (this.check("NAME" /* NAME */) && this.peek().value === "as") {
1090
+ this.advance();
1091
+ asVar = this.expect("NAME" /* NAME */).value;
1092
+ }
1093
+ this.expect("BLOCK_END" /* BLOCK_END */);
1094
+ return {
1095
+ type: "Widthratio",
1096
+ value,
1097
+ maxValue,
1098
+ maxWidth,
1099
+ asVar,
1100
+ line: start.line,
1101
+ column: start.column
1102
+ };
1103
+ }
1104
+ parseLorem(start) {
1105
+ let count = null;
1106
+ let method = "p";
1107
+ let random = false;
1108
+ if (this.check("NUMBER" /* NUMBER */)) {
1109
+ count = {
1110
+ type: "Literal",
1111
+ value: parseInt(this.advance().value, 10),
1112
+ line: start.line,
1113
+ column: start.column
1114
+ };
1115
+ }
1116
+ if (this.check("NAME" /* NAME */)) {
1117
+ const m = this.peek().value.toLowerCase();
1118
+ if (m === "w" || m === "p" || m === "b") {
1119
+ method = m;
1120
+ this.advance();
1121
+ }
1122
+ }
1123
+ if (this.check("NAME" /* NAME */) && this.peek().value === "random") {
1124
+ random = true;
1125
+ this.advance();
1126
+ }
1127
+ this.expect("BLOCK_END" /* BLOCK_END */);
1128
+ return {
1129
+ type: "Lorem",
1130
+ count,
1131
+ method,
1132
+ random,
1133
+ line: start.line,
1134
+ column: start.column
1135
+ };
1136
+ }
1137
+ parseCsrfToken(start) {
1138
+ this.expect("BLOCK_END" /* BLOCK_END */);
1139
+ return {
1140
+ type: "CsrfToken",
1141
+ line: start.line,
1142
+ column: start.column
1143
+ };
1144
+ }
1145
+ parseDebug(start) {
1146
+ this.expect("BLOCK_END" /* BLOCK_END */);
1147
+ return {
1148
+ type: "Debug",
1149
+ line: start.line,
1150
+ column: start.column
1151
+ };
1152
+ }
1153
+ parseTemplatetag(start) {
1154
+ const tagType = this.expect("NAME" /* NAME */).value;
1155
+ this.expect("BLOCK_END" /* BLOCK_END */);
1156
+ return {
1157
+ type: "Templatetag",
1158
+ tagType,
1159
+ line: start.line,
1160
+ column: start.column
1161
+ };
1162
+ }
1163
+ parseIfequal(start, negated) {
1164
+ const left = this.parseExpression();
1165
+ const right = this.parseExpression();
1166
+ this.expect("BLOCK_END" /* BLOCK_END */);
1167
+ const test = {
1168
+ type: "Compare",
1169
+ left,
1170
+ ops: [{ operator: negated ? "!=" : "==", right }],
1171
+ line: start.line,
1172
+ column: start.column
1173
+ };
1174
+ const body = [];
1175
+ let else_ = [];
1176
+ const endTag = negated ? "endifnotequal" : "endifequal";
1177
+ while (!this.isAtEnd()) {
1178
+ if (this.checkBlockTag("else") || this.checkBlockTag(endTag))
1179
+ break;
1180
+ const node = this.parseStatement();
1181
+ if (node)
1182
+ body.push(node);
1183
+ }
1184
+ if (this.checkBlockTag("else")) {
1185
+ this.advance();
1186
+ this.advance();
1187
+ this.expect("BLOCK_END" /* BLOCK_END */);
1188
+ while (!this.isAtEnd()) {
1189
+ if (this.checkBlockTag(endTag))
1190
+ break;
1191
+ const node = this.parseStatement();
1192
+ if (node)
1193
+ else_.push(node);
1194
+ }
1195
+ }
1196
+ this.expectBlockTag(endTag);
1197
+ return {
1198
+ type: "If",
1199
+ test,
1200
+ body,
1201
+ elifs: [],
1202
+ else_,
1203
+ line: start.line,
1204
+ column: start.column
1205
+ };
1206
+ }
955
1207
  parseExpression() {
956
1208
  return this.parseConditional();
957
1209
  }
@@ -79,5 +79,16 @@ export declare const forceescape: FilterFunction;
79
79
  export declare const phone2numeric: FilterFunction;
80
80
  export declare const linenumbers: FilterFunction;
81
81
  export declare const unordered_list: FilterFunction;
82
+ export declare const addslashes: FilterFunction;
83
+ export declare const get_digit: FilterFunction;
84
+ export declare const iriencode: FilterFunction;
85
+ export declare const json_script: FilterFunction;
86
+ export declare const safeseq: FilterFunction;
87
+ export declare const stringformat: FilterFunction;
88
+ export declare const truncatechars_html: FilterFunction;
89
+ export declare const truncatewords_html: FilterFunction;
90
+ export declare const urlizetrunc: FilterFunction;
91
+ export declare const items: FilterFunction;
92
+ export declare const xmlattr: FilterFunction;
82
93
  export declare const builtinFilters: Record<string, FilterFunction>;
83
94
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/filters/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/filters/index.ts"],"names":[],"mappings":"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"}