As coisas aqui foram suplantadas pelo post Oops, quebrei o about, e agora?. Poucas escolhas feitas aqui refletem o estado atual do blog.

Eu tava querendo por faz algum tempo um compilado das minhas apresentações. Mas, ao tentar colocar aqui uma nova página com o layout page (como é o /about/), essa página aparece no canto superior direito do blog. E o problema é que quebra o layout, e quebra feio o layout.

Então, qual seria a solução? Uma solução seria não usar título, já que isso já garantiria que não iria mostrar. Eis o template usado para garantir isso (_includes/header.html):

<div class="trigger">
{% for my_page in site.pages %}
    {% if my_page.title %}
    <a class="page-link" href="{{ my_page.url | prepend: site.baseurl }}">{{ my_page.title }}</a>
    {% endif %}
{% endfor %}
</div>

Mas, bem… não fica totalmente legal. Isso significa optar por não colocar o título, mas o título é algo bacana e significativo, não posso omitir sempre. Como proceder?

Bem, procedi tomando inspiração no publicando rascunho. Só que aqui, no lugar de ser uma marcação para não aparecer, a marcação é para aparecer. Como fazer isso?

Pois bem, criei o atributo show no frontmatter. Se ele existir e o valor for verdadeiro, então exibe.

Daí:

 ---
 layout: page
 title: Sobre
 permalink: /about/
+show: true
 ---

Isso foi o suficiente para pedir para exibir. E como consumir isso?

Bem, voltemos ao header.html:

<div class="trigger">
{% for my_page in site.pages %}
    {% if my_page.title %}
    <a class="page-link" href="{{ my_page.url | prepend: site.baseurl }}">{{ my_page.title }}</a>
    {% endif %}
{% endfor %}
</div>

Hmmm, e se o liquid permitir inserir AND? Bem, testemos:

<div class="trigger">
{% for my_page in site.pages %}
    {% if my_page.title and my_page.show %}
    <a class="page-link" href="{{ my_page.url | prepend: site.baseurl }}">{{ my_page.title }}</a>
    {% endif %}
{% endfor %}
</div>

E funcionou. Remover o atributo faz com que o Sobre suma, assim como colocar o valor como false.

Mostrar todas as páginas?

Bem, com isso, evitei de mostrar onde eu não queria: no canto superior direito. Mas… e como eu alcanço o resto?

Pois bem, temos um problema. Seria bom ter isso dentro do alcance, nem que seja uma seção dentro do /about/

Será que eu tenho alcance às páginas tal qual no header.html? Na real: sim. Basta iterar em cima de pages. Só que esse pages traz alguns resultados que não é bem o que eu queria, pelo menos não unicamente o que eu queria:

  • .css
  • feed.xml
  • o próprio /about/
  • raiz /

Pois bem, vamos programar em liquid! Separar o /about/ da informação sobre mim e o blog dos links com um <hr/>, em markdown é só colocar --- em uma linha vaiza.

Agora, iterar. Para fazer iteração em cima da coleção pages, só fazer um for:

{% for my_page in pages %}
  ...
{% endfor %}

Muito bem, agora precisamos nos livrar de tudo que terminar com .css ou com .xml. Chamar o método String.end_with? do Ruby não funcionou. Então, que tal partir o page.url em cima do .? Assim eu obtenho um vetor. Vamos testar?

{% assign partes = "a.css" | split: "." %}
{% for parte in partes %}
- `{{parte}}`
{% endfor %}

Testando daqui…

  • a

  • css

… até aqui.

Hmmm, não ficou com um espaçamento legal entre os itens, mas deu para mostrar o ponto. Dá para controlar com mais carinho os espaços em branco do liquid ao redor dos filtros/tags usando {%-/{{- para limpar os espaços antes da expansão do liquid ou -%}/-}} para limpar depois.

Após um tantinho de tentativa e erro, cheguei nisto:

{% assign partes = "a.css" | split: "." %}
{%- for parte in partes %}
- `{{parte}}`
{%- endfor %}

Testando daqui…

  • a
  • css

… até aqui.

Ok, agora eu preciso saber se é css, ou xml. Como só me interessa a extenção do arquivo, posso acessar com vetor[-1]. E, bem, resolvi testar usando o or, o and funcionou ali em cima, né?

Cheguei nisto daqui:

{% for my_page in site.pages %}
  {% assign my_page_parts = my_page.url | downcase | split: "."  %}
  {% unless
        my_page_parts[-1] == "css" or
        my_page_parts[-1] == "xml" %}
  - {{ my_page.url | prepend: site.baseurl }}
  {% endunless %}
{% endfor %}

e deu certo. Agora, vamos excluir a própria página e a raiz?

{% for my_page in site.pages %}
  {% assign my_page_parts = my_page.url | downcase | split: "."  %}
  {% unless
        my_page_parts[-1] == "css" or
        my_page_parts[-1] == "xml" or
        my_page_parts[0] == "/" or
        my_page.url == page.url %}
  - {{ my_page.url | prepend: site.baseurl }}
  {% endunless %}
{% endfor %}

Ok, agora ajeitar o espaçamento:

{% for my_page in site.pages %}
  {%- assign my_page_parts = my_page.url | downcase | split: "."  -%}
  {%- unless
        my_page_parts[-1] == "css" or
        my_page_parts[-1] == "xml" or
        my_page_parts[0] == "/" or
        my_page.url == page.url %}
  - {{ my_page.url | prepend: site.baseurl }}
  {%- endunless -%}
{% endfor %}

Pronto. Só falta deixar o link mais agradável. A priori, vamos querer o próprio título, mas eventualmente ele pode estar em branco… vamos por um placeholder no caso contrário?

[{% if my_page.title %}{{my_page.title}}{% else %}PLACEHOLDER{% endif %}]({{ my_page.url | prepend: site.baseurl }})

Ok, com isso ficou mais agradável quando tem título:

Mas e em casos de ausência de título? Hmmm… sabe o que sempre tem? Um my_page.url. Então, podemos exibir isso. Eu acho que fica mais bonito, nesse tipo de caso, exibir como se fosse código, monoespaçado, então:

[{% if my_page.title %}{{my_page.title}}{% else %}`{{my_page.url}}`{% endif %}]({{ my_page.url | prepend: site.baseurl }})

No caso, ficaria assim (caso não tivesse título na página de talks):