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

时间:2018-11-27 03:19:53

标签: arrays tags jekyll liquid

我正在尝试在我的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 %} 

但是,有一个问题:如果一个标签的名称包含在另一个标签中,则它不会显示在标签云中。例如,“艺术”包含在“艺术历史​​”中,因此它不会出现。为了解决此问题,我尝试对其进行修复,但是,它无法正常工作。这是我的代码:

{% 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,是因为我在其他要包含的目录中有文章/文章。当我使用site.tags时,它仅包括博客文章上的标签,而不包括文章中的标签。本质上,我的网站在/ _blog下都有常规博客文章,并且在其他位置也有文章,但是我想将所有这些标签的标签汇总在同一标签云中。

我真的很感谢我做错了什么或如何解决的建议。谢谢!

2 个答案:

答案 0 :(得分:0)

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

{% 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 %}

答案 1 :(得分:0)

我自己就能弄清楚这一点。问题的一部分是初始化数组,所以我最终使用了一个字符串,因为我由于某种原因无法使数组工作。我跳过了初始化,直接向其添加项目。之后,我所要做的就是运行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 %}