miki-template 2.3.1 → 2.3.3

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.
Files changed (167) hide show
  1. package/README.md +1 -1
  2. package/package.json +24 -2
  3. package/src/codegen.js +140 -9
  4. package/src/parser.js +69 -1
  5. package/src/tags/control.js +112 -51
  6. package/src/tags/extra.js +4 -17
  7. package/src/tags/i18n.js +6 -17
  8. package/src/tags/inheritance.js +6 -20
  9. package/src/tags/util.js +5 -20
  10. package/.eslintrc.json +0 -16
  11. package/.github/release-notes/v1.3.1.md +0 -55
  12. package/.github/release-notes/v1.3.3.md +0 -77
  13. package/.github/release-notes/v1.3.7.md +0 -20
  14. package/.github/workflows/ci.yml +0 -42
  15. package/.github/workflows/docs.yml +0 -107
  16. package/.github/workflows/release.yml +0 -107
  17. package/AGENT.md +0 -71
  18. package/API_REFERENCE.md +0 -341
  19. package/CHANGELOG.md +0 -173
  20. package/CODE_OF_CONDUCT.md +0 -14
  21. package/CONTRIBUTING.md +0 -27
  22. package/ROADMAP.md +0 -40
  23. package/assets/banner.png +0 -0
  24. package/assets/logo.png +0 -0
  25. package/benchmarks/ejs-results.json +0 -17
  26. package/benchmarks/ejs.js +0 -38
  27. package/benchmarks/handlebars-results.json +0 -17
  28. package/benchmarks/handlebars.js +0 -45
  29. package/benchmarks/miki-results.json +0 -17
  30. package/benchmarks/miki.js +0 -39
  31. package/benchmarks/pug-results.json +0 -17
  32. package/benchmarks/pug.js +0 -38
  33. package/benchmarks/report.json +0 -17
  34. package/benchmarks/run.js +0 -81
  35. package/benchmarks/stress.mjs +0 -647
  36. package/benchmarks/templates/large.dtpl +0 -7
  37. package/benchmarks/templates/medium.dtpl +0 -3
  38. package/benchmarks/templates/small.dtpl +0 -7
  39. package/context/component.md +0 -109
  40. package/context/prd.md +0 -131
  41. package/context/project-structure.md +0 -33
  42. package/dir/base.html +0 -23
  43. package/dir/cmpnt.html +0 -11
  44. package/dir/footer.html +0 -3
  45. package/dir/home.html +0 -80
  46. package/dir/index.html +0 -80
  47. package/dir/navbar.html +0 -9
  48. package/docs/api/async-render.md +0 -170
  49. package/docs/api/cache.md +0 -174
  50. package/docs/api/compile.md +0 -256
  51. package/docs/api/context-processors.md +0 -154
  52. package/docs/api/filters.md +0 -437
  53. package/docs/api/finder.md +0 -188
  54. package/docs/api/helpers.md +0 -106
  55. package/docs/api/i18n.md +0 -314
  56. package/docs/api/index.md +0 -108
  57. package/docs/api/libraries.md +0 -414
  58. package/docs/api/render-partial.md +0 -162
  59. package/docs/api/render.md +0 -184
  60. package/docs/api/security.md +0 -290
  61. package/docs/api/setup-express.md +0 -152
  62. package/docs/api/tags.md +0 -268
  63. package/docs/assets/banner.png +0 -0
  64. package/docs/assets/logo.png +0 -0
  65. package/docs/filter.md +0 -0
  66. package/docs/guide/advanced-usage.md +0 -794
  67. package/docs/guide/async-rendering.md +0 -616
  68. package/docs/guide/context-processors.md +0 -514
  69. package/docs/guide/custom-filters.md +0 -622
  70. package/docs/guide/custom-tags.md +0 -542
  71. package/docs/guide/filters.md +0 -1314
  72. package/docs/guide/getting-started.md +0 -204
  73. package/docs/guide/installation.md +0 -190
  74. package/docs/guide/partial-templates.md +0 -734
  75. package/docs/guide/quick-start.md +0 -444
  76. package/docs/guide/security.md +0 -690
  77. package/docs/guide/tags.md +0 -1566
  78. package/docs/guide/template-discovery.md +0 -340
  79. package/docs/guide/template-inheritance.md +0 -546
  80. package/docs/guide/what-is-miki-template.md +0 -28
  81. package/docs/guide/why-miki-template.md +0 -75
  82. package/docs/index.md +0 -86
  83. package/docs/integrations/elysia.md +0 -80
  84. package/docs/integrations/express.md +0 -219
  85. package/docs/integrations/fastify.md +0 -79
  86. package/docs/integrations/hono.md +0 -80
  87. package/docs/integrations/index.md +0 -68
  88. package/docs/integrations/koa.md +0 -90
  89. package/docs/integrations/nestjs.md +0 -80
  90. package/docs/integrations/tsed.md +0 -83
  91. package/docs/performance.md +0 -74
  92. package/eslint.config.mjs +0 -42
  93. package/ex.mjs +0 -36
  94. package/live-test/integrations/elysia-example.js +0 -16
  95. package/live-test/integrations/express-example.js +0 -24
  96. package/live-test/integrations/fastify-example.js +0 -20
  97. package/live-test/integrations/hono-example.js +0 -16
  98. package/live-test/integrations/koa-example.js +0 -30
  99. package/live-test/integrations/nestjs-example.js +0 -25
  100. package/live-test/integrations/smoke-test.js +0 -166
  101. package/live-test/integrations/tsed-example.js +0 -23
  102. package/live-test/package-lock.json +0 -1150
  103. package/live-test/package.json +0 -13
  104. package/live-test/packages/product/templates/product/detail.html +0 -7
  105. package/live-test/server.js +0 -38
  106. package/live-test/templates/app_templates/detail.html +0 -6
  107. package/live-test/views/base.html +0 -8
  108. package/live-test/views/child.html +0 -7
  109. package/live-test/views/home.html +0 -17
  110. package/live-test/views/index.html +0 -1
  111. package/miki-template-extension/.github/workflows/ci.yml +0 -116
  112. package/miki-template-extension/.vscodeignore +0 -7
  113. package/miki-template-extension/CHANGELOG.md +0 -99
  114. package/miki-template-extension/LICENSE +0 -21
  115. package/miki-template-extension/README.md +0 -273
  116. package/miki-template-extension/extension.js +0 -1013
  117. package/miki-template-extension/icon.png +0 -0
  118. package/miki-template-extension/icon.svg +0 -10
  119. package/miki-template-extension/miki-template-1.7.1.vsix +0 -0
  120. package/miki-template-extension/package.json +0 -280
  121. package/miki-template-extension/snippets/miki-template.json +0 -717
  122. package/miki-template-extension/syntaxes/language-configuration.json +0 -114
  123. package/miki-template-extension/syntaxes/miki-template.tmLanguage.json +0 -355
  124. package/miki-template-extension/tests/grammar-tests.json +0 -162
  125. package/miki-template-extension/tests/run-grammar-tests.js +0 -82
  126. package/mkdocs.yml +0 -195
  127. package/overrides/main.html +0 -26
  128. package/requirements-docs.txt +0 -2
  129. package/sample-app/package-lock.json +0 -901
  130. package/sample-app/package.json +0 -9
  131. package/sample-app/server.js +0 -14
  132. package/sample-app/views/index.html +0 -1
  133. package/scripts/build-vsix.js +0 -129
  134. package/scripts/build-vsix.ps1 +0 -15
  135. package/snippets/miki-template.json +0 -177
  136. package/src/asyncRender.js +0 -21
  137. package/src/types.d.ts +0 -107
  138. package/syntaxes/language-configuration.json +0 -26
  139. package/syntaxes/miki-template.tmLanguage.json +0 -146
  140. package/tests/asyncRender.test.js +0 -17
  141. package/tests/base.html +0 -6
  142. package/tests/child.html +0 -3
  143. package/tests/context_processors.test.js +0 -13
  144. package/tests/esm.test.mjs +0 -61
  145. package/tests/filters.test.js +0 -263
  146. package/tests/finder-appdirs.test.js +0 -19
  147. package/tests/finder.test.js +0 -17
  148. package/tests/fixtures/views/nested/index.html +0 -1
  149. package/tests/fixtures/views/partial.html +0 -1
  150. package/tests/fixtures/views/sub/deepfile.html +0 -1
  151. package/tests/fixtures/views-appdirs/product/site/detail.html +0 -1
  152. package/tests/include_security.test.js +0 -9
  153. package/tests/integration/README.md +0 -32
  154. package/tests/integration/features.test.cjs +0 -1681
  155. package/tests/integration/features.test.mjs +0 -1697
  156. package/tests/integration/finder.esm.test.mjs +0 -13
  157. package/tests/integration/partial-render.test.cjs +0 -13
  158. package/tests/integration/templates/base.miki +0 -6
  159. package/tests/integration/templates/child.miki +0 -6
  160. package/tests/integration/templates/index.html +0 -17
  161. package/tests/lexer.test.js +0 -45
  162. package/tests/parser.test.js +0 -57
  163. package/tests/partial.html +0 -1
  164. package/tests/partialdef.test.js +0 -79
  165. package/tests/production_checks.js +0 -57
  166. package/tests/security.test.js +0 -28
  167. package/tests/tags.test.js +0 -233
