mindroot 9.22.0__py3-none-any.whl → 9.24.0__py3-none-any.whl

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.

Potentially problematic release.


This version of mindroot might be problematic. Click here for more details.

Files changed (82) hide show
  1. mindroot/coreplugins/jwt_auth/middleware.py +1 -1
  2. mindroot/docs/.env +1 -0
  3. mindroot/docs/.gitignore +1 -0
  4. mindroot/docs/_build/doctrees/chat_with_assistant.doctree +0 -0
  5. mindroot/docs/_build/doctrees/developer_documentation.doctree +0 -0
  6. mindroot/docs/_build/doctrees/environment.pickle +0 -0
  7. mindroot/docs/_build/doctrees/getting_started.doctree +0 -0
  8. mindroot/docs/_build/doctrees/index.doctree +0 -0
  9. mindroot/docs/_build/doctrees/install_plugins_with_tools.doctree +0 -0
  10. mindroot/docs/_build/doctrees/installation.doctree +0 -0
  11. mindroot/docs/_build/doctrees/llm_api_key.doctree +0 -0
  12. mindroot/docs/_build/doctrees/llm_plugin_installation.doctree +0 -0
  13. mindroot/docs/_build/doctrees/programming_task.doctree +0 -0
  14. mindroot/docs/_build/doctrees/source/ahp.doctree +0 -0
  15. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.admin.doctree +0 -0
  16. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.api_keys.doctree +0 -0
  17. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.chat.doctree +0 -0
  18. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.chat_avatar.doctree +0 -0
  19. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.check_list.doctree +0 -0
  20. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.credits.doctree +0 -0
  21. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.doctree +0 -0
  22. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.email.doctree +0 -0
  23. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.env_manager.doctree +0 -0
  24. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.events.doctree +0 -0
  25. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.index.doctree +0 -0
  26. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.index.handlers.doctree +0 -0
  27. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.jwt_auth.doctree +0 -0
  28. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.l8n.doctree +0 -0
  29. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.mcp_.doctree +0 -0
  30. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.persona.doctree +0 -0
  31. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.startup.doctree +0 -0
  32. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.subscriptions.doctree +0 -0
  33. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.usage.doctree +0 -0
  34. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.user_service.doctree +0 -0
  35. mindroot/docs/_build/doctrees/source/mindroot.doctree +0 -0
  36. mindroot/docs/_build/doctrees/source/mindroot.lib.auth.doctree +0 -0
  37. mindroot/docs/_build/doctrees/source/mindroot.lib.doctree +0 -0
  38. mindroot/docs/_build/doctrees/source/mindroot.lib.json_str_block.doctree +0 -0
  39. mindroot/docs/_build/doctrees/source/mindroot.lib.plugins.doctree +0 -0
  40. mindroot/docs/_build/doctrees/source/mindroot.lib.providers.backup.doctree +0 -0
  41. mindroot/docs/_build/doctrees/source/mindroot.lib.providers.doctree +0 -0
  42. mindroot/docs/_build/doctrees/source/mindroot.registry.doctree +0 -0
  43. mindroot/docs/_build/doctrees/source/modules.doctree +0 -0
  44. mindroot/docs/_build/doctrees/source/mr_agent_expert_instr.doctree +0 -0
  45. mindroot/docs/_build/doctrees/starting_mindroot.doctree +0 -0
  46. mindroot/docs/_build/doctrees/user_documentation.doctree +0 -0
  47. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/settings_router.html +287 -89
  48. mindroot/docs/_build/html/_modules/mindroot/coreplugins/jwt_auth/middleware.html +281 -89
  49. mindroot/docs/_build/html/_modules/mindroot/lib/providers/model_preferences_v2.html +293 -91
  50. mindroot/docs/_build/html/_modules/mindroot/lib/templates.html +342 -98
  51. mindroot/docs/_build/html/_modules/mindroot/server.html +291 -87
  52. mindroot/docs/_build/html/_sources/developer_documentation.rst.txt +21 -1
  53. mindroot/docs/_build/html/developer_documentation.html +44 -4
  54. mindroot/docs/_build/html/getting_started.html +18 -15
  55. mindroot/docs/_build/html/index.html +1 -0
  56. mindroot/docs/_build/html/searchindex.js +1 -1
  57. mindroot/docs/_build/html/source/mindroot.coreplugins.api_keys.html +15 -2
  58. mindroot/docs/_build/html/source/mindroot.coreplugins.chat_avatar.html +15 -2
  59. mindroot/docs/_build/html/source/mindroot.coreplugins.check_list.html +15 -2
  60. mindroot/docs/_build/html/source/mindroot.coreplugins.credits.html +15 -2
  61. mindroot/docs/_build/html/source/mindroot.coreplugins.env_manager.html +15 -2
  62. mindroot/docs/_build/html/source/mindroot.coreplugins.events.html +15 -2
  63. mindroot/docs/_build/html/source/mindroot.coreplugins.index.handlers.html +15 -2
  64. mindroot/docs/_build/html/source/mindroot.coreplugins.index.html +15 -2
  65. mindroot/docs/_build/html/source/mindroot.coreplugins.persona.html +15 -2
  66. mindroot/docs/_build/html/source/mindroot.coreplugins.startup.html +15 -2
  67. mindroot/docs/_build/html/source/mindroot.coreplugins.subscriptions.html +15 -2
  68. mindroot/docs/_build/html/source/mindroot.coreplugins.usage.html +15 -2
  69. mindroot/docs/_build/html/source/mindroot.coreplugins.user_service.html +15 -2
  70. mindroot/docs/_build/html/source/mindroot.lib.auth.html +15 -2
  71. mindroot/docs/_build/html/source/mindroot.lib.html +2 -1
  72. mindroot/docs/_build/html/source/mindroot.lib.json_str_block.html +15 -2
  73. mindroot/docs/_build/html/source/mindroot.lib.plugins.html +15 -2
  74. mindroot/docs/_build/html/source/mindroot.registry.html +15 -2
  75. mindroot/docs/_build/html/source/modules.html +15 -2
  76. mindroot/docs/developer_documentation.rst +21 -1
  77. {mindroot-9.22.0.dist-info → mindroot-9.24.0.dist-info}/METADATA +1 -1
  78. {mindroot-9.22.0.dist-info → mindroot-9.24.0.dist-info}/RECORD +82 -80
  79. {mindroot-9.22.0.dist-info → mindroot-9.24.0.dist-info}/WHEEL +0 -0
  80. {mindroot-9.22.0.dist-info → mindroot-9.24.0.dist-info}/entry_points.txt +0 -0
  81. {mindroot-9.22.0.dist-info → mindroot-9.24.0.dist-info}/licenses/LICENSE +0 -0
  82. {mindroot-9.22.0.dist-info → mindroot-9.24.0.dist-info}/top_level.txt +0 -0
