From 03e2345833f92d6f3841db66bffd0f2ed8461bf2 Mon Sep 17 00:00:00 2001 From: Silvio Giebl <silvio.giebl@dc-square.de> Date: Sat, 4 May 2019 22:22:56 +0200 Subject: [PATCH] Added anchor headings --- _includes/vendor/anchor_headings.html | 100 ++++++++++++++++++++++++++ _layouts/anchor_headings.html | 5 ++ _layouts/default.html | 2 +- _sass/anchor_headings.scss | 12 ++++ assets/css/just-the-docs.scss | 1 + 5 files changed, 119 insertions(+), 1 deletion(-) create mode 100755 _includes/vendor/anchor_headings.html create mode 100644 _layouts/anchor_headings.html create mode 100644 _sass/anchor_headings.scss diff --git a/_includes/vendor/anchor_headings.html b/_includes/vendor/anchor_headings.html new file mode 100755 index 00000000..25397df9 --- /dev/null +++ b/_includes/vendor/anchor_headings.html @@ -0,0 +1,100 @@ +{% capture headingsWorkspace %} + {% comment %} + Version 1.0.3 + 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 %} + + 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 + * 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 + + 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 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 try to fix it --> + {% if headerLevel == 0 %} + {% if nextChar != '<' and nextChar != '' %} + {% capture node %}<h{{ node }}{% endcapture %} + {% endif %} + + {% capture edited_headings %}{{ edited_headings }}{{ node }}{% endcapture %} + {% continue %} + {% endif %} + + {% assign _workspace = node | split: '</h' %} + {% assign _idWorkspace = _workspace[0] | split: 'id="' %} + {% assign _idWorkspace = _idWorkspace[1] | split: '"' %} + {% assign html_id = _idWorkspace[0] %} + + {% capture _hAttrToStrip %}{{ _workspace[0] | split: '>' | first }}>{% endcapture %} + {% assign header = _workspace[0] | replace: _hAttrToStrip, '' %} + + <!-- Build the anchor to inject for our heading --> + {% capture anchor %}{% endcapture %} + + {% if html_id and headerLevel >= minHeader and headerLevel <= maxHeader %} + {% 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%', header }}"{% endcapture %} + {% endif %} + + {% capture anchor %}<a {{ anchor }}>{{ include.anchorBody | replace: '%heading%', 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{{ _workspace | last }} + {% endcapture %} + {% capture edited_headings %}{{ edited_headings }}{{ new_heading }}{% endcapture %} + {% endfor %} +{% endcapture %}{% assign headingsWorkspace = '' %}{{ edited_headings | strip }} \ No newline at end of file diff --git a/_layouts/anchor_headings.html b/_layouts/anchor_headings.html new file mode 100644 index 00000000..efec628f --- /dev/null +++ b/_layouts/anchor_headings.html @@ -0,0 +1,5 @@ +--- +layout: vendor/compress +--- + +{% include vendor/anchor_headings.html html=content anchorBody="#" anchorClass="anchor_heading" %} \ No newline at end of file diff --git a/_layouts/default.html b/_layouts/default.html index c2d1c994..0b3928d6 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -1,5 +1,5 @@ --- -layout: vendor/compress +layout: anchor_headings --- <!DOCTYPE html> diff --git a/_sass/anchor_headings.scss b/_sass/anchor_headings.scss new file mode 100644 index 00000000..da552025 --- /dev/null +++ b/_sass/anchor_headings.scss @@ -0,0 +1,12 @@ +a.anchor_heading { + visibility: hidden; +} + +h1:hover > a.anchor_heading, +h2:hover > a.anchor_heading, +h3:hover > a.anchor_heading, +h4:hover > a.anchor_heading, +h5:hover > a.anchor_heading, +h6:hover > a.anchor_heading { + visibility: visible; +} \ No newline at end of file diff --git a/assets/css/just-the-docs.scss b/assets/css/just-the-docs.scss index 6a2eefa5..b6d17d59 100644 --- a/assets/css/just-the-docs.scss +++ b/assets/css/just-the-docs.scss @@ -41,4 +41,5 @@ @import "./search"; @import "./tables"; @import "./code"; +@import "./anchor_headings"; @import "./utilities/utilities"; -- GitLab