@@ -1,109 +0,0 @@
1
- # Component Hierarchy — Django-Style Template Engine (Node.js/Express)
2
-
3
- ## 📖 Purpose
4
- This document defines the **modules, responsibilities, and relationships** for the template engine. It ensures clarity in implementation and maintainability.
5
-
6
- ---
7
-
8
- ## 🧩 Core Components
9
-
10
- ### 1. **Lexer**
11
- - **Responsibility**: Tokenize template strings into `TEXT`, `VAR`, `BLOCK`.
12
- - **Inputs**: Raw template string.
13
- - **Outputs**: Token stream.
14
- - **Dependencies**: None.
15
-
16
- ### 2. **Parser**
17
- - **Responsibility**: Convert tokens into an AST (Abstract Syntax Tree).
18
- - **Inputs**: Token stream.
19
- - **Outputs**: AST nodes (`Text`, `Var`, `If`, `For`, `Block`, etc.).
20
- - **Dependencies**: Lexer.
21
-
22
- ### 3. **Renderer**
23
- - **Responsibility**: Walk AST, evaluate expressions, apply filters, render output.
24
- - **Inputs**: AST + context.
25
- - **Outputs**: Final HTML string.
26
- - **Dependencies**: Parser, Filter Registry, Tag Handlers.
27
-
28
- ---
29
-
30
- ## 🔧 Supporting Modules
31
-
32
- ### 4. **Filter Registry**
33
- - **Responsibility**: Store and apply filters.
34
- - **Built-in Filters**: `upper`, `lower`, `date`, `truncatechars`, `safe`, `escape`, etc.
35
- - **Extensibility**: Developers can register custom filters.
36
- - **Dependencies**: Renderer.
37
-
38
- ### 5. **Tag Handlers**
39
- - **Responsibility**: Implement logic for each tag.
40
- - **Control Flow**: `if`, `elif`, `else`, `for`, `empty`, `with`, `cycle`.
41
- - **Inheritance**: `extends`, `block`, `include`.
42
- - **Utilities**: `url`, `static`, `regroup`, `spaceless`, `comment`, `verbatim`.
43
- - **Security**: `autoescape`, `csrf_token`, `csp_nonce_attr`.
44
- - **Dependencies**: Renderer, Context.
45
-
46
- ### 6. **Inheritance System**
47
- - **Responsibility**: Manage parent/child templates, block overrides.
48
- - **Mechanism**: Block registry + AST merging.
49
- - **Dependencies**: Parser, Renderer.
50
-
51
- ### 7. **Context Manager**
52
- - **Responsibility**: Provide variables to templates.
53
- - **Features**: Dotted lookups (`user.name`), querystring injection, context processors.
54
- - **Dependencies**: Renderer.
55
-
56
- ---
57
-
58
- ## 🔐 Security Components
59
-
60
- ### 8. **Escaping Engine**
61
- - **Responsibility**: Autoescape HTML by default.
62
- - **Features**: `safe` filter disables escaping, `escape` forces escaping.
63
- - **Dependencies**: Renderer, Filter Registry.
64
-
65
- ---
66
-
67
- ## 📦 Integration Layer
68
-
69
- ### 9. **Express Adapter**
70
- - **Responsibility**: Integrate engine with Express.
71
- - **API**: `app.engine('dtpl', renderFile)`.
72
- - **Dependencies**: Renderer, Context Manager.
73
-
74
- ---
75
-
76
- ## 🛠️ Extensibility Components
77
-
78
- ### 10. **Custom Tag API**
79
- - **Responsibility**: Allow developers to register new tags.
80
- - **Mechanism**: Tag registry with handler functions.
81
-
82
- ### 11. **Custom Filter API**
83
- - **Responsibility**: Allow developers to register new filters.
84
- - **Mechanism**: Filter registry extension.
85
-
86
- ### 12. **Context Processors**
87
- - **Responsibility**: Inject global variables (e.g., `user`, `request`).
88
- - **Mechanism**: Middleware-like hooks.
89
-
90
- ---
91
-
92
- ## 📋 Relationships Diagram (Textual)
93
-
94
- - **Lexer → Parser → Renderer**
95
- - **Renderer → Filter Registry + Tag Handlers + Context Manager**
96
- - **Tag Handlers → Inheritance System + Escaping Engine**
97
- - **Express Adapter → Renderer**
98
- - **Custom APIs → Filter Registry + Tag Handlers**
99
- - **Context Processors → Context Manager**
100
-
101
- ---
102
-
103
- ## 🎯 Deliverables
104
- - Modular codebase with clear separation of concerns.
105
- - Each tag/filter implemented as independent handler.
106
- - Extensible APIs for developers.
107
- - Secure rendering pipeline with autoescape.
108
- - Seamless Express integration.
109
-
package/context/prd.md DELETED
@@ -1,131 +0,0 @@
1
- # Django-Style Template Engine for Node.js/Express
2
-
3
- ## 📖 Overview
4
- A custom template engine for Express that replicates **Django’s template language** in Node.js. It supports variables, filters, tags, inheritance, partials, escaping, and extensibility — providing full parity with Django templates while integrating seamlessly into Express.
5
-
6
- ---
7
-
8
- ## 🎯 Goals
9
- - Full Django template feature parity in Node.js.
10
- - Simple Express integration via `app.engine`.
11
- - Extensible API for custom tags, filters, and context processors.
12
- - Secure by default (autoescape enabled).
13
- - Production-ready performance (AST caching, error handling).
14
-
15
- ---
16
-
17
- ## 🧩 Core Architecture
18
- 1. **Lexer** → Tokenizes template into `TEXT`, `VAR`, `BLOCK`.
19
- 2. **Parser** → Builds AST nodes for tags/filters.
20
- 3. **Renderer** → Walks AST, evaluates expressions, applies filters.
21
- 4. **Filter Registry** → Built-in + custom filters.
22
- 5. **Tag Handlers** → Functions for each tag (`if`, `for`, `block`, etc.).
23
- 6. **Inheritance System** → Block registry + parent merging.
24
- 7. **Express Integration** → `app.engine('dtpl', renderFile)`.
25
-
26
- ---
27
-
28
- ## 🏷️ Built-in Template Tags
29
-
30
- | Tag | Purpose | Node.js Implementation |
31
- |-----|---------|------------------------|
32
- | **autoescape** | Toggle HTML escaping. | Maintain `context.autoescape` flag. |
33
- | **block** | Define overridable content. | Store block AST in registry. |
34
- | **extends** | Template inheritance. | Load parent file, merge blocks. |
35
- | **include** | Insert partial template. | Load file, render with context. |
36
- | **if/elif/else** | Conditional rendering. | Evaluate JS expression safely. |
37
- | **for/empty** | Loop over iterable. | Inject `forloop` vars (`counter`, `first`, `last`). |
38
- | **with** | Assign temporary variable. | Extend context object. |
39
- | **cycle** | Alternate values. | Maintain cycle state per loop. |
40
- | **comment** | Ignore enclosed content. | Strip from AST. |
41
- | **verbatim** | Raw output. | Treat enclosed text as literal. |
42
- | **csrf_token** | CSRF protection. | Insert token from context. |
43
- | **csp_nonce_attr** | CSP nonce attribute. | Render `nonce="value"`. |
44
- | **url** | Generate route URL. | Integrate with Express router. |
45
- | **static** | Reference static files. | Map to Express static dir. |
46
- | **regroup** | Group list by attribute. | Use JS `reduce`. |
47
- | **spaceless** | Strip whitespace. | Regex replace in output. |
48
-
49
- ---
50
-
51
- ## 🔧 Built-in Filters
52
-
53
- | Filter | Purpose | Node.js Implementation |
54
- |--------|---------|------------------------|
55
- | **Text** | `upper`, `lower`, `title`, `capfirst`, `truncatewords`, `truncatechars`, `wordcount`, `linebreaks`, `linebreaksbr`, `striptags`, `slugify` | JS string methods, regex, libraries. |
56
- | **HTML** | `safe`, `escape` | Use `he` for escaping; safe flag. |
57
- | **List** | `length`, `join`, `slice`, `dictsort`, `dictsortreversed` | JS array methods. |
58
- | **Date/Time** | `date`, `time`, `timesince`, `timeuntil` | Wrap JS `Date` with `Intl.DateTimeFormat`. |
59
- | **Numeric** | `add`, `divisibleby`, `floatformat` | Arithmetic ops; `toFixed`. |
60
- | **Default** | `default`, `default_if_none` | Fallback values. |
61
- | **Misc** | `pluralize`, `yesno`, `filesizeformat` | String transformations; filesize units. |
62
-
63
- ---
64
-
65
- ## 🔐 Escaping & Security
66
- - Autoescape enabled by default.
67
- - `safe` filter disables escaping.
68
- - `escape` filter forces escaping.
69
- - Use `he` library for HTML entity encoding.
70
-
71
- ---
72
-
73
- ## 🛠️ Extensibility
74
- - **Custom filters**: `filters[name] = fn`.
75
- - **Custom tags**: Register handler functions in tag registry.
76
- - **Context processors**: Middleware to inject globals (e.g., `user`, `request`).
77
-
78
- ---
79
-
80
- ## 📋 Development Roadmap
81
-
82
- ### Phase 1 — Core Foundations
83
- - Lexer, parser, renderer.
84
- - Express integration.
85
-
86
- ### Phase 2 — Variables & Filters
87
- - Variables with dotted lookups.
88
- - Full filter system (text, list, date, numeric, misc).
89
- - Custom filter API.
90
-
91
- ### Phase 3 — Control Flow Tags
92
- - `if/elif/else`, `for/empty`, `with`, `cycle`, `comment`, `verbatim`.
93
-
94
- ### Phase 4 — Template Inheritance
95
- - `extends`, `block`, nested blocks.
96
- - `include` for partials.
97
-
98
- ### Phase 5 — Utilities & Helpers
99
- - `static`, `url`, `regroup`, `spaceless`.
100
-
101
- ### Phase 6 — Security
102
- - Autoescape, safe strings, escape filter.
103
-
104
- ### Phase 7 — Extensibility
105
- - Custom tags/filters.
106
- - Context processors.
107
-
108
- ### Phase 8 — Advanced Features
109
- - Querystring/context passing.
110
- - Template partials with context overrides.
111
- - Error handling.
112
- - Performance optimizations (AST caching).
113
-
114
- ### Phase 9 — Developer Experience
115
- - Documentation.
116
- - Testing suite.
117
- - Packaging as npm module.
118
- - Example apps.
119
-
120
- ---
121
-
122
- ## 🎯 Final Deliverables
123
- - **Engine core**: Lexer, parser, renderer.
124
- - **Filter library**: All Django filters.
125
- - **Tag handlers**: All Django tags.
126
- - **Inheritance system**: Full block/extends support.
127
- - **Express integration**: `app.engine('dtpl', ...)`.
128
- - **Extensibility API**: Custom tags/filters/context processors.
129
- - **Security**: Autoescape + safe strings.
130
- - **Docs & tests**: Full coverage.
131
-
@@ -1,33 +0,0 @@
1
- /project-root
2
- /src
3
- lexer.js
4
- parser.js
5
- renderer.js
6
- filters.js
7
- security.js
8
- cache.js
9
- context.js
10
- tags/
11
- control.js
12
- inheritance.js
13
- util.js
14
- index.js
15
- /templates
16
- base.html
17
- home.html
18
- header.html
19
- /examples
20
- app.js
21
- /tests
22
- lexer.test.js
23
- parser.test.js
24
- renderer.test.js
25
- filters.test.js
26
- tags.test.js
27
- security.test.js
28
- README.md
29
- API_REFERENCE.md
30
- ROADMAP.md
31
- CONTRIBUTING.md
32
- CODE_OF_CONDUCT.md
33
- package.json
package/dir/base.html DELETED
@@ -1,23 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>
7
-
8
- {% block title %}
9
- Document
10
- {% endblock title %}
11
-
12
- </title>
13
- </head>
14
- <body>
15
- {% include "navbar.html" %}
16
-
17
- {% block content %}
18
-
19
- {% endblock content %}
20
- {% include "footer.html" %}
21
-
22
- </body>
23
- </html>
package/dir/cmpnt.html DELETED
@@ -1,11 +0,0 @@
1
- {% partialdef me %}
2
- <h2>here is some content</h2>
3
- {% endpartialdef %}
4
- {% partialdef you %}
5
- <h2>here is some content for you</h2>
6
- {% endpartialdef %}
7
- {% partialdef us inline %}
8
- {% partial me%}
9
- {% partial you%}
10
- <h2>here is some content for us</h2>
11
- {% endpartialdef %}
package/dir/footer.html DELETED
@@ -1,3 +0,0 @@
1
- <footer>
2
- <h3>some footer content with : {{siteName}}</h3>
3
- </footer>
package/dir/home.html DELETED
@@ -1,80 +0,0 @@
1
- {% extends 'base.html' %}
2
-
3
- {% block title %}
4
- {{ siteName|default:'Home page Here'|title }} | {{ block.super }}
5
- {% endblock %}
6
-
7
- {% block content %}
8
- {% partialdef card inline %}
9
- <div class="card">
10
- <h3>{{ title|default:'No title' }}</h3>
11
- <p>{{ description|default:'{% lorem 20 %}'|upper }}</p>
12
- </div>
13
- {% endpartialdef %}
14
-
15
- {% partial card with title='Hello' description='World' %}
16
-
17
- {% with a=5 %}
18
- <marquee behavior="" direction="">
19
- <span>some new stuff with with tag : {{ a|add:5 }}</span>
20
- </marquee>
21
- {% endwith %}
22
-
23
- {{ name }}
24
- {{ login.name }}
25
- {{ login.email }}
26
- <h1>Users table goes below</h1>
27
- <table border="3">
28
- <th>name</th>
29
- <th>email</th>
30
- <th>action</th>
31
-
32
- {% for user in users %}
33
- <tr>
34
- <td>{{ user.name|title }}</td>
35
- <td>{{ user.email }}</td>
36
- <td>
37
- <a href="">Delete user</a>
38
- </td>
39
- </tr>
40
- {% endfor %}
41
-
42
- </table>
43
- <h1>Data list</h1>
44
- <h2>data list of data</h2>
45
- {% for obj in data %}
46
- {% partialdef mike inline %}
47
-
48
- <li>{{ obj.name }}</li>
49
- <li>{{ forloop.counter }}</li>
50
- <li> {{ obj.email }}</li>
51
- {% endpartialdef %}
52
- {% endfor %}
53
-
54
- <h2>users list of data</h2>
55
- <ul style="background-color: aqua;color: blueviolet; list-style-type:upper-roman;">
56
-
57
- {% for obj in users %}
58
- {% partial mike %}
59
- {% endfor %}
60
- </ul>
61
-
62
- <h3>form with crsf</h3>
63
-
64
- <form action="">
65
- {% csrf_token %}
66
- <input type="text" name="" id="" title="some text"/>
67
- </form>
68
- <h3>included content here</h3>
69
- {% include 'cmpnt.html#me' %}
70
-
71
- {{"2324"|filesizeformat}}
72
- {{"224"|filesizeformat}}
73
- {{ "123456789"|filesizeformat }}
74
- {{ "1234567890"|filesizeformat }}
75
- {{ "1234567890123"|filesizeformat }}
76
- {{ "1234567890123456"|filesizeformat }}
77
- {{ "1234567890123456789"|filesizeformat }}
78
-
79
-
80
- {% endblock %}
package/dir/index.html DELETED
@@ -1,80 +0,0 @@
1
- {% extends 'base.html' %}
2
-
3
- {% block title %}
4
- {{ siteName|default:'Home page Here'|title }} | {{ block.super }}
5
- {% endblock %}
6
-
7
- {% block content %}
8
- {% partialdef card inline %}
9
- <div class="card">
10
- <h3>{{ title|default:'No title' }}</h3>
11
- <p>{{ description|default:'{% lorem 20 %}'|upper }}</p>
12
- </div>
13
- {% endpartialdef %}
14
-
15
- {% partial card with title='Hello' description='World' %}
16
-
17
- {% with a=5 %}
18
- <marquee behavior="" direction="">
19
- <span>some new stuff with with tag : {{ a|add:5 }}</span>
20
- </marquee>
21
- {% endwith %}
22
-
23
- {{ name }}
24
- {{ login.name }}
25
- {{ login.email }}
26
- <h1>Users table goes below</h1>
27
- <table border="3">
28
- <th>name</th>
29
- <th>email</th>
30
- <th>action</th>
31
-
32
- {% for user in users %}
33
- <tr>
34
- <td>{{ user.name|title }}</td>
35
- <td>{{ user.email }}</td>
36
- <td>
37
- <a href="">Delete user</a>
38
- </td>
39
- </tr>
40
- {% endfor %}
41
-
42
- </table>
43
- <h1>Data list</h1>
44
- <h2>data list of data</h2>
45
- {% for obj in data %}
46
- {% partialdef mike inline %}
47
-
48
- <li>{{ obj.name }}</li>
49
- <li>{{ forloop.counter }}</li>
50
- <li> {{ obj.email }}</li>
51
- {% endpartialdef %}
52
- {% endfor %}
53
-
54
- <h2>users list of data</h2>
55
- <ul style="background-color: aqua;color: blueviolet; list-style-type:upper-roman;">
56
-
57
- {% for obj in users %}
58
- {% partial mike %}
59
- {% endfor %}
60
- </ul>
61
-
62
- <h3>form with crsf</h3>
63
-
64
- <form action="">
65
- {% csrf_token %}
66
- <input type="text" name="" id="" title="some text"/>
67
- </form>
68
- <h3>included content here</h3>
69
- {% include 'cmpnt.html#me' %}
70
-
71
- {{"2324"|filesizeformat}}
72
- {{"224"|filesizeformat}}
73
- {{ "123456789"|filesizeformat }}
74
- {{ "1234567890"|filesizeformat }}
75
- {{ "1234567890123"|filesizeformat }}
76
- {{ "1234567890123456"|filesizeformat }}
77
- {{ "1234567890123456789"|filesizeformat }}
78
-
79
-
80
- {% endblock %}
package/dir/navbar.html DELETED
@@ -1,9 +0,0 @@
1
- <header>
2
- <div class="brand">
3
- <img src="/path/to/logo.png" alt="Logo" width="40px">
4
- </div>
5
- <nav>
6
- <a href="/">Home</a>
7
-
8
- </nav>
9
- </header>
@@ -1,170 +0,0 @@
1
- # asyncRender()
2
-
3
-
4
-
5
- Async version of `render()`. Returns a Promise. Use this when your templates contain async filters, async custom tags, or async library components.
6
-
7
-
8
-
9
- ## Signature
10
-
11
-
12
-
13
- ```javascript
14
-
15
- asyncRender(templateStr, contextObj = {}, options = {})
16
-
17
- ```
18
-
19
-
20
-
21
- ## Returns
22
-
23
-
24
-
25
- `Promise<string>` — The rendered HTML.
26
-
27
-
28
-
29
- ## When to Use
30
-
31
-
32
-
33
- Use `asyncRender()` when your templates contain:
34
-
35
-
36
-
37
- - Async filters (returning Promises)
38
-
39
- - Async custom tags (render return a Promise)
40
-
41
- - Async library helpers
42
-
43
- - `{% load %}` libraries with async components
44
-
45
-
46
-
47
- Using async features with `render()` throws: `Async node encountered during sync render. Use asyncRender() instead.`
48
-
49
-
50
-
51
- ## Examples
52
-
53
-
54
-
55
- ### Basic async render
56
-
57
-
58
-
59
- === "CommonJS"
60
-
61
-
62
-
63
- ```javascript
64
-
65
- const { asyncRender } = require('miki-template');
66
-
67
-
68
-
69
- const html = await asyncRender('Hello {{ name }}!', { name: 'World' });
70
-
71
- ```
72
-
73
-
74
-
75
- === "ES Modules"
76
-
77
-
78
-
79
- ```javascript
80
-
81
- import { asyncRender } from 'miki-template';
82
-
83
-
84
-
85
- const html = await asyncRender('Hello {{ name }}!', { name: 'World' });
86
-
87
- ```
88
-
89
-
90
-
91
- ### With async tags/filters
92
-
93
-
94
-
95
- === "CommonJS"
96
-
97
-
98
-
99
- ```javascript
100
-
101
- const { asyncRender } = require('miki-template');
102
-
103
-
104
-
105
- const html = await asyncRender(templateWithAsyncHelpers, context, options);
106
-
107
- ```
108
-
109
-
110
-
111
- === "ES Modules"
112
-
113
-
114
-
115
- ```javascript
116
-
117
- import { asyncRender } from 'miki-template';
118
-
119
-
120
-
121
- const html = await asyncRender(templateWithAsyncHelpers, context, options);
122
-
123
- ```
124
-
125
-
126
-
127
- ### Async partial from file
128
-
129
-
130
-
131
- === "CommonJS"
132
-
133
-
134
-
135
- ```javascript
136
-
137
- const { asyncRender } = require('miki-template');
138
-
139
-
140
-
141
- const html = await asyncRender('home#card', context, { views: './views' });
142
-
143
- ```
144
-
145
-
146
-
147
- === "ES Modules"
148
-
149
-
150
-
151
- ```javascript
152
-
153
- import { asyncRender } from 'miki-template';
154
-
155
-
156
-
157
- const html = await asyncRender('home#card', context, { views: './views' });
158
-
159
- ```
160
-
161
-
162
-
163
- ## Related
164
-
165
-
166
-
167
- - [render()](./render.md)
168
-
169
- - [compile()](./compile.md)
170
-