@@ -1,74 +1,262 @@
1
+ <!doctype html>
2
+ <html class="no-js" lang="en" data-content_root="../../../">
3
+ <head><meta charset="utf-8"/>
4
+ <meta name="viewport" content="width=device-width,initial-scale=1"/>
5
+ <meta name="color-scheme" content="light dark"><link rel="index" title="Index" href="../../../genindex.html" /><link rel="search" title="Search" href="../../../search.html" />
6
+
7
+ <!-- Generated with Sphinx 8.2.3 and Furo 2025.07.19 -->
8
+ <title>mindroot.lib.templates - MindRoot 9.10.0 documentation</title>
9
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=d111a655" />
10
+ <link rel="stylesheet" type="text/css" href="../../../_static/styles/furo.css?v=25af2a20" />
11
+ <link rel="stylesheet" type="text/css" href="../../../_static/styles/furo-extensions.css?v=8dab3a3b" />
12
+ <link rel="stylesheet" type="text/css" href="../../../_static/custom.css?v=f4b9d74b" />
13
+
14
+
1
15
 
2
16
 
3
- <!DOCTYPE html>
4
- <html class="writer-html5" lang="en" data-content_root="../../../">
5
- <head>
6
- <meta charset="utf-8" />
7
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
8
- <title>mindroot.lib.templates &mdash; MindRoot 9.10.0 documentation</title>
9
- <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=b86133f3" />
10
- <link rel="stylesheet" type="text/css" href="../../../_static/css/theme.css?v=e59714d7" />
17
+ <style>
18
+ body {
19
+ --color-code-background: #f2f2f2;
20
+ --color-code-foreground: #1e1e1e;
21
+ --color-brand-primary: #007acc;
22
+ --color-brand-content: #007acc;
23
+
24
+ }
25
+ @media not print {
26
+ body[data-theme="dark"] {
27
+ --color-code-background: #2b2b2b;
28
+ --color-code-foreground: #f8f8f2;
29
+ --color-brand-primary: #ff7b72;
30
+ --color-brand-content: #ff7b72;
31
+
32
+ }
33
+ @media (prefers-color-scheme: dark) {
34
+ body:not([data-theme="light"]) {
35
+ --color-code-background: #2b2b2b;
36
+ --color-code-foreground: #f8f8f2;
37
+ --color-brand-primary: #ff7b72;
38
+ --color-brand-content: #ff7b72;
39
+
40
+ }
41
+ }
42
+ }
43
+ </style></head>
44
+ <body>
45
+
46
+ <script>
47
+ document.body.dataset.theme = localStorage.getItem("theme") || "auto";
48
+ </script>
49
+
11
50
 
