Проверка на наличие дубликатов тегов с помощью jekyll исключает теги, содержащиеся в других тегах - PullRequest
0 голосов
/ 27 ноября 2018

Я пытаюсь создать (простое, невзвешенное) облако тегов с жидкостью на моем сайте 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 голосов
/ 02 декабря 2018

Я смог понять это сам.Частично проблема заключалась в инициализации массива, поэтому я закончил работать со строкой, потому что по какой-то причине я просто не мог заставить работать массивы.Я пропустил инициализацию и сразу приступил к добавлению элементов к ней.После этого все, что мне нужно было сделать, это просто запустить фильтр 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 %}
0 голосов
/ 27 ноября 2018

Вместо использования строки для хранения ваших тегов, вы можете использовать массив.

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