Giter VIP home page Giter VIP logo

jekyll-anchor-headings's Introduction

Jekyll Pure Liquid Heading Anchors

Unit Tests Latest release ko-fi Buy me a coffee

GitHub Pages can't run custom Jekyll plug-ins so when generating anchors for your headings (i.e. h1 - h6), you're stuck with JavaScript solutions that will inject anchors. But what if your users don't have JavaScript enabled on their browsers? If you're building a static website, why not make your anchors static as well?

Sample anchor next to heading

As a part of my "Pure Liquid" series of Jekyll snippets, here is a Liquid snippet that will modify your generated HTML to inject anchors. Want to see it in action? Here are some awesome websites that I know of using this solution ❤️.

Want a Table of Contents in your Jekyll layouts without JavaScript or a plug-in?

Check out the sister project over at allejo/jekyll-toc.

Usage

Alright, so how do you use it?

  1. Download the anchor_headings.html file from the latest release or the master branch

  2. Toss that file in your _includes folder

  3. Where you typically would put {{ content }} in your layout, you would instead use this Liquid tag to output your page's content:

    {% include anchor_headings.html html=content anchorBody="#" %}

♿ Link Accessibility

Accessibility is hard and there are many different ways someone may want to handle it. For that reason, this project does not force onto developers any method of handling accessibility. That being said, this project can be configured to be accessible as seen in examples in the wiki.

⚠️ Layout Inheritance

If this snippet is used in a layout that is inherited by a child layout, it will apply to the child layout as well. If the child layout uses this snippet in addition to the parent layout, then heading anchors will be duplicated. You should only use this snippet in one layout.

🎨 Customization

You may remove anchorBody and add an icon via CSS' content property instead. You may also use HTML in anchorBody and add screen reader friendly markup.

Take a look at the unit tests directory and the wiki page for more examples of how to use this script.

Parameters

This snippet is highly customizable. Here are the available parameters to change the behavior of the snippet.

Parameter Type Default Description
html string * the HTML of compiled markdown generated by kramdown in Jekyll
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; the %heading% placeholder is available
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 bool false Set to true if a header without id should generate an id to use.

* This is a required parameter

Performance

The performance impact of this snippet on your site is pretty negligible. The stats below were gotten from Jekyll's --profile option.

Filename                                         | Count |    Bytes |  Time
-------------------------------------------------+-------+----------+------

# performance on docs.travis-ci.com from ~Aug 2018
_includes/anchor_headings.html                   |   193 | 1667.96K | 0.695

License

This snippet may be redistributed under the MIT license.

jekyll-anchor-headings's People

Contributors

allejo avatar flxai avatar garazdawi avatar jaybe-jekyll avatar jojosoft avatar jricher avatar martijncuppens avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

jekyll-anchor-headings's Issues

Strip HTML in %heading% for anchorTitle

First of all, thank you very much for this project as well as jekyll-TOC, your work is excellent and just filling the gap that is missing in jekyll for GH-Pages.


When having an anchor in headings and using %heading% in anchorTitle, the generated HTML breaks.

Markdown

### The [`match`](#match) Expression

Snippet Usage

{% include anchor_headings.html
  beforeHeading=false
  h_min=2
  html=content
  anchorClass="permalink icon-link"
  anchorBody=""
  anchorTitle="Permalink for '%heading%'"
%}

Expected HTML

<h3 id="the-match-expression">
    The <a href="#match"><code class="language-text highlighter-rouge">match</code></a> Expression
    <a href="#the-match-expression" class="permalink icon-link" title="Permalink for 'The match Expression'"></a>
</h3>

Actual HTML

<h3 id="the-match-expression">
    The <a href="#match"><code class="language-text highlighter-rouge">match</code></a> Expression
    <a href="#the-match-expression" class="permalink icon-link"
        title="Permalink for 'The <a href="#match"><code class="language-text highlighter-rouge">match</code></a> Expression'">
    </a>
</h3>

Notes

To fix this, I added | strip_html in line 111 for if include.anchorTitle:

{% if include.anchorTitle %}
  {% capture anchor %}{{ anchor }} title="{{ include.anchorTitle | replace: '%heading%', header | strip_html }}"{% endcapture %}
{% endif %}

I am not firm with liquid, I have had this issue only with anchorTitle, but maybe this will pop up elsewhere as well.

Messes with horizontal rules

The <hr> tag (and possibly other HTML tags starting with "h") is butchered.