51
+ <svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
52
+ <symbol id="svg-toc" viewBox="0 0 24 24">
53
+ <title>Contents</title>
54
+ <svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 1024 1024">
55
+ <path d="M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM115.4 518.9L271.7 642c5.8 4.6 14.4.5 14.4-6.9V388.9c0-7.4-8.5-11.5-14.4-6.9L115.4 505.1a8.74 8.74 0 0 0 0 13.8z"/>
56
+ </svg>
57
+ </symbol>
58
+ <symbol id="svg-menu" viewBox="0 0 24 24">
59
+ <title>Menu</title>
60
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
61
+ stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-menu">
62
+ <line x1="3" y1="12" x2="21" y2="12"></line>
63
+ <line x1="3" y1="6" x2="21" y2="6"></line>
64
+ <line x1="3" y1="18" x2="21" y2="18"></line>
65
+ </svg>
66
+ </symbol>
67
+ <symbol id="svg-arrow-right" viewBox="0 0 24 24">
68
+ <title>Expand</title>
69
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
70
+ stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-chevron-right">
71
+ <polyline points="9 18 15 12 9 6"></polyline>
72
+ </svg>
73
+ </symbol>
74
+ <symbol id="svg-sun" viewBox="0 0 24 24">
75
+ <title>Light mode</title>
76
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
77
+ stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="feather-sun">
78
+ <circle cx="12" cy="12" r="5"></circle>
79
+ <line x1="12" y1="1" x2="12" y2="3"></line>
80
+ <line x1="12" y1="21" x2="12" y2="23"></line>
81
+ <line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
82
+ <line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
83
+ <line x1="1" y1="12" x2="3" y2="12"></line>
84
+ <line x1="21" y1="12" x2="23" y2="12"></line>
85
+ <line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
86
+ <line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
87
+ </svg>
88
+ </symbol>
89
+ <symbol id="svg-moon" viewBox="0 0 24 24">
90
+ <title>Dark mode</title>
91
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
92
+ stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-moon">
93
+ <path stroke="none" d="M0 0h24v24H0z" fill="none" />
94
+ <path d="M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z" />
95
+ </svg>
96
+ </symbol>
97
+ <symbol id="svg-sun-with-moon" viewBox="0 0 24 24">
98
+ <title>Auto light/dark, in light mode</title>
99
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
100
+ stroke-width="1" stroke-linecap="round" stroke-linejoin="round"
101
+ class="icon-custom-derived-from-feather-sun-and-tabler-moon">
102
+ <path style="opacity: 50%" d="M 5.411 14.504 C 5.471 14.504 5.532 14.504 5.591 14.504 C 3.639 16.319 4.383 19.569 6.931 20.352 C 7.693 20.586 8.512 20.551 9.25 20.252 C 8.023 23.207 4.056 23.725 2.11 21.184 C 0.166 18.642 1.702 14.949 4.874 14.536 C 5.051 14.512 5.231 14.5 5.411 14.5 L 5.411 14.504 Z"/>
103
+ <line x1="14.5" y1="3.25" x2="14.5" y2="1.25"/>
104
+ <line x1="14.5" y1="15.85" x2="14.5" y2="17.85"/>
105
+ <line x1="10.044" y1="5.094" x2="8.63" y2="3.68"/>
106
+ <line x1="19" y1="14.05" x2="20.414" y2="15.464"/>
107
+ <line x1="8.2" y1="9.55" x2="6.2" y2="9.55"/>
108
+ <line x1="20.8" y1="9.55" x2="22.8" y2="9.55"/>
109
+ <line x1="10.044" y1="14.006" x2="8.63" y2="15.42"/>
110
+ <line x1="19" y1="5.05" x2="20.414" y2="3.636"/>
111
+ <circle cx="14.5" cy="9.55" r="3.6"/>
112
+ </svg>
113
+ </symbol>
114
+ <symbol id="svg-moon-with-sun" viewBox="0 0 24 24">
115
+ <title>Auto light/dark, in dark mode</title>
116
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
117
+ stroke-width="1" stroke-linecap="round" stroke-linejoin="round"
118
+ class="icon-custom-derived-from-feather-sun-and-tabler-moon">
119
+ <path d="M 8.282 7.007 C 8.385 7.007 8.494 7.007 8.595 7.007 C 5.18 10.184 6.481 15.869 10.942 17.24 C 12.275 17.648 13.706 17.589 15 17.066 C 12.851 22.236 5.91 23.143 2.505 18.696 C -0.897 14.249 1.791 7.786 7.342 7.063 C 7.652 7.021 7.965 7 8.282 7 L 8.282 7.007 Z"/>
120
+ <line style="opacity: 50%" x1="18" y1="3.705" x2="18" y2="2.5"/>
121
+ <line style="opacity: 50%" x1="18" y1="11.295" x2="18" y2="12.5"/>
122
+ <line style="opacity: 50%" x1="15.316" y1="4.816" x2="14.464" y2="3.964"/>
123
+ <line style="opacity: 50%" x1="20.711" y1="10.212" x2="21.563" y2="11.063"/>
124
+ <line style="opacity: 50%" x1="14.205" y1="7.5" x2="13.001" y2="7.5"/>
125
+ <line style="opacity: 50%" x1="21.795" y1="7.5" x2="23" y2="7.5"/>
126
+ <line style="opacity: 50%" x1="15.316" y1="10.184" x2="14.464" y2="11.036"/>
127
+ <line style="opacity: 50%" x1="20.711" y1="4.789" x2="21.563" y2="3.937"/>
128
+ <circle style="opacity: 50%" cx="18" cy="7.5" r="2.169"/>
129
+ </svg>
130
+ </symbol>
131
+ <symbol id="svg-pencil" viewBox="0 0 24 24">
132
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
133
+ stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-pencil-code">
134
+ <path d="M4 20h4l10.5 -10.5a2.828 2.828 0 1 0 -4 -4l-10.5 10.5v4" />
135
+ <path d="M13.5 6.5l4 4" />
136
+ <path d="M20 21l2 -2l-2 -2" />
137
+ <path d="M17 17l-2 2l2 2" />
138
+ </svg>
139
+ </symbol>
140
+ <symbol id="svg-eye" viewBox="0 0 24 24">
141
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
142
+ stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-eye-code">
143
+ <path stroke="none" d="M0 0h24v24H0z" fill="none" />
144
+ <path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" />
145
+ <path
146
+ d="M11.11 17.958c-3.209 -.307 -5.91 -2.293 -8.11 -5.958c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6c-.21 .352 -.427 .688 -.647 1.008" />
147
+ <path d="M20 21l2 -2l-2 -2" />
148
+ <path d="M17 17l-2 2l2 2" />
149
+ </svg>
150
+ </symbol>
151
+ </svg>
152
+
153
+ <input type="checkbox" class="sidebar-toggle" name="__navigation" id="__navigation">
154
+ <input type="checkbox" class="sidebar-toggle" name="__toc" id="__toc">
155
+ <label class="overlay sidebar-overlay" for="__navigation">
156
+ <div class="visually-hidden">Hide navigation sidebar</div>
157
+ </label>
158
+ <label class="overlay toc-overlay" for="__toc">
159
+ <div class="visually-hidden">Hide table of contents sidebar</div>
160
+ </label>
161
+
162
+ <a class="skip-to-content muted-link" href="#furo-main-content">Skip to content</a>
163
+
164
+
165
+
166
+ <div class="page">
167
+ <header class="mobile-header">
168
+ <div class="header-left">
169
+ <label class="nav-overlay-icon" for="__navigation">
170
+ <div class="visually-hidden">Toggle site navigation sidebar</div>
171
+ <i class="icon"><svg><use href="#svg-menu"></use></svg></i>
172
+ </label>
173
+ </div>
174
+ <div class="header-center">
175
+ <a href="../../../index.html"><div class="brand">MindRoot 9.10.0 documentation</div></a>
176
+ </div>
177
+ <div class="header-right">
178
+ <div class="theme-toggle-container theme-toggle-header">
179
+ <button class="theme-toggle">
180
+ <div class="visually-hidden">Toggle Light / Dark / Auto color theme</div>
181
+ <svg class="theme-icon-when-auto-light"><use href="#svg-sun-with-moon"></use></svg>
182
+ <svg class="theme-icon-when-auto-dark"><use href="#svg-moon-with-sun"></use></svg>
183
+ <svg class="theme-icon-when-dark"><use href="#svg-moon"></use></svg>
184
+ <svg class="theme-icon-when-light"><use href="#svg-sun"></use></svg>
185
+ </button>
186
+ </div>
187
+ <label class="toc-overlay-icon toc-header-icon no-toc" for="__toc">
188
+ <div class="visually-hidden">Toggle table of contents sidebar</div>
189
+ <i class="icon"><svg><use href="#svg-toc"></use></svg></i>
190
+ </label>
191
+ </div>
192
+ </header>
193
+ <aside class="sidebar-drawer">
194
+ <div class="sidebar-container">
195
+
196
+ <div class="sidebar-sticky"><a class="sidebar-brand" href="../../../index.html">
197
+
12
198
 
