{% capture tocWorkspace %} {% comment %} Version 1.1.1 forked and modified from version 1.1.0 at https://github.com/allejo/jekyll-toc Usage: {% include toc.html html=content sanitize=true class="inline_toc" id="my_toc" h_min=2 h_max=3 %} Parameters: * html (string) - the HTML of compiled markdown generated by kramdown in Jekyll Optional Parameters: * sanitize (bool) : false - when set to true, the headers will be stripped of any HTML in the TOC * class (string) : '' - a CSS class assigned to the TOC * id (string) : '' - an ID to assigned to the TOC * h_min (int) : 1 - the minimum TOC header level to use; any header lower than this value will be ignored * h_max (int) : 6 - the maximum TOC header level to use; any header greater than this value will be ignored * ordered (bool) : false - when set to true, an ordered list will be outputted instead of an unordered list * item_class (string) : '' - add custom class(es) for each list item; has support for '%level%' placeholder, which is the current heading level * submenu_class (string) : '' - add custom class(es) for each child group of headings; has support for '%level%' placeholder which is the current "submenu" heading level * base_url (string) : '' - add a base url to the TOC links for when your TOC is on another page than the actual content * anchor_class (string) : '' - add custom class(es) for each anchor element * skip_no_ids (bool) : false - skip headers that do not have an `id` attribute Output: An ordered or unordered list representing the table of contents of a markdown block. This snippet will only generate the table of contents and will NOT output the markdown given to it {% endcomment %} {% capture newline %}{% endcapture %} {% assign newline = newline | rstrip %} {% capture jekyll_toc %}{% endcapture %} {% assign orderedList = include.ordered | default: false %} {% assign baseURL = include.base_url | default: include.baseurl | default: '' %} {% assign skipNoIDs = include.skip_no_ids | default: include.skipNoIDs | default: false %} {% assign minHeader = include.h_min | default: 1 %} {% assign maxHeader = include.h_max | default: 6 %} {% assign nodes = include.html | strip | split: ' maxHeader %} {% continue %} {% endif %} {% assign _workspace = node | split: '' | first }}>{% endcapture %} {% assign header = _workspace[0] | replace: _hAttrToStrip, '' %} {% if currLevel > lastLevel %} {% assign currStyleLevel = currStyleLevel | plus: 1 %} {% elsif currLevel < lastLevel %} {% assign difference = lastLevel | minus: currLevel %} {% assign currStyleLevel = currStyleLevel | minus: difference %} {% endif %} {% if include.item_class and include.item_class != blank %} {% capture listItemClass %} class="{{ include.item_class | replace: '%level%', currStyleLevel | split: '.' | join: ' ' }}"{% endcapture %} {% endif %} {% if include.submenu_class and include.submenu_class != blank %} {% assign subMenuLevel = currStyleLevel | minus: 1 %} {% capture subMenuClass %} class="{{ include.submenu_class | replace: '%level%', subMenuLevel | split: '.' | join: ' ' }}"{% endcapture %} {% endif %} {% capture anchorBody %}{% if include.sanitize %}{{ header | strip_html }}{% else %}{{ header }}{% endif %}{% endcapture %} {% if htmlID %} {% capture anchorAttributes %} href="{% if baseURL %}{{ baseURL }}{% endif %}#{{ htmlID }}"{% endcapture %} {% if include.anchor_class %} {% capture anchorAttributes %}{{ anchorAttributes }} class="{{ include.anchor_class | split: '.' | join: ' ' }}"{% endcapture %} {% endif %} {% capture listItem %}{{ anchorBody }}{% endcapture %} {% elsif skipNoIDs == true %} {% continue %} {% else %} {% capture listItem %}{{ anchorBody }}{% endcapture %} {% endif %} {% if currLevel > lastLevel %} {% capture jekyll_toc %}{{ jekyll_toc }}<{{ listModifier }}{{ subMenuClass }}>{% endcapture %} {% elsif currLevel < lastLevel %} {% assign repeatCount = lastLevel | minus: currLevel %} {% for i in (1..repeatCount) %} {% capture jekyll_toc %}{{ jekyll_toc }}{% endcapture %} {% endfor %} {% capture jekyll_toc %}{{ jekyll_toc }}{% endcapture %} {% else %} {% capture jekyll_toc %}{{ jekyll_toc }}{% endcapture %} {% endif %} {% capture jekyll_toc %}{{ jekyll_toc }}{{ listItem }}{% endcapture %} {% assign lastLevel = currLevel %} {% assign firstHeader = false %} {% endfor %} {% assign repeatCount = minHeader | minus: 1 %} {% assign repeatCount = lastLevel | minus: repeatCount %} {% for i in (1..repeatCount) %} {% capture jekyll_toc %}{{ jekyll_toc }}{% endcapture %} {% endfor %} {% if jekyll_toc != '' %} {% assign rootAttributes = '' %} {% if include.class and include.class != blank %} {% capture rootAttributes %} class="{{ include.class | split: '.' | join: ' ' }}"{% endcapture %} {% endif %} {% if include.id and include.id != blank %} {% capture rootAttributes %}{{ rootAttributes }} id="{{ include.id }}"{% endcapture %} {% endif %} {% if rootAttributes %} {% assign nodes = jekyll_toc | split: '>' %} {% capture jekyll_toc %}<{{ listModifier }}{{ rootAttributes }}>{{ nodes | shift | join: '>' }}>{% endcapture %} {% endif %} {% endif %} {% endcapture %}{% assign tocWorkspace = '' %}{{ jekyll_toc }}