Skip to content

Commit c494de9

Browse files
namespace the slot templatetag to avoid collisions (#23)
1 parent aad9022 commit c494de9

File tree

3 files changed

+62
-50
lines changed

3 files changed

+62
-50
lines changed

docs/slots.md

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ Every component in django-bird has a default slot.
99
There are three ways to reference this default slot in your component template:
1010

1111
1. `{{ slot }}`
12-
2. `{% slot %}{% endslot %}`
13-
3. `{% slot default %}{% endslot %}`
12+
2. `{% bird:slot %}{% endbird:slot %}`
13+
3. `{% bird:slot default %}{% endbird:slot %}`
1414

1515
These are all equivalent and will render the content placed between the opening and closing tags of your component when it's used. Let's look at each approach:
1616

@@ -24,25 +24,25 @@ Using `{{ slot }}`:
2424
</button>
2525
```
2626

27-
Alternatively, you can use `{% slot %}{% endslot %}`:
27+
Alternatively, you can use `{% bird:slot %}{% endbird:slot %}`:
2828

2929
```{code-block} htmldjango
3030
:caption: templates/bird/button.html
3131
3232
<button>
33-
{% slot %}
34-
{% endslot %}
33+
{% bird:slot %}
34+
{% endbird:slot %}
3535
</button>
3636
```
3737

38-
Or, you can explicitly name the default slot with `{% slot default %}{% endslot %}`:
38+
Or, you can explicitly name the default slot with `{% bird:slot default %}{% endbird:slot %}`:
3939

4040
```{code-block} htmldjango
4141
:caption: templates/bird/button.html
4242
4343
<button>
44-
{% slot default %}
45-
{% endslot %}
44+
{% bird:slot default %}
45+
{% endbird:slot %}
4646
</button>
4747
```
4848

@@ -76,8 +76,8 @@ Here's a basic example of a component with a named slot:
7676
:caption: templates/bird/button.html
7777
7878
<button>
79-
{% slot leading-icon %}
80-
{% endslot %}
79+
{% bird:slot leading-icon %}
80+
{% endbird:slot %}
8181
{{ slot }} {# This is the default slot #}
8282
</button>
8383
```
@@ -86,9 +86,9 @@ To use this component with a named slot:
8686

8787
```htmldjango
8888
{% bird button %}
89-
{% slot leading-icon %}
89+
{% bird:slot leading-icon %}
9090
<i class="icon-star"></i>
91-
{% endslot %}
91+
{% endbird:slot %}
9292
Click me {# This content goes into the default slot #}
9393
{% endbird %}
9494
```
@@ -114,8 +114,8 @@ Here's an example of how you might use this:
114114
<button{% if slots.leading-icon %} class="with-icon"{% endif %}>
115115
{% if slots.leading-icon %}
116116
<span class="icon">
117-
{% slot leading-icon %}
118-
{% endslot %}
117+
{% bird:slot leading-icon %}
118+
{% endbird:slot %}
119119
</span>
120120
{% endif %}
121121
@@ -143,9 +143,9 @@ But if you include the `leading-icon` slot:
143143

144144
```htmldjango
145145
{% bird button %}
146-
{% slot leading-icon %}
146+
{% bird:slot leading-icon %}
147147
<i class="icon-star"></i>
148-
{% endslot %}
148+
{% endbird:slot %}
149149
150150
Click me
151151
{% endbird %}
@@ -173,8 +173,8 @@ You can define as many named slots as you need in a component. Here's an example
173173
<div class="card">
174174
{% if slots.header %}
175175
<div class="card-header">
176-
{% slot header %}
177-
{% endslot %}
176+
{% bird:slot header %}
177+
{% endbird:slot %}
178178
</div>
179179
{% endif %}
180180
@@ -192,7 +192,7 @@ You can define as many named slots as you need in a component. Here's an example
192192

193193
Note the different approaches used here:
194194

195-
1. For the `header`, we use the `{% slot header %}{% endslot %}` syntax.
195+
1. For the `header`, we use the `{% bird:slot header %}{% endbird:slot %}` syntax.
196196
2. For the main content, we use the `{{ slot }}` syntax for the default slot.
197197
3. For the `footer`, we directly reference `{{ slots.footer }}`.
198198

@@ -202,15 +202,15 @@ This allows for very flexible usage of the component:
202202

203203
```htmldjango
204204
{% bird card %}
205-
{% slot header %}
205+
{% bird:slot header %}
206206
Card Title
207-
{% endslot %}
207+
{% endbird:slot %}
208208
209209
This is the main content of the card.
210210
211-
{% slot footer %}
211+
{% bird:slot footer %}
212212
Card Footer
213-
{% endslot %}
213+
{% endbird:slot %}
214214
{% endbird %}
215215
```
216216

@@ -242,15 +242,15 @@ You can provide default content for both named slots and the default slot that w
242242
:caption: templates/bird/button.html
243243
244244
<button>
245-
{% slot leading-icon %}
245+
{% bird:slot leading-icon %}
246246
<span>
247247
Default icon
248248
</span>
249-
{% endslot %}
249+
{% endbird:slot %}
250250
251-
{% slot %}
251+
{% bird:slot %}
252252
Click me
253-
{% endslot %}
253+
{% endbird:slot %}
254254
</button>
255255
```
256256

src/django_bird/templatetags/django_bird.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -168,11 +168,11 @@ def get_template_names(self):
168168
return template_names
169169

170170

171-
@register.tag
172-
def slot(parser: Parser, token: Token) -> SlotNode:
171+
@register.tag("bird:slot")
172+
def do_slot(parser: Parser, token: Token) -> SlotNode:
173173
bits = token.split_contents()
174174
name = parse_slot_name(bits)
175-
nodelist = parser.parse(("endslot",))
175+
nodelist = parser.parse(("endbird:slot",))
176176
parser.delete_first_token()
177177
return SlotNode(name, nodelist)
178178

tests/test_templatetags.py

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -228,28 +228,40 @@ def test_parse_slot_name_no_args(self):
228228
"template,context,expected",
229229
[
230230
("{{ slot }}", {"slot": "test"}, "test"),
231-
("{% slot %}{% endslot %}", {"slot": "test"}, "test"),
232-
("{% slot default %}{% endslot %}", {"slot": "test"}, "test"),
233-
("{% slot 'default' %}{% endslot %}", {"slot": "test"}, "test"),
234-
('{% slot "default" %}{% endslot %}', {"slot": "test"}, "test"),
235-
("{% slot name='default' %}{% endslot %}", {"slot": "test"}, "test"),
236-
('{% slot name="default" %}{% endslot %}', {"slot": "test"}, "test"),
237-
("{% slot name='not-default' %}{% endslot %}", {"slot": "test"}, ""),
231+
("{% bird:slot %}{% endbird:slot %}", {"slot": "test"}, "test"),
232+
("{% bird:slot default %}{% endbird:slot %}", {"slot": "test"}, "test"),
233+
("{% bird:slot 'default' %}{% endbird:slot %}", {"slot": "test"}, "test"),
234+
('{% bird:slot "default" %}{% endbird:slot %}', {"slot": "test"}, "test"),
238235
(
239-
"{% slot outer %}Outer {% slot inner %}Inner{% endslot %} Content{% endslot %}",
236+
"{% bird:slot name='default' %}{% endbird:slot %}",
237+
{"slot": "test"},
238+
"test",
239+
),
240+
(
241+
'{% bird:slot name="default" %}{% endbird:slot %}',
242+
{"slot": "test"},
243+
"test",
244+
),
245+
(
246+
"{% bird:slot name='not-default' %}{% endbird:slot %}",
247+
{"slot": "test"},
248+
"",
249+
),
250+
(
251+
"{% bird:slot outer %}Outer {% bird:slot inner %}Inner{% endbird:slot %} Content{% endbird:slot %}",
240252
{"slots": {"outer": "Replaced Content"}},
241253
"Replaced Content",
242254
),
243255
(
244-
"{% slot outer %}Outer {% slot inner %}Inner{% endslot %} Content{% endslot %}",
256+
"{% bird:slot outer %}Outer {% bird:slot inner %}Inner{% endbird:slot %} Content{% endbird:slot %}",
245257
{"slots": {"inner": "Replaced Content"}},
246258
"Outer Replaced Content Content",
247259
),
248260
(
249-
"{% slot outer %}Outer {% slot inner %}Inner Default{% endslot %} Content{% endslot %}",
261+
"{% bird:slot outer %}Outer {% bird:slot inner %}Inner Default{% endbird:slot %} Content{% endbird:slot %}",
250262
{
251263
"slots": {
252-
"outer": "Replaced {% slot inner %}{% endslot %} Outer",
264+
"outer": "Replaced {% bird:slot inner %}{% endbird:slot %} Outer",
253265
"inner": "Replaced Inner",
254266
},
255267
},
@@ -258,45 +270,45 @@ def test_parse_slot_name_no_args(self):
258270
(
259271
"{{ slot }}",
260272
{
261-
"slot": "Replaced {% slot inner %}{% endslot %} Outer",
273+
"slot": "Replaced {% bird:slot inner %}{% endbird:slot %} Outer",
262274
"slots": {
263275
"inner": "Replaced Inner",
264276
},
265277
},
266278
"Replaced Replaced Inner Outer",
267279
),
268280
(
269-
"{% slot %}{% endslot %}",
281+
"{% bird:slot %}{% endbird:slot %}",
270282
{},
271283
"",
272284
),
273285
(
274-
"{% slot %}Default content{% endslot %}",
286+
"{% bird:slot %}Default content{% endbird:slot %}",
275287
{},
276288
"Default content",
277289
),
278290
(
279-
"{% slot 'mal formed' %}{% endslot %}",
291+
"{% bird:slot 'mal formed' %}{% endbird:slot %}",
280292
{"slots": {"mal formed": "content"}},
281293
"content",
282294
),
283295
(
284-
"{% slot CaseSensitive %}{% endslot %}",
296+
"{% bird:slot CaseSensitive %}{% endbird:slot %}",
285297
{"slots": {"CaseSensitive": "Upper", "casesensitive": "Lower"}},
286298
"Upper",
287299
),
288300
(
289-
"{% slot %}{% endslot %}",
301+
"{% bird:slot %}{% endbird:slot %}",
290302
{"slots": {"default": 42}},
291303
"42",
292304
),
293305
(
294-
"{% slot %}{% endslot %}",
306+
"{% bird:slot %}{% endbird:slot %}",
295307
{"slots": {"default": "<b>Bold</b>"}},
296308
"<b>Bold</b>",
297309
),
298310
(
299-
"{% slot unicode_slot %}{% endslot %}",
311+
"{% bird:slot unicode_slot %}{% endbird:slot %}",
300312
{"slots": {"unicode_slot": "こんにちは"}},
301313
"こんにちは",
302314
),
@@ -310,4 +322,4 @@ def test_rendering(self, template, context, expected, create_bird_template):
310322

311323
def test_too_many_args(self):
312324
with pytest.raises(TemplateSyntaxError):
313-
Template("{% slot too many args %}{% endslot %}")
325+
Template("{% bird:slot too many args %}{% endbird:slot %}")

0 commit comments

Comments
 (0)