13
- <script src="../../../_static/jquery.js?v=5d32c60e"></script>
14
- <script src="../../../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
15
- <script src="../../../_static/documentation_options.js?v=3c16008f"></script>
16
- <script src="../../../_static/doctools.js?v=9bcbadda"></script>
17
- <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
18
- <script src="../../../_static/js/theme.js"></script>
19
- <link rel="index" title="Index" href="../../../genindex.html" />
20
- <link rel="search" title="Search" href="../../../search.html" />
21
- </head>
22
-
23
- <body class="wy-body-for-nav">
24
- <div class="wy-grid-for-nav">
25
- <nav data-toggle="wy-nav-shift" class="wy-nav-side">
26
- <div class="wy-side-scroll">
27
- <div class="wy-side-nav-search" style="background: #343131" >
199
+ </a><form class="sidebar-search-container" method="get" action="../../../search.html" role="search">
200
+ <input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
201
+ <input type="hidden" name="check_keywords" value="yes">
202
+ <input type="hidden" name="area" value="default">
203
+ </form>
204
+ <div id="searchbox"></div><div class="sidebar-scroll"><div class="sidebar-tree">
205
+ <p class="caption" role="heading"><span class="caption-text">User Documentation:</span></p>
206
+ <ul>
207
+ <li class="toctree-l1 has-children"><a class="reference internal" href="../../../user_documentation.html">User Documentation</a><input class="toctree-checkbox" id="toctree-checkbox-1" name="toctree-checkbox-1" role="switch" type="checkbox"/><label for="toctree-checkbox-1"><div class="visually-hidden">Toggle navigation of User Documentation</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul>
208
+ <li class="toctree-l2"><a class="reference internal" href="../../../installation.html">Installation</a></li>
209
+ <li class="toctree-l2"><a class="reference internal" href="../../../starting_mindroot.html">Starting MindRoot</a></li>
210
+ <li class="toctree-l2"><a class="reference internal" href="../../../llm_plugin_installation.html">LLM Plugin Installation</a></li>
211
+ <li class="toctree-l2"><a class="reference internal" href="../../../llm_api_key.html">LLM API Key</a></li>
212
+ <li class="toctree-l2"><a class="reference internal" href="../../../chat_with_assistant.html">Chat with Assistant</a></li>
213
+ <li class="toctree-l2"><a class="reference internal" href="../../../install_plugins_with_tools.html">Install Plugins with Tools</a></li>
214
+ <li class="toctree-l2"><a class="reference internal" href="../../../programming_task.html">Give Assistant a Programming Task</a></li>
215
+ </ul>
216
+ </li>
217
+ </ul>
218
+ <p class="caption" role="heading"><span class="caption-text">Developer Documentation:</span></p>
219
+ <ul>
220
+ <li class="toctree-l1"><a class="reference internal" href="../../../developer_documentation.html">Developer Documentation</a></li>
221
+ </ul>
28
222
 
29
-
30
-
31
- <a href="../../../index.html" class="icon icon-home">
32
- MindRoot
33
- </a>
34
- <div role="search">
35
- <form id="rtd-search-form" class="wy-form" action="../../../search.html" method="get">
36
- <input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
37
- <input type="hidden" name="check_keywords" value="yes" />
38
- <input type="hidden" name="area" value="default" />
39
- </form>
40
223
  </div>
41
- </div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
42
- <!-- Local TOC -->
43
- <div class="local-toc"></div>
44
- </div>
45
- </div>
46
- </nav>
47
-
48
- <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" style="background: #343131" >
49
- <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
50
- <a href="../../../index.html">MindRoot</a>
51
- </nav>
52
-
53
- <div class="wy-nav-content">
54
- <div class="rst-content">
55
- <div role="navigation" aria-label="Page navigation">
56
- <ul class="wy-breadcrumbs">
57
- <li><a href="../../../index.html" class="icon icon-home" aria-label="Home"></a></li>
58
- <li class="breadcrumb-item"><a href="../../index.html">Module code</a></li>
59
- <li class="breadcrumb-item active">mindroot.lib.templates</li>
60
- <li class="wy-breadcrumbs-aside">
61
- </li>
62
- </ul>
63
- <hr/>
64
224
  </div>
