diff options
Diffstat (limited to 'docs/_includes')
| -rw-r--r-- | docs/_includes/anchor_headings.html | 174 | ||||
| -rw-r--r-- | docs/_includes/docs.css | 210 | ||||
| -rw-r--r-- | docs/_includes/docs_nav.html | 77 | ||||
| -rw-r--r-- | docs/_includes/lang_dropdown.html | 15 |
4 files changed, 476 insertions, 0 deletions
diff --git a/docs/_includes/anchor_headings.html b/docs/_includes/anchor_headings.html new file mode 100644 index 000000000..ee5c2a640 --- /dev/null +++ b/docs/_includes/anchor_headings.html @@ -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 }} diff --git a/docs/_includes/docs.css b/docs/_includes/docs.css new file mode 100644 index 000000000..b1dbb1b08 --- /dev/null +++ b/docs/_includes/docs.css @@ -0,0 +1,210 @@ +:root { + --aside-width: 300px; +} + +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 300 800; + font-stretch: 100%; + font-display: swap; + src: url('{{ "/assets/fonts/OpenSans.woff2" | relative_url }}') format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} + +/* layout */ +html, body { + overflow-x: hidden; +} + +body { + font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, system-ui, sans-serif; + line-height: 1.5; + min-height: 100vh; +} + +aside { + padding: 1rem; + width: var(--aside-width); + height: 100vh; + border-right: 1px solid black; + position: fixed; + top: 0; + left: 0; + margin-right: 1rem; +} + +aside > nav.docs { + overflow-y: scroll; + max-height: 90vh; +} + +aside > nav.docs > ul { + margin-bottom: 10rem; /* extra scroll space */ +} + +aside > nav.docs ul { + padding-left: 1rem; + margin-right: 1rem; +} + +main { + margin-left: calc(var(--aside-width) + 50px); + max-width: 70vw; +} + +img { + max-width: 100%; +} + +section.search { + margin-top: 1rem; + border-bottom: 1px solid black; +} + +div.nojs-search { + margin-bottom: 1rem; +} + +nav.mobile-nav { + display: none; +} + +nav.lang-dropdown { + display: none; +} + +div.lang-dropdown:target nav { + padding: 0.2rem; + display: block; + border: 1px solid black; + border-radius: 6px; + position: absolute; + background-color: white; + z-index: 100; + text-wrap: nowrap; +} + +div#mobile-language:target nav { + right: 0.2rem; +} + +div.lang-dropdown:target nav a:hover { + background-color: silver; +} + +div.lang-dropdown:target a.close { + display: block; + cursor: default; + position: fixed; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + z-index: 99; /* just below language dropdown */ +} + +nav.lang-dropdown ul { + margin: 0; + padding: 0; + list-style-type: none; +} + +/* mobile layout */ + +@media (max-width: 1200px) { + aside { + display: none; + } + + aside a.close { + display: block; + } + + aside a.lang-btn { + display: none; + } + + html:has(aside:target) { + overflow-y: hidden; + } + + body:has(aside:target) > a.close { + display: block; + cursor: default; + position: fixed; + top: 0; + background-color: black; + opacity: 0.3; + width: 100vw; + height: 100vh; + z-index: 99; /* just below aside */ + } + + aside:target { + display: block; + position: fixed; + background-color: white; + z-index: 100; + } + + main { + margin-left: 1rem; + max-width: 90vw; + } + + nav.mobile-nav { + display: block; + border-bottom: 1px dashed black; + } + + nav.mobile-nav > a.toggle-aside { + color: black; + -webkit-tap-highlight-color: transparent; + } + + nav.mobile-nav > a.toggle-aside svg { + width: 2rem; + height: 2rem; + } +} + +/* general styling */ +a { + text-decoration: none; + color: #00e; +} + +a.close { + display: none; +} + +aside a.close { + float: right; + color: #f00; + font-size: 24px; + position: relative; + bottom: 4px; +} + +table, th, tr, td { + border: 1px solid black; + border-collapse: collapse; +} + +th, tr, td { + padding: 0.3rem; +} + +button.copy { + margin: 0.5rem; + float: right; +} + +div.lang-dropdown { + float: right; +} + +a.lang-btn { + color: black; +} diff --git a/docs/_includes/docs_nav.html b/docs/_includes/docs_nav.html new file mode 100644 index 000000000..3b3083c1e --- /dev/null +++ b/docs/_includes/docs_nav.html @@ -0,0 +1,77 @@ +{% if page.lang == 'en' %} + <ul> + <li><a href="{{ '/en/' | relative_url }}">Home</a></li> + <li> + <a href="{{ '/en/users/02_First_steps.html' | relative_url }}">User documentation</a> + <ul> + {% for page in site.pages %} + {% if page.url contains '/en/users/' and page.title != nil and page.url != "/en/users/02_First_steps.html" %} + <li><a href="{{ page.url | relative_url }}">{{ page.title | escape }}</a></li> + {% endif %} + {% endfor %} + </ul> + </li> + <li> + <a href="{{ '/en/admins/01_Index.html' | relative_url }}">Administrator documentation</a> + <ul> + {% for page in site.pages %} + {% if page.url contains '/en/admins/' and page.url != "/en/admins/01_Index.html" and page.title != nil %} + <li><a href="{{ page.url | relative_url }}">{{ page.title | escape }}</a></li> + {% endif %} + {% endfor %} + </ul> + </li> + <li> + <a href="{{ '/en/developers/01_Index.html' | relative_url }}">Developer documentation</a> + <ul> + {% for page in site.pages %} + {% if page.url contains '/en/developers/' and page.url != "/en/developers/01_Index.html" and page.title != nil %} + <li><a href="{{ page.url | relative_url }}">{{ page.title | escape }}</a></li> + {% endif %} + {% endfor %} + </ul> + </li> + <li> + <a href="{{ '/en/contributing.html' | relative_url}}">Contributor guidelines</a> + </li> + </ul> +{% elsif page.lang == 'fr' %} + <ul> + <li><a href="{{ '/fr/' | relative_url }}">Accueil</a></li> + <li> + <a href="{{ '/fr/users/02_First_steps.html' | relative_url }}">Documentation utilisateur</a> + <ul> + {% for page in site.pages %} + {% if page.url contains '/fr/users/' and page.title != nil and page.url != "/fr/users/02_First_steps.html" %} + <li><a href="{{ page.url | relative_url }}">{{ page.title | escape }}</a></li> + {% endif %} + {% endfor %} + </ul> + </li> + <!-- TODO: French doesn't have admin docs --> + <!-- <li> --> + <!-- <a href="{{ '/fr/admins/01_Index.html' | relative_url }}">Administrator documentation</a> --> + <!-- <ul> --> + <!-- {% for page in site.pages %} --> + <!-- {% if page.url contains '/fr/admins/' and page.url != "/fr/admins/01_Index.html" and page.title != nil %} --> + <!-- <li><a href="{{ page.url | relative_url }}">{{ page.title | escape }}</a></li> --> + <!-- {% endif %} --> + <!-- {% endfor %} --> + <!-- </ul> --> + <!-- </li> --> + <li> + <a href="{{ '/fr/developers/01_First_steps.html' | relative_url }}">Documentation développeur</a> + <ul> + {% for page in site.pages %} + {% if page.url contains '/fr/developers/' and page.url != "/fr/developers/01_First_steps.html" and page.title != nil %} + <li><a href="{{ page.url | relative_url }}">{{ page.title | escape }}</a></li> + {% endif %} + {% endfor %} + </ul> + </li> + <li> + <a href="{{ '/fr/contributing.html' | relative_url}}">Directives pour les contributeurs</a> + </li> + </ul> +{% endif %} + diff --git a/docs/_includes/lang_dropdown.html b/docs/_includes/lang_dropdown.html new file mode 100644 index 000000000..81dc62508 --- /dev/null +++ b/docs/_includes/lang_dropdown.html @@ -0,0 +1,15 @@ +<div class="lang-dropdown" id="{{ include.location }}-language"> + <a class="lang-btn" href="#{{ include.location }}-language" title="{%t choose_language %}"> + <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="currentColor" viewBox="0 0 16 16"> + <path d="M4.545 6.714 4.11 8H3l1.862-5h1.284L8 8H6.833l-.435-1.286zm1.634-.736L5.5 3.956h-.049l-.679 2.022z"></path> + <path d="M0 2a2 2 0 0 1 2-2h7a2 2 0 0 1 2 2v3h3a2 2 0 0 1 2 2v7a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2v-3H2a2 2 0 0 1-2-2zm2-1a1 1 0 0 0-1 1v7a1 1 0 0 0 1 1h7a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1zm7.138 9.995q.289.451.63.846c-.748.575-1.673 1.001-2.768 1.292.178.217.451.635.555.867 1.125-.359 2.08-.844 2.886-1.494.777.665 1.739 1.165 2.93 1.472.133-.254.414-.673.629-.89-1.125-.253-2.057-.694-2.82-1.284.681-.747 1.222-1.651 1.621-2.757H14V8h-3v1.047h.765c-.318.844-.74 1.546-1.272 2.13a6 6 0 0 1-.415-.492 2 2 0 0 1-.94.31"></path> + </svg> + </a> + <a class="close" href="#close"></a> + <nav class="lang-dropdown"> + <ul> + <li><a href="{{ '/en/' | relative_url }}">English (en)</a></li> + <li><a href="{{ '/fr/' | relative_url }}">Français (fr)</a></li> + </ul> + </nav> +</div> |
