使用 jekyll 检查标签重复项会排除包含在其他标签中的标签

Checking for tag duplicates with jekyll excludes tags that are contained in other tags

我正在尝试在我的 jekyll 站点中构建一个带有液体的(简单的、未加权的)标签云。当我使用此代码时,标签云呈现良好:

{% assign sitetags = "" %}
{% for page in site.pages %}
    {% for tag in page.tags %}
        {% unless sitetags contains tag %}
            {% assign sitetags = sitetags | append:tag | append:', ' %}
        {% endunless %}
    {% endfor %} 
{% endfor %} 

{% assign sitetags = sitetags | split:', ' | sort %}
{% for tag in sitetags %}
    {% capture tag_name %}{{ tag }}{% endcapture %}
    <div>
        <a href="/tag/{{ tag_name }}">{{ tag_name }}</a>
    </div>
{% endfor %} 

但是,有一个问题:如果一个标签的名称包含在另一个标签中,则它不会显示在标签云中。例如,"art" 包含在 "art-history" 中,因此不会显示。为了解决这个问题,我试图修复它,但是它不起作用。这是我的代码:

{% assign sitetags = "" %}
{% for page in site.pages %}
    {% for tag in page.tags %}
        {% if sitetags contains tag %}
            {% assign sitetags = sitetags | split:', ' %}
            {% assign truetag = true %}
            {% for taggo in sitetags %}
                {% if taggo != tag %}
                    {% continue %}
                {% else %}
                    {% assign truetag = false %}
                    {% break %}
                {% endif %}
            {% endfor %}
            {% if truetag == true %}
                {% assign sitetags = sitetags | append:tag | append:', ' %} 
            {% endif %}
        {% else %}
            {% assign sitetags = sitetags | append:tag | append:', ' %}         
        {% endif %}
    {% endfor %} 
{% endfor %} 

{% assign sitetags = sitetags | split:', ' | sort %}
{% for tag in sitetags %}
    {% capture tag_name %}{{ tag }}{% endcapture %}
    <div>
        <a href="/tag/{{ tag }}">{{ tag }}</a>
    </div>
{% endfor %} 

我以这种方式尝试而不是仅使用 site.tags 的原因是因为我在我试图包含的其他目录中有 articles/essays。当我使用 site.tags 时,它只包括博客文章上的标签,而不包括文章上的标签。本质上,我的网站在 /_blog 下有常规博客文章,在不同位置也有文章,但我想将所有这些的标签聚合在同一个标​​签云中。

我非常感谢有关我做错了什么或如何解决它的建议。谢谢!

您可以使用数组代替字符串来存储标签。

{% assign sitetags = "" | split:"" %}
{% for page in site.pages %}
  {% if page.tags.size %}
    {% assign sitetags = sitetags | concat: page.tags %}
    {{ sitetags | inspect }} <br>
  {% endif %}
{% endfor %}

{% assign sitetags = sitetags | sort | uniq %}
{{ sitetags | inspect }} <br>

{% for tag in sitetags %}
  <div>
    <a href="/tag/{{ tag }}">{{ tag }}</a>
  </div>
{% endfor %}

其实我是自己想出来的。部分问题在于初始化数组,所以我最终使用了一个字符串,因为由于某种原因我无法让数组工作。我跳过了初始化并直接向其中添加项目。在那之后,我所要做的只是 运行 uniq 过滤器,它过滤掉了所有重复项,所以我不必进行任何字符串比较或类似的事情。

解决方法如下:

{% for post in site.pages %}
    {% for tag in post.tags %}
        {% assign tagcloud = tagcloud | append:tag | append:', ' %}
    {% endfor %} 
{% endfor %} 

{% assign tagcloud = tagcloud | split:", " | uniq | sort %}

{% for tag in tagcloud %}
    {% capture tag_name %}{{ tag }}{% endcapture %}
    <div>
        <a href="/tag/{{ tag_name }}">{{ tag_name }}</a>
    </div>
{% endfor %}