Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Jekyll导航栏中排除页面_Jekyll_Liquid - Fatal编程技术网

从Jekyll导航栏中排除页面

从Jekyll导航栏中排除页面,jekyll,liquid,Jekyll,Liquid,我正在建立一个基本的Github托管的Jekyll网站(非常简单,我甚至懒得修改默认主题)。我有一个嵌套站点,其中包含少量第一层页面,我希望这些页面出现在导航栏中(即默认操作模式)。我也有一些第二层的网页,我不想垃圾的导航栏 虽然多层次导航系统会很好,但我尽量避免使用插件。因此,我认为最简单的解决方案是完全从导航系统中排除第二层页面 下面是一个假设的页面结构(减去其他Jekyll文件): 按照令人敬畏的降序排列,我希望这样: 最好的情况是,上下文相关导航(如果没有插件,这是不可能的):当访问je

我正在建立一个基本的Github托管的Jekyll网站(非常简单,我甚至懒得修改默认主题)。我有一个嵌套站点,其中包含少量第一层页面,我希望这些页面出现在导航栏中(即默认操作模式)。我也有一些第二层的网页,我不想垃圾的导航栏

虽然多层次导航系统会很好,但我尽量避免使用插件。因此,我认为最简单的解决方案是完全从导航系统中排除第二层页面

下面是一个假设的页面结构(减去其他Jekyll文件):

按照令人敬畏的降序排列,我希望这样:

  • 最好的情况是,上下文相关导航(如果没有插件,这是不可能的):当访问jekyllsite/index.md时,我会得到一个单层导航栏,提供到foo、bar和baz的链接。当访问jekyllsite/bar/index.md时,我会看到一个双层导航栏,顶层包含foo、bar和baz,第二层包含alice和bob

  • 对我来说,下一个最好的选择是在全局范围内更改某些内容,这样,只有顶级目录(foo、bar、baz)被添加到导航栏中。alice、bob、spam和eggs等子目录将自动从导航栏中排除

  • 最后(我认为这可能是最简单的)是YAML frontmatter标志排除页面。类似于
    nonav:true
    的内容出现在要排除的页面的前面

  • 这似乎必须是一个相当常见的用例,尽管我还没有找到任何一个看起来像这三个选项中任何一个的捷径。我希望更熟悉杰基尔的人能给出一个“阻力最小的道路”的答案。

    我个人有

    出现在主菜单中的页面的首页

    ---
    layout: default
    title: Home
    menu: main
    weight: 10
    ---
    
    主菜单模板(类来自twitter引导):

    以及将值传递给菜单模板

    {% include navbar.html  menuLevel="foo" %}
    
    然后像这样截取它:

    {% if p.menu == menuLevel %}
    

    任何不公开菜单的页面:toto都不会出现在导航中。

    可以创建一个多级别、上下文敏感的导航,如您所述,无需插件,我已经做到了

    唯一需要注意的是,您需要在菜单层次结构中保持一个新的层次结构-使用我的方法,不可能从目录结构自动生成这个层次结构

    我将在这里展示简短的版本,但我在我的博客上有一个更详细的解释:


    1.创建包含菜单层次结构的YAML数据文件(
    /\u data/menu.yml
    ):
    2.创建包含以下内容的(
    /\u includes/nav.html
    ): 这将在那里显示导航。
    请注意,我正在将完整的数据文件从步骤1传递到include。


    这就是全部! 正如我在开始时所说:

    这种方法的唯一缺点是,每次创建新页面时,还需要将页面的标题和URL插入数据文件中


    但另一方面,这使得从导航中排除某些页面变得非常容易:您只是不将它们添加到数据文件中。

    如果您来自基本的Jekyll主题,从标题站点导航中排除页面的最简单方法是添加
    除非page.exclude
    异常

    page.exclude
    是一个新的Yaml frontmatter属性。)

    默认情况下,这在
    \u includes/header.html
    中:

    {%用于site.pages%}
    {%除非page.exclude%}
    {%if page.title%}
    {%endif%}
    {%end除非%}
    {%endfor%}
    
    以及与任何页面的Yaml frontmatter对应的标签:

    ---
    ... other attributes ...
    exclude: true
    ---
    

    归功于

    我发现这个解决方案非常简单。为我工作!
    {% include navbar.html  menuLevel="foo" %}
    
    {% if p.menu == menuLevel %}
    
    - text: Home
      url: /
    - text: First menu
      url: /first-menu/
      subitems:
        - text: First menu (sub)
          url: /first-menu/first-menu-sub/
          subitems:
            - text: First menu (sub-sub)
              url: /first-menu/first-menu-sub/first-menu-sub-sub/
    - text: Second menu
      url: /second-menu/
      subitems:
        - text: Second menu (sub)
          url: /second-menu/second-menu-sub/
    
    {% assign navurl = page.url | remove: 'index.html' %}
    <ul>
    {% for item in include.nav %}
        <li>
            <a href="{{ item.url }}">
                {% if item.url == navurl %}
                    <b>{{ item.text }}</b>
                {% else %}
                    {{ item.text }}
                {% endif %}
            </a>
        </li>
        {% if item.subitems and navurl contains item.url %}
            {% include nav.html nav=item.subitems %}
        {% endif %}
    {% endfor %}
    </ul>
    
    {% include nav.html nav=site.data.menu %}
    
    ---
    ... other attributes ...
    exclude: true
    ---