- /js/main.js - /search.html - /_layouts/default.html - /_layouts/post.html - /_includes/anchor_headings.html - /_config.ymlpull/171/head
@ -0,0 +1,174 @@ | |||||
{% capture headingsWorkspace %} | |||||
{% comment %} | |||||
Copyright (c) 2018 Vladimir "allejo" Jimenez | |||||
Permission is hereby granted, free of charge, to any person | |||||
obtaining a copy of this software and associated documentation | |||||
files (the "Software"), to deal in the Software without | |||||
restriction, including without limitation the rights to use, | |||||
copy, modify, merge, publish, distribute, sublicense, and/or sell | |||||
copies of the Software, and to permit persons to whom the | |||||
Software is furnished to do so, subject to the following | |||||
conditions: | |||||
The above copyright notice and this permission notice shall be | |||||
included in all copies or substantial portions of the Software. | |||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | |||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES | |||||
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | |||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT | |||||
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, | |||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | |||||
OTHER DEALINGS IN THE SOFTWARE. | |||||
{% endcomment %} | |||||
{% comment %} | |||||
Version 1.0.13 | |||||
https://github.com/allejo/jekyll-anchor-headings | |||||
"Be the pull request you wish to see in the world." ~Ben Balter | |||||
Usage: | |||||
{% include anchor_headings.html html=content anchorBody="#" %} | |||||
Parameters: | |||||
* html (string) - the HTML of compiled markdown generated by kramdown in Jekyll | |||||
Optional Parameters: | |||||
* beforeHeading (bool) : false - Set to true if the anchor should be placed _before_ the heading's content | |||||
* headerAttrs (string) : '' - Any custom HTML attributes that will be added to the heading tag; you may NOT use `id`; | |||||
the `%heading%` and `%html_id%` placeholders are available | |||||
* anchorAttrs (string) : '' - Any custom HTML attributes that will be added to the `<a>` tag; you may NOT use `href`, `class` or `title`; | |||||
the `%heading%` and `%html_id%` placeholders are available | |||||
* anchorBody (string) : '' - The content that will be placed inside the anchor; the `%heading%` placeholder is available | |||||
* anchorClass (string) : '' - The class(es) that will be used for each anchor. Separate multiple classes with a space | |||||
* anchorTitle (string) : '' - The `title` attribute that will be used for anchors | |||||
* h_min (int) : 1 - The minimum header level to build an anchor for; any header lower than this value will be ignored | |||||
* h_max (int) : 6 - The maximum header level to build an anchor for; any header greater than this value will be ignored | |||||
* bodyPrefix (string) : '' - Anything that should be inserted inside of the heading tag _before_ its anchor and content | |||||
* bodySuffix (string) : '' - Anything that should be inserted inside of the heading tag _after_ its anchor and content | |||||
* generateId (true) : false - Set to true if a header without id should generate an id to use. | |||||
Output: | |||||
The original HTML with the addition of anchors inside of all of the h1-h6 headings. | |||||
{% endcomment %} | |||||
{% assign minHeader = include.h_min | default: 1 %} | |||||
{% assign maxHeader = include.h_max | default: 6 %} | |||||
{% assign beforeHeading = include.beforeHeading %} | |||||
{% assign headerAttrs = include.headerAttrs %} | |||||
{% assign nodes = include.html | split: '<h' %} | |||||
{% capture edited_headings %}{% endcapture %} | |||||
{% for _node in nodes %} | |||||
{% capture node %}{{ _node | strip }}{% endcapture %} | |||||
{% if node == "" %} | |||||
{% continue %} | |||||
{% endif %} | |||||
{% assign nextChar = node | replace: '"', '' | strip | slice: 0, 1 %} | |||||
{% assign headerLevel = nextChar | times: 1 %} | |||||
<!-- If the level is cast to 0, it means it's not a h1-h6 tag, so let's see if we need to fix it --> | |||||
{% if headerLevel == 0 %} | |||||
<!-- Split up the node based on closing angle brackets and get the first one. --> | |||||
{% assign firstChunk = node | split: '>' | first %} | |||||
<!-- If the first chunk does NOT contain a '<', that means we've broken another HTML tag that starts with 'h' --> | |||||
{% unless firstChunk contains '<' %} | |||||
{% capture node %}<h{{ node }}{% endcapture %} | |||||
{% endunless %} | |||||
{% capture edited_headings %}{{ edited_headings }}{{ node }}{% endcapture %} | |||||
{% continue %} | |||||
{% endif %} | |||||
{% capture _closingTag %}</h{{ headerLevel }}>{% endcapture %} | |||||
{% assign _workspace = node | split: _closingTag %} | |||||
{% capture _hAttrToStrip %}{{ _workspace[0] | split: '>' | first }}>{% endcapture %} | |||||
{% assign header = _workspace[0] | replace: _hAttrToStrip, '' %} | |||||
{% assign escaped_header = header | strip_html | strip %} | |||||
{% assign _classWorkspace = _workspace[0] | split: 'class="' %} | |||||
{% assign _classWorkspace = _classWorkspace[1] | split: '"' %} | |||||
{% assign _html_class = _classWorkspace[0] %} | |||||
{% if _html_class contains "no_anchor" %} | |||||
{% assign skip_anchor = true %} | |||||
{% else %} | |||||
{% assign skip_anchor = false %} | |||||
{% endif %} | |||||
{% assign _idWorkspace = _workspace[0] | split: 'id="' %} | |||||
{% if _idWorkspace[1] %} | |||||
{% assign _idWorkspace = _idWorkspace[1] | split: '"' %} | |||||
{% assign html_id = _idWorkspace[0] %} | |||||
{% assign h_attrs = headerAttrs %} | |||||
{% elsif include.generateId %} | |||||
<!-- If the header did not have an id we create one. --> | |||||
{% assign html_id = escaped_header | slugify %} | |||||
{% if html_id == "" %} | |||||
{% assign html_id = false %} | |||||
{% endif %} | |||||
<!-- Append the generated id to other potential header attributes. --> | |||||
{% capture h_attrs %}{{ headerAttrs }} id="%html_id%"{% endcapture %} | |||||
{% endif %} | |||||
<!-- Build the anchor to inject for our heading --> | |||||
{% capture anchor %}{% endcapture %} | |||||
{% if skip_anchor == false and html_id and headerLevel >= minHeader and headerLevel <= maxHeader %} | |||||
{% if h_attrs %} | |||||
{% capture _hAttrToStrip %}{{ _hAttrToStrip | split: '>' | first }} {{ h_attrs | strip | replace: '%heading%', escaped_header | replace: '%html_id%', html_id }}>{% endcapture %} | |||||
{% endif %} | |||||
{% capture anchor %}href="#{{ html_id }}"{% endcapture %} | |||||
{% if include.anchorClass %} | |||||
{% capture anchor %}{{ anchor }} class="{{ include.anchorClass }}"{% endcapture %} | |||||
{% endif %} | |||||
{% if include.anchorTitle %} | |||||
{% capture anchor %}{{ anchor }} title="{{ include.anchorTitle | replace: '%heading%', escaped_header }}"{% endcapture %} | |||||
{% endif %} | |||||
{% if include.anchorAttrs %} | |||||
{% capture anchor %}{{ anchor }} {{ include.anchorAttrs | replace: '%heading%', escaped_header | replace: '%html_id%', html_id }}{% endcapture %} | |||||
{% endif %} | |||||
{% capture anchor %}<a {{ anchor }}>{{ include.anchorBody | replace: '%heading%', escaped_header | default: '' }}</a>{% endcapture %} | |||||
<!-- In order to prevent adding extra space after a heading, we'll let the 'anchor' value contain it --> | |||||
{% if beforeHeading %} | |||||
{% capture anchor %}{{ anchor }} {% endcapture %} | |||||
{% else %} | |||||
{% capture anchor %} {{ anchor }}{% endcapture %} | |||||
{% endif %} | |||||
{% endif %} | |||||
{% capture new_heading %} | |||||
<h{{ _hAttrToStrip }} | |||||
{{ include.bodyPrefix }} | |||||
{% if beforeHeading %} | |||||
{{ anchor }}{{ header }} | |||||
{% else %} | |||||
{{ header }}{{ anchor }} | |||||
{% endif %} | |||||
{{ include.bodySuffix }} | |||||
</h{{ headerLevel }}> | |||||
{% endcapture %} | |||||
<!-- | |||||
If we have content after the `</hX>` tag, then we'll want to append that here so we don't lost any content. | |||||
--> | |||||
{% assign chunkCount = _workspace | size %} | |||||
{% if chunkCount > 1 %} | |||||
{% capture new_heading %}{{ new_heading }}{{ _workspace | last }}{% endcapture %} | |||||
{% endif %} | |||||
{% capture edited_headings %}{{ edited_headings }}{{ new_heading }}{% endcapture %} | |||||
{% endfor %} | |||||
{% endcapture %}{% assign headingsWorkspace = '' %}{{ edited_headings | strip }} |
Powered by TurnKey Linux.