{% comment %} Adapted from: https://github.com/allejo/jekyll-toc Required Parameters: * folder_index (int) : '' - the path of the files for the toc to be generated * folder_name (int) : '' - the path of the files for the toc to be generated Optional Parameters: * 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 * class (string) : '' - class to be applied to root toc * item_class (string) : '' - add custom class(es) for each list item; has support for '%level%' placeholder, which is the current heading level * anchor_class (string) : '' - add custom class(es) for each anchor element {% endcomment %} {%- comment -%} Get every page in the site and traverse them {%- endcomment -%} {% assign folder_pages = "" | split: ',' %} {% assign site_pages = site.html_pages %} {% for site_page in site_pages %} {% if site_page.name == 'index.md' or site_page.name == 'index.html' %} {% continue %} {% endif %} {%- comment -%} If folder_name is not passed in, assign all pages to this TOC {%- endcomment -%} {% if include.folder_name == null %} {% assign folder_pages = folder_pages | push: site_page %} {%- comment -%} else, find all pages beloing to this folder name {%- endcomment -%} {% else %} {% assign path_split = site_page.path | split: '/' %} {% if path_split.size == 1 %} {% assign site_page_folder = '/' %} {% else %} {% assign site_page_folder = path_split | first %} {% endif %} {%- comment -%} if site_page_folder corresponds to folder_name passed in and path_split.size is love {%- endcomment -%} {% if site_page_folder == include.folder_name and path_split.size < 3 %} {% assign folder_pages = folder_pages | push: site_page %} {% endif %} {% endif %} {% endfor %} {%- comment -%} Then, if order is present, match order by filename or title {%- endcomment -%} {% assign pages = "" | split: ',' %} {% assign page_order = site.folders[include.folder_index].order %} {% if page_order and page_order.size > 0 %} {% for order in page_order %} {% for folder_page in folder_pages %} {% if folder_page.name == order or folder_page.title == order %} {% assign pages = pages | push: folder_page %} {% break %} {% endif %} {% endfor %} {% endfor %} {% else %} {%- comment -%} Else, sort alphabetically {%- endcomment -%} {% assign pages = folder_pages | sort: 'title' %} {% endif %} {% capture tocWorkspace %} {% capture my_toc %}{% endcapture %} {% assign minHeader = include.h_min | default: 1 %} {% assign maxHeader = include.h_max | default: 6 %} {% assign firstHeader = true %} {% for page in pages %} {% assign nodes = page.content | markdownify | split: ' maxHeader %} {% continue %} {% endif %} {% if firstHeader %} {% assign firstHeader = false %} {% assign minHeader = headerLevel %} {% endif %} {% assign indentAmount = headerLevel | minus: minHeader | add: 1 %} {% assign _workspace = node | split: '' | first }}>{% endcapture %} {% assign header = _workspace[0] | replace: _hAttrToStrip, '' %} {% comment %} Strips out footnotes links then strips out all other html tags This naively assumes that all footnote links are appended at the end of the header {% endcomment %} {% assign header = header | split: ' {{ header }} {% endcapture %} {% endfor %} {% endfor %} {% if include.class %} {% capture my_toc %}{:.{{ include.class }}} {{ my_toc | lstrip }}{% endcapture %} {% endif %} {% endcapture %} {% assign tocWorkspace = '' %}{{ my_toc | markdownify | strip | strip_newlines }}