I am trying to create a shortcode for bootstrap tabs. I have following HTML structure,
<nav class="nav nav-tabs" id="myTab" role="tablist">
<a class="nav-item nav-link" id="{{ .Get `id` }}-tab" data-toggle="tab" href="#{{ .Get `id` }}" role="tab" aria-controls="{{ .Get `id` }}">
{{ .Get "title" }}
</a>
</nav>
<div class="tab-content" id="nav-tabContent">
<div class="tab-pane fade" id="{{ .Get `id` }}" role="tabpanel" aria-labelledby="{{ .Get `id` }}-tab">
{{ .Inner }}
</div>
</div>
The structure also contains the Hugo placeholder. But the inner part of the code, which is,
<a class="nav-item nav-link" id="{{ .Get `id` }}-tab" data-toggle="tab" href="#{{ .Get `id` }}" role="tab" aria-controls="{{ .Get `id` }}">
{{ .Get "title" }}
</a>
is required multiple times along with the corresponding content div which is,
<div class="tab-pane fade" id="{{ .Get `id` }}" role="tabpanel" aria-labelledby="{{ .Get `id` }}-tab">
{{ .Inner }}
</div>
Now the problem is that I have to pass the id
as an argument of inner structure and should be detached from its parent. I should be able to use shortcode in following way:
{% tabs %}
{% tab id = "tab-1" title = "Tab One" %}
Content in Tab 1
{% \tab %}
{% tab id = "tab-2" title = "Tab Two" %}
Content in Tab 2
{% \tab %}
{% \tabs %}
How can I achieve this?
It's not possible to iterate over the child shortcodes and extract their values in order to include them in the parent shortcode construct.
I suggest you create a custom param in the front matter (call it 'tabs' for instance) and iterate over its values in your 'tags' shortcode:
range .Page.Params.tabs
I know it's redundant and hacky but it's the simplest way to get it working. The other way I know is much more involved and complicated and I am not sure it's worth the effort, but it is fully automated. It involves creating a content page for every tab, ugh.