All that is left turns out the be a sad and lonely

r />

:(

Wrap heading content support?

Hey, @allejo .

I'm gonna switch to your package for Bootstrap. While at it, I noticed we could use an optional element wrapping support for the a tags.

Do you think this would be possible without too many changes?

Thanks in advance!

/CC @MartijnCuppens

">" should be added?

I don't have any confidence, but it seems to me that > should be added to the end of this line. When I open this source, my editor warns me that there is no >.

Aria, or other attribute support

Hey,

Great plugin. Very useful for a JS-free solution.

I was wondering if it was possible to add Aria support, or to pass along custom attributes?

I'm finding that screenreaders can take a lot longer to read out with an extra anchor after each header. I think it'd be easier to mark them as aria-hidden="true", or find another role to deemphasize them.

I'm not seeing how I'd pass this along without editing the script file itself though. Would you consider making an attribute for aria, or accepting arbitrary attributes+values?

Thanks!

Headings inside header elements cause broken HTML with missing text to be rendered

My Markdown

<header>
  <h1 id="goodbye-world">Goodbye World</h1>
  <p>some header text</p>
</header>

Snippet Usage

{% capture markdown %}
<header>
  <h1 id="goodbye-world">Goodbye World</h1>
  <p>some header text</p>
</header>
{% endcapture %}
{% assign text = markdown | markdownify %}

<div>
{% include anchor_headings.html html=text %}
</div>

Expected HTML

<div>
  <header>
    <h1 id="goodbye-world">Goodbye World <a href="#goodbye-world"></a></h1>
    <p>some header text</p>
  </header>
</div>

Actual HTML

<div>
<header>
      <h1 id="goodbye-world">
        
        
          Goodbye World <a href="#goodbye-world"></a>
        
        
      </header>

</div>

Notes

Various Jekyll themes use this pattern of HTML for posts in blogs – even Minima. The test for the fix for issue #13 doesn't include nested elements.

Restrict heading range

Similar to how jekyll-toc works, allow users to restrict the range of headings that will have anchors generated for them. e.g. Don't generate anchors for <h3> and below.

Does not process content before first heading

My Markdown

---
title: Getting started
layout: en

---

This is a very short guide to using Travis CI with your GitHub hosted code repository.
If you're new to continuous integration or would like some more information on
what Travis CI does, start with [Core Concepts for Beginners](/user/for-beginners)
instead.



## Prerequisites

To start using Travis CI, make sure you have *all* of the following:

Snippet Usage

{% include toc.html h_min=2 h_max=2 class="list-language" santize=true  html=content %}

Expected HTML

This is a very short guide to using Travis CI with your GitHub hosted code repository. If you’re new to continuous integration or would like some more information on what Travis CI does, start with Core Concepts for Beginners instead.

Prerequisites

To start using Travis CI, make sure you have all of the following:

Actual HTML

Prerequisites

To start using Travis CI, make sure you have all of the following:

Notes

Write here.

Exclude specific HTML headings with specific class

Description

Now that IDs are parsed also in HTML files, it would be super useful to exclude some headings with a specific class.

Sample Usage
<h3 class='exclude'>Heading to exclude</h3> won’t have any ID generated.

Raw text outside tags causes broken HTML to be rendered

My Markdown HTML

Some text<p data-name="short_description">Defines which sample file the region will play.</p>

<p>Possibly the most important opcode, this is the one that tells the sampler which
sample file to actually play. This should include a relative file path from the
folder where the SFZ file is.</p>

<h2 id="examples">Examples</h2>

Snippet Usage

{% include anchor_headings.html html=content %}

Expected HTML

Some text<p data-name="short_description">Defines which sample file the region will play.</p>

<p>Possibly the most important opcode, this is the one that tells the sampler which
sample file to actually play. This should include a relative file path from the
folder where the SFZ file is.</p>

<h2 id="examples">Examples <a href="#examples"></a></h2>

Actual HTML

<hSome text<p data-name="short_description">Defines which sample file the region will play.</p>

<p>Possibly the most important opcode, this is the one that tells the sampler which
sample file to actually play. This should include a relative file path from the
folder where the SFZ file is.</p>

<h2 id="examples">Examples <a href="#examples"></a></h2>

Notes

Reported by the @sfzformat team

Thank you!

THANK YOU!

Really! For the simplicity of your idea, for addressing this issue, for making it available for others. I will definitively mind your Sponsor button, eheh.

Keep on the good work,
and thnks!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.