65
- <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
66
- <div itemprop="articleBody">
67
-
68
- <h1>Source code for mindroot.lib.templates</h1><div class="highlight"><pre>
225
+
226
+ </div>
227
+
228
+ </div>
229
+ </aside>
230
+ <div class="main">
231
+ <div class="content">
232
+ <div class="article-container">
233
+ <a href="#" class="back-to-top muted-link">
234
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
235
+ <path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12z"></path>
236
+ </svg>
237
+ <span>Back to top</span>
238
+ </a>
239
+ <div class="content-icon-container">
240
+ <div class="theme-toggle-container theme-toggle-content">
241
+ <button class="theme-toggle">
242
+ <div class="visually-hidden">Toggle Light / Dark / Auto color theme</div>
243
+ <svg class="theme-icon-when-auto-light"><use href="#svg-sun-with-moon"></use></svg>
244
+ <svg class="theme-icon-when-auto-dark"><use href="#svg-moon-with-sun"></use></svg>
245
+ <svg class="theme-icon-when-dark"><use href="#svg-moon"></use></svg>
246
+ <svg class="theme-icon-when-light"><use href="#svg-sun"></use></svg>
247
+ </button>
248
+ </div>
249
+ <label class="toc-overlay-icon toc-content-icon no-toc" for="__toc">
250
+ <div class="visually-hidden">Toggle table of contents sidebar</div>
251
+ <i class="icon"><svg><use href="#svg-toc"></use></svg></i>
252
+ </label>
253
+ </div>
254
+ <article role="main" id="furo-main-content">
255
+ <h1>Source code for mindroot.lib.templates</h1><div class="highlight"><pre>
69
256
  <span></span><span class="kn">import</span><span class="w"> </span><span class="nn">os</span>
70
257
  <span class="kn">import</span><span class="w"> </span><span class="nn">logging</span>
71
258
  <span class="kn">from</span><span class="w"> </span><span class="nn">jinja2</span><span class="w"> </span><span class="kn">import</span> <span class="n">Environment</span><span class="p">,</span> <span class="n">FileSystemLoader</span><span class="p">,</span> <span class="n">ChoiceLoader</span>
259
+ <span class="kn">import</span><span class="w"> </span><span class="nn">re</span>
72
260
  <span class="kn">from</span><span class="w"> </span><span class="nn">.plugins</span><span class="w"> </span><span class="kn">import</span> <span class="n">list_enabled</span><span class="p">,</span> <span class="n">get_plugin_path</span>
73
261
  <span class="kn">from</span><span class="w"> </span><span class="nn">.parent_templates</span><span class="w"> </span><span class="kn">import</span> <span class="n">get_parent_templates_env</span>
74
262
  <span class="kn">import</span><span class="w"> </span><span class="nn">traceback</span>
@@ -313,6 +501,7 @@
313
501
  <span class="k">return</span> <span class="n">alt_path</span>
314
502
  <span class="k">return</span> <span class="kc">None</span></div>
315
503
 
504
+
316
505
  <div class="viewcode-block" id="find_plugin_template">
317
506
  <a class="viewcode-back" href="../../../source/mindroot.lib.html#mindroot.lib.templates.find_plugin_template">[docs]</a>
318
507
  <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">find_plugin_template</span><span class="p">(</span><span class="n">page_name</span><span class="p">,</span> <span class="n">plugins</span><span class="p">):</span>
@@ -397,9 +586,6 @@
397
586
  <span class="c1">#print(f&quot;Found inject template at: {path}&quot;)</span>
398
587
  <span class="n">templates</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s1">&#39;type&#39;</span><span class="p">:</span> <span class="s1">&#39;inject&#39;</span><span class="p">,</span> <span class="s1">&#39;template&#39;</span><span class="p">:</span> <span class="n">env</span><span class="o">.</span><span class="n">from_string</span><span class="p">(</span><span class="n">content</span><span class="p">)})</span>
399
588
  <span class="k">break</span>
400
- <span class="c1">#else:</span>
401
- <span class="c1">#</span>
402
- <span class="c1"># print(f&quot;Inject template not found at: {path}&quot;)</span>
403
589
 
404
590
  <span class="c1"># Check override templates</span>
