【问题标题】:Checking for tag duplicates with jekyll excludes tags that are contained in other tags使用 jekyll 检查重复的标签会排除其他标签中包含的标签
【发布时间】:2018-11-27 03:19:53
【问题描述】:

我正在尝试在我的 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 下既有常规博客文章,也有在不同位置的文章,但我想将所有这些的标签聚合在同一个标​​签云中。

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

【问题讨论】:

    标签: arrays tags jekyll liquid


    【解决方案1】:

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

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

    【讨论】:

    • 这个答案可以解释为什么使用数组是一种改进。 (我认为这与contains 在提问者代码中使用的字符串中查找内容的方式有关,但我认为如果将其拼写出来,答案会更有教育意义。)
    • 我试过了,但没用,输出奇怪的乱码。我找不到任何有关检查过滤器的液体文档。
    • inspect 是一个 jekyll 过滤器,您可以通过查看幕后发生的情况来使用它进行调试。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2016-10-08
      • 2016-05-13
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多