aboutsummaryrefslogtreecommitdiffstats
path: root/_includes/anchor_headings.html
blob: 21e2d0473e535c1216b90bf4f3e22eaaff7c0607 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
{% capture headingsWorkspace %}
  {% comment %}
    Version 1.0.4
      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
      * anchorAttrs   (string) :  ''    - Any custom HTML attributes that will be added to the `<a>` tag; you may NOT use `href`, `class` or `title`
      * 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 %}

      {% if include.anchorAttrs %}
        {% capture anchor %}{{ anchor }} {{ include.anchorAttrs }}{% 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 }}
Un proyecto texto-plano.xyz