<!--
 Licensed to the Apache Software Foundation (ASF) under one or more
 contributor license agreements.  See the NOTICE file distributed with
 this work for additional information regarding copyright ownership.
 The ASF licenses this file to You under the Apache License, Version 2.0
 (the "License"); you may not use this file except in compliance with
 the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
-->

<ul class="side-nav">
    <li class="side-nav-title">Introduction</li>
    <li>
        {% if page.id == "overview" %}
        <a class="active" href="/docs.html">Overview</a>
        {% else %}
        <a href="/docs.html">Overview</a>
        {% endif %}
    </li>
    <li>
        {% if page.id == "installation" %}
        <a class="active" href="/installation.html">Installation</a>
        {% else %}
        <a href="/installation.html">Installation</a>
        {% endif %}
    </li>
    <li>
        {% if page.id == "first-example" %}
        <a class="active" href="/first-example.html">First Example</a>
        {% else %}
        <a href="/first-example.html">First Example</a>
        {% endif %}
    </li>

    <li class="side-nav-title">Developer Guide</li>
    <li>
        {% if page.id == "api-components" %}
            <a class="active" href="/api-components.html">API Components</a>
        {% else %}
            <a href="/api-components.html">API Components</a>
        {% endif %}
    </li>
    <li>
        {% if page.id == "custom-components" %}
            <a class="active" href="/custom-components.html">Custom Components</a>
        {% else %}
            <a href="/custom-components.html">Custom Components</a>
        {% endif %}
    </li>
    <li>
        {% if page.id == "intent_matching" %}
            <a class="active" href="/intent-matching.html">Intent Matching</a>
        {% else %}
            <a href="/intent-matching.html">Intent Matching</a>
        {% endif %}
    </li>
    <li>
        {% if page.id == "short_term_memory" %}
            <a class="active" href="/short-term-memory.html">Short-Term Memory</a>
        {% else %}
            <a href="/short-term-memory.html">Short-Term Memory</a>
        {% endif %}
    </li>

    <li class="side-nav-title">Built-in Components</li>
    <li>
        {% if page.id == "built-in-overview" %}
        <a class="active" href="/built-in-overview.html">Overview</a>
        {% else %}
        <a href="/built-in-overview.html">Overview</a>
        {% endif %}
    </li>
    <li>
        {% if page.id == "built-in-token-parser" %}
        <a class="active" href="/built-in-token-parser.html">Token Parsers</a>
        {% else %}
        <a href="/built-in-token-parser.html">Token Parsers</a>
        {% endif %}
    </li>
    <li>
        {% if page.id == "built-in-token-enricher" %}
        <a class="active" href="/built-in-token-enricher.html">Token Enrichers</a>
        {% else %}
        <a href="/built-in-token-enricher.html">Token Enrichers</a>
        {% endif %}
    </li>
    <li>
        {% if page.id == "built-in-entity-parser" %}
        <a class="active" href="/built-in-entity-parser.html">Entity Parsers</a>
        {% else %}
        <a href="/built-in-entity-parser.html">Entity Parsers</a>
        {% endif %}
    </li>
    <li>
        {% if page.id == "built-in-builder" %}
        <a class="active" href="/built-in-builder.html">Pipeline Builder</a>
        {% else %}
        <a href="/built-in-builder.html">Pipeline Builder</a>
        {% endif %}
    </li>

    <li class="side-nav-title">Examples</li>
    <li>
        {% if page.id == "calculator" %}
        <a class="active" href="/examples/calculator.html">Calculator</a>
        {% else %}
        <a href="/examples/calculator.html">Calculator</a>
        {% endif %}
    </li>
    <li>
        {% if page.id == "time" %}
        <a class="active" href="/examples/time.html">Time</a>
        {% else %}
        <a href="/examples/time.html">Time</a>
        {% endif %}
    </li>
    <li>
        {% if page.id == "light_switch" %}
        <a class="active" href="/examples/light_switch.html">Light Switch</a>
        {% else %}
        <a href="/examples/light_switch.html">Light Switch</a>
        {% endif %}
    </li>
    <li>
        {% if page.id == "light_switch_fr" %}
        <a class="active" href="/examples/light_switch_fr.html">Light Switch FR</a>
        {% else %}
        <a href="/examples/light_switch_fr.html">Light Switch FR</a>
        {% endif %}
    </li>
    <li>
        {% if page.id == "light_switch_ru" %}
        <a class="active" href="/examples/light_switch_ru.html">Light Switch RU</a>
        {% else %}
        <a href="/examples/light_switch_ru.html">Light Switch RU</a>
        {% endif %}
    </li>
    <li>
        {% if page.id == "pizzeria" %}
        <a class="active" href="/examples/pizzeria.html">Pizzeria</a>
        {% else %}
        <a href="/examples/pizzeria.html">Pizzeria</a>
        {% endif %}
    </li>
</ul>