405
591
  <span class="n">override_paths</span> <span class="o">=</span> <span class="p">[</span>
@@ -414,8 +600,16 @@
414
600
  <span class="c1"># Load template content with translation support</span>
415
601
  <span class="n">content</span> <span class="o">=</span> <span class="n">load_template_with_translation</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
416
602
  <span class="k">if</span> <span class="n">content</span><span class="p">:</span>
417
- <span class="c1">#print(f&quot;Found override template at: {path}&quot;)</span>
418
- <span class="n">templates</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s1">&#39;type&#39;</span><span class="p">:</span> <span class="s1">&#39;override&#39;</span><span class="p">,</span> <span class="s1">&#39;template&#39;</span><span class="p">:</span> <span class="n">env</span><span class="o">.</span><span class="n">from_string</span><span class="p">(</span><span class="n">content</span><span class="p">)})</span>
603
+ <span class="c1"># Detect top-of-file pragma to assume unspecified blocks are blank</span>
604
+ <span class="c1"># Accepted forms (case-insensitive):</span>
605
+ <span class="c1"># {# assume-blank #}, {# assume_blank #}, {# assume-blank: true #}, {# assume_blank: true #}</span>
606
+ <span class="n">assume_blank</span> <span class="o">=</span> <span class="kc">False</span>
607
+ <span class="n">head</span> <span class="o">=</span> <span class="n">content</span><span class="p">[:</span><span class="mi">2048</span><span class="p">]</span>
608
+ <span class="n">pragma_re</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;^\s*\{#\s*(assume[-_]blank)(?:\s*true)?\s*#\}\s*&quot;</span><span class="p">,</span> <span class="n">re</span><span class="o">.</span><span class="n">IGNORECASE</span> <span class="o">|</span> <span class="n">re</span><span class="o">.</span><span class="n">MULTILINE</span><span class="p">)</span>
609
+ <span class="k">if</span> <span class="n">pragma_re</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">head</span><span class="p">):</span>
610
+ <span class="n">assume_blank</span> <span class="o">=</span> <span class="kc">True</span>
611
+ <span class="n">content</span> <span class="o">=</span> <span class="n">pragma_re</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="n">content</span><span class="p">,</span> <span class="n">count</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
612
+ <span class="n">templates</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s1">&#39;type&#39;</span><span class="p">:</span> <span class="s1">&#39;override&#39;</span><span class="p">,</span> <span class="s1">&#39;template&#39;</span><span class="p">:</span> <span class="n">env</span><span class="o">.</span><span class="n">from_string</span><span class="p">(</span><span class="n">content</span><span class="p">),</span> <span class="s1">&#39;assume_blank&#39;</span><span class="p">:</span> <span class="n">assume_blank</span><span class="p">})</span>
419
613
  <span class="k">break</span>
420
614
 
421
615
  <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
@@ -426,7 +620,7 @@
426
620
 
427
621
  <div class="viewcode-block" id="collect_content">
428
622
  <a class="viewcode-back" href="../../../source/mindroot.lib.html#mindroot.lib.templates.collect_content">[docs]</a>
429
- <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">collect_content</span><span class="p">(</span><span class="n">template</span><span class="p">,</span> <span class="n">blocks</span><span class="p">,</span> <span class="n">template_type</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
623
+ <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">collect_content</span><span class="p">(</span><span class="n">template</span><span class="p">,</span> <span class="n">blocks</span><span class="p">,</span> <span class="n">template_type</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">assume_blank</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
430
624
  <span class="w"> </span><span class="sd">&quot;&quot;&quot;Collect content from child templates.</span>
431
625
  <span class="sd"> </span>
432
626
  <span class="sd"> Args:</span>
@@ -434,19 +628,30 @@
434
628
  <span class="sd"> blocks (list): List of block names</span>
435
629
  <span class="sd"> template_type (str): Type of template (&#39;inject&#39; or &#39;override&#39;)</span>
436
630
  <span class="sd"> data (dict): Template context data</span>
631
+ <span class="sd"> assume_blank (bool): If True and type is &#39;override&#39;, unspecified blocks are blanked</span>
437
632
  <span class="sd"> </span>
438
633
  <span class="sd"> Returns:</span>
439
634
  <span class="sd"> dict: Collected content by block</span>
440
635
  <span class="sd"> &quot;&quot;&quot;</span>
441
636
  <span class="n">content</span> <span class="o">=</span> <span class="p">{</span><span class="n">block</span><span class="p">:</span> <span class="p">{</span><span class="s1">&#39;inject&#39;</span><span class="p">:</span> <span class="p">[],</span> <span class="s1">&#39;override&#39;</span><span class="p">:</span> <span class="kc">None</span><span class="p">}</span> <span class="k">for</span> <span class="n">block</span> <span class="ow">in</span> <span class="n">blocks</span><span class="p">}</span>
637
+
638
+ <span class="c1"># Get blocks that are actually defined in this template</span>
639
+ <span class="n">defined_blocks</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">template</span><span class="o">.</span><span class="n">blocks</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span>
640
+
442
641
  <span class="k">for</span> <span class="n">block</span> <span class="ow">in</span> <span class="n">blocks</span><span class="p">:</span>
443
- <span class="k">if</span> <span class="n">block</span> <span class="ow">in</span> <span class="n">template</span><span class="o">.</span><span class="n">blocks</span><span class="p">:</span>
642
+ <span class="k">if</span> <span class="n">block</span> <span class="ow">in</span> <span class="n">defined_blocks</span><span class="p">:</span>
643
+ <span class="c1"># Block is explicitly defined in the template</span>
444
644
  <span class="n">block_content</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">template</span><span class="o">.</span><span class="n">blocks</span><span class="p">[</span><span class="n">block</span><span class="p">](</span><span class="n">template</span><span class="o">.</span><span class="n">new_context</span><span class="p">(</span><span class="n">data</span><span class="p">)))</span>
445
-
645
+
446
646
  <span class="k">if</span> <span class="n">template_type</span> <span class="o">==</span> <span class="s1">&#39;override&#39;</span><span class="p">:</span>
447
647
  <span class="n">content</span><span class="p">[</span><span class="n">block</span><span class="p">][</span><span class="s1">&#39;override&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">block_content</span>
448
648
  <span class="k">else</span><span class="p">:</span>
449
649
  <span class="n">content</span><span class="p">[</span><span class="n">block</span><span class="p">][</span><span class="s1">&#39;inject&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">block_content</span><span class="p">)</span>
650
+ <span class="k">elif</span> <span class="n">template_type</span> <span class="o">==</span> <span class="s1">&#39;override&#39;</span> <span class="ow">and</span> <span class="n">assume_blank</span><span class="p">:</span>
651
+ <span class="c1"># Block is NOT defined in override template, but assume_blank is True</span>
652
+ <span class="c1"># So we treat it as if it was defined but empty</span>
653
+ <span class="n">content</span><span class="p">[</span><span class="n">block</span><span class="p">][</span><span class="s1">&#39;override&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
654
+
450
655
  <span class="k">return</span> <span class="n">content</span></div>
451
656
 
452
657
 
@@ -463,6 +668,35 @@
463
668
  <span class="sd"> Returns:</span>
464
669
  <span class="sd"> str: Rendered HTML</span>
465
670
  <span class="sd"> &quot;&quot;&quot;</span>
671
+ <span class="c1"># Check for assume-blank pragma and render directly if found</span>
672
+ <span class="k">for</span> <span class="n">plugin</span> <span class="ow">in</span> <span class="n">plugins</span><span class="p">:</span>
673
+ <span class="n">plugin_path</span> <span class="o">=</span> <span class="n">get_plugin_path</span><span class="p">(</span><span class="n">plugin</span><span class="p">)</span>
674
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">plugin_path</span><span class="p">:</span>
675
+ <span class="k">continue</span>
676
+
677
+ <span class="n">last_part</span> <span class="o">=</span> <span class="n">plugin_path</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">)[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
678
+ <span class="n">override_paths</span> <span class="o">=</span> <span class="p">[</span>
679
+ <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">plugin_path</span><span class="p">,</span> <span class="s1">&#39;override&#39;</span><span class="p">,</span> <span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="n">page_name</span><span class="si">}</span><span class="s1">.jinja2&#39;</span><span class="p">),</span>
680
+ <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">plugin_path</span><span class="p">,</span> <span class="s1">&#39;src&#39;</span><span class="p">,</span> <span class="n">plugin</span><span class="p">,</span> <span class="s1">&#39;override&#39;</span><span class="p">,</span> <span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="n">page_name</span><span class="si">}</span><span class="s1">.jinja2&#39;</span><span class="p">),</span>
681
+ <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">plugin_path</span><span class="p">,</span> <span class="s1">&#39;src&#39;</span><span class="p">,</span> <span class="s1">&#39;override&#39;</span><span class="p">,</span> <span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="n">page_name</span><span class="si">}</span><span class="s1">.jinja2&#39;</span><span class="p">),</span>
682
+ <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">plugin_path</span><span class="p">,</span> <span class="s1">&#39;src&#39;</span><span class="p">,</span> <span class="n">last_part</span><span class="p">,</span> <span class="s1">&#39;override&#39;</span><span class="p">,</span> <span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="n">page_name</span><span class="si">}</span><span class="s1">.jinja2&#39;</span><span class="p">)</span>
683
+ <span class="p">]</span>
684
+
685
+ <span class="k">for</span> <span class="n">path</span> <span class="ow">in</span> <span class="n">override_paths</span><span class="p">:</span>
686
+ <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">path</span><span class="p">):</span>
687
+ <span class="n">content</span> <span class="o">=</span> <span class="n">load_template_with_translation</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
688
+ <span class="k">if</span> <span class="n">content</span><span class="p">:</span>
689
+ <span class="c1"># Check for assume-blank pragma</span>
690
+ <span class="n">head</span> <span class="o">=</span> <span class="n">content</span><span class="p">[:</span><span class="mi">2048</span><span class="p">]</span>
691
+ <span class="n">pragma_re</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;^\s*\{#\s*(assume[-_]blank)(?:\s*true)?\s*#\}\s*&quot;</span><span class="p">,</span> <span class="n">re</span><span class="o">.</span><span class="n">IGNORECASE</span> <span class="o">|</span> <span class="n">re</span><span class="o">.</span><span class="n">MULTILINE</span><span class="p">)</span>
692
+ <span class="k">if</span> <span class="n">pragma_re</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">head</span><span class="p">):</span>
693
+ <span class="c1"># Found assume-blank! Just render this template directly</span>
694
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Found assume-blank pragma in </span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">, rendering directly without parent&quot;</span><span class="p">)</span>
695
+ <span class="n">content</span> <span class="o">=</span> <span class="n">pragma_re</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="n">content</span><span class="p">,</span> <span class="n">count</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> <span class="c1"># Remove pragma</span>
696
+ <span class="n">template</span> <span class="o">=</span> <span class="n">env</span><span class="o">.</span><span class="n">from_string</span><span class="p">(</span><span class="n">content</span><span class="p">)</span>
697
+ <span class="k">return</span> <span class="n">template</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="o">**</span><span class="n">context</span><span class="p">)</span> <span class="c1"># Return early!</span>
698
+
699
+ <span class="c1"># If no assume-blank pragma found, continue with normal processing</span>
466
700
  <span class="c1"># Load parent template with translation support</span>
467
701
  <span class="n">parent_template</span> <span class="o">=</span> <span class="kc">None</span>
468
702
  <span class="n">parent_template_path</span> <span class="o">=</span> <span class="kc">None</span>
@@ -507,21 +741,23 @@
507
741
 
508
742
  <span class="k">for</span> <span class="n">child_template_info</span> <span class="ow">in</span> <span class="n">child_templates</span><span class="p">:</span>
509
743
  <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;calling collect_content&quot;</span><span class="p">)</span>
744
+ <span class="c1"># Pass assume_blank flag to collect_content</span>
510
745
  <span class="n">child_content</span> <span class="o">=</span> <span class="k">await</span> <span class="n">collect_content</span><span class="p">(</span>
511
746
  <span class="n">child_template_info</span><span class="p">[</span><span class="s1">&#39;template&#39;</span><span class="p">],</span>
512
747
  <span class="n">parent_blocks</span><span class="p">,</span>
513
748
  <span class="n">child_template_info</span><span class="p">[</span><span class="s1">&#39;type&#39;</span><span class="p">],</span>
514
- <span class="n">context</span>
749
+ <span class="n">context</span><span class="p">,</span>
750
+ <span class="n">child_template_info</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;assume_blank&#39;</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
515
751
  <span class="p">)</span>
516
752
  <span class="k">for</span> <span class="n">block</span><span class="p">,</span> <span class="n">content</span> <span class="ow">in</span> <span class="n">child_content</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
517
- <span class="k">if</span> <span class="n">content</span><span class="p">[</span><span class="s1">&#39;override&#39;</span><span class="p">]:</span>
753
+ <span class="k">if</span> <span class="n">content</span><span class="p">[</span><span class="s1">&#39;override&#39;</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> <span class="c1"># Check for None specifically, empty string is valid</span>
518
754
  <span class="n">all_content</span><span class="p">[</span><span class="n">block</span><span class="p">][</span><span class="s1">&#39;override&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">content</span><span class="p">[</span><span class="s1">&#39;override&#39;</span><span class="p">]</span>
519
755
  <span class="k">else</span><span class="p">:</span>
520
756
  <span class="n">all_content</span><span class="p">[</span><span class="n">block</span><span class="p">][</span><span class="s1">&#39;inject&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">content</span><span class="p">[</span><span class="s1">&#39;inject&#39;</span><span class="p">])</span>
521
757
 
522
758
  <span class="n">combined_template_str</span> <span class="o">=</span> <span class="s1">&#39;{</span><span class="si">% e</span><span class="s1">xtends layout_template %}</span><span class="se">\n</span><span class="s1">&#39;</span>
523
759
  <span class="k">for</span> <span class="n">block</span> <span class="ow">in</span> <span class="n">all_content</span><span class="p">:</span>
524
- <span class="k">if</span> <span class="n">all_content</span><span class="p">[</span><span class="n">block</span><span class="p">][</span><span class="s1">&#39;override&#39;</span><span class="p">]:</span>
760
+ <span class="k">if</span> <span class="n">all_content</span><span class="p">[</span><span class="n">block</span><span class="p">][</span><span class="s1">&#39;override&#39;</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> <span class="c1"># Check for None, empty string is valid override</span>
525
761
  <span class="n">combined_template_str</span> <span class="o">+=</span> <span class="sa">f</span><span class="s1">&#39;</span><span class="se">{{</span><span class="s1">% block </span><span class="si">{</span><span class="n">block</span><span class="si">}</span><span class="s1"> %</span><span class="se">}}\n</span><span class="s1"> </span><span class="se">{{{{</span><span class="s1"> combined_</span><span class="si">{</span><span class="n">block</span><span class="si">}</span><span class="s1">_override|safe </span><span class="se">}}}}\n{{</span><span class="s1">% endblock %</span><span class="se">}}\n</span><span class="s1">&#39;</span>
526
762
  <span class="k">else</span><span class="p">:</span>
527
763
  <span class="n">combined_template_str</span> <span class="o">+=</span> <span class="sa">f</span><span class="s1">&#39;</span><span class="se">{{</span><span class="s1">% block </span><span class="si">{</span><span class="n">block</span><span class="si">}</span><span class="s1"> %</span><span class="se">}}\n</span><span class="s1"> </span><span class="se">{{{{</span><span class="s1"> super() </span><span class="se">}}}}\n</span><span class="s1"> </span><span class="se">{{{{</span><span class="s1"> combined_</span><span class="si">{</span><span class="n">block</span><span class="si">}</span><span class="s1">_inject|safe </span><span class="se">}}}}\n{{</span><span class="s1">% endblock %</span><span class="se">}}\n</span><span class="s1">&#39;</span>
@@ -543,7 +779,7 @@
543
779
  <span class="k">else</span><span class="p">:</span>
544
780
  <span class="n">combined_inject</span><span class="p">[</span><span class="sa">f</span><span class="s1">&#39;combined_</span><span class="si">{</span><span class="n">block</span><span class="si">}</span><span class="s1">_inject&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
545
781
 
546
- <span class="k">if</span> <span class="s1">&#39;override&#39;</span> <span class="ow">in</span> <span class="n">content</span> <span class="ow">and</span> <span class="n">content</span><span class="p">[</span><span class="s1">&#39;override&#39;</span><span class="p">]:</span>
782
+ <span class="k">if</span> <span class="s1">&#39;override&#39;</span> <span class="ow">in</span> <span class="n">content</span> <span class="ow">and</span> <span class="n">content</span><span class="p">[</span><span class="s1">&#39;override&#39;</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
547
783
  <span class="n">combined_override</span><span class="p">[</span><span class="sa">f</span><span class="s1">&#39;combined_</span><span class="si">{</span><span class="n">block</span><span class="si">}</span><span class="s1">_override&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">content</span><span class="p">[</span><span class="s1">&#39;override&#39;</span><span class="p">]</span>
548
784
 
549
785
  <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;in render combined, context is&quot;</span><span class="p">,</span> <span class="n">context</span><span class="p">)</span>
@@ -646,32 +882,40 @@
646
882
  <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;&lt;h1&gt;Error Rendering Page&lt;/h1&gt;&lt;p&gt;</span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&lt;/p&gt;&lt;pre&gt;</span><span class="si">{</span><span class="n">trace</span><span class="si">}</span><span class="s2">&lt;/pre&gt;&quot;</span></div>
647
883
 
648
884
  </pre></div>
649
-
650
- </div>
885
+ </article>
886
+ </div>
887
+ <footer>
888
+
889
+ <div class="related-pages">
890
+
891
+
892
+ </div>
893
+ <div class="bottom-of-page">
894
+ <div class="left-details">
895
+ <div class="copyright">
896
+ Copyright &#169; 2025, Jason Livesay
897
+ </div>
898
+ Made with <a href="https://www.sphinx-doc.org/">Sphinx</a> and <a class="muted-link" href="https://pradyunsg.me">@pradyunsg</a>'s
899
+
900
+ <a href="https://github.com/pradyunsg/furo">Furo</a>
901
+
902
+ </div>
903
+ <div class="right-details">
904
+
651
905
  </div>
652
- <footer>
653
-
654
- <hr/>
655
-
656
- <div role="contentinfo">
657
- <p>&#169; Copyright 2025, Jason Livesay.</p>
658
- </div>
659
-
660
- Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
661
- <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
662
- provided by <a href="https://readthedocs.org">Read the Docs</a>.
663
-
664
-
665
- </footer>
666
906
  </div>
667
- </div>
668
- </section>
907
+
908
+ </footer>
909
+ </div>
910
+ <aside class="toc-drawer no-toc">
911
+
912
+
913
+
914
+ </aside>
669
915
  </div>
670
- <script>
671
- jQuery(function () {
672
- SphinxRtdTheme.Navigation.enable(true);
673
- });
674
- </script>
675
-
676
- </body>
916
+ </div><script src="../../../_static/documentation_options.js?v=3c16008f"></script>
917
+ <script src="../../../_static/doctools.js?v=9bcbadda"></script>
918
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
919
+ <script src="../../../_static/scripts/furo.js?v=46bd48cc"></script>
920
+ </body>
677
921
  </html>