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