Fui começar a fazer um artigo e senti a real necessidade de fazer o link de um post com seu arquivo no GitLab.

Na real, a origem ser o GitLab é irrelevante, afinal poderia ser qualquer repositório Git que fosse possível pegar um arquivo. A ideia é basicamente adicionar nos posts (talvez abra para outras páginas com frontmatter?) um link para onde o arquivo está publicado, simples assim.

Bem, os posts seguem o layout post.html. Então podemos alterar logo ele para pegar isso. Mas, só isso não é o suficiente. Sabe por quê? Porque precisamos de mais metadados do blog, especificamente do repositório. Então, que tal começar com isso?

Achando o link adequado

No Jekyll tem um arquivo de configuração chamado _config.yml que preenche uma variável que podemos usar nas páginas chamada de site. Então, se eu quero poder manusear a raiz dos blobs, posso criar um objeto dentro de site chamado de repository, e dentro dele posso botar por exemplo blob_root:

repository:
  base: "https://gitlab.com/computaria/blog/"
  blob_root: "https://gitlab.com/computaria/blog/-/blob/master/"
  tree_root: "https://gitlab.com/computaria/blog/-/tree/master/"

Por que colocar o blob_root e não ficar apenas com a UTL base do repositório? Porque o GitLab coloca na navegação /-/blob/{branch}/ para navegar em um blob dentro de um branch e /-/tree/{branch}/ para navegar em um diretório dentro do branch. Existe essa particularidade de posições que eu não costumo lembrar, então para evitar precisar ficar se repetindo continuamente, preferi adotar essa abordagem de acessar o atributo do repository. Mas, como fica isso de apontar para, por exemplo, o layout do post?

Fica assim:

[`post.html`]({{ site.repository.blob_root }}/_layouts/post.html)

post.html

Ok, e para gerar a partir do post? Preciso manusear os dados do post. Como por exemplo page.url. Estamos lidando com algo que se escreve assim: /2024/02/10/link-post-file. Na estrutura atual de posts, a data fica no format yyyy-MM-dd, e depois vem -<nome na url do post>.md, tudo isso na pasta /_posts/. Ou seja, seria transformar o que se tem /2024/02/10/link-post-file arrancando o primeiro caracter, trocaria todas as barras / por -, colocaria .md no final e faria um prepend com a base da URL para blobs seguido de /_posts/. E sabe o que faz isso essa substituição de / por - do jeito certo? O filtro liquid slugify (referência):

`{{ page.url | slugify }}`

2024-02-10-link-post-file

Ou seja, a partir disso, só precisa fazer os prepends e o append, certo? Vamos testar:

[Auto referente]({{ page.url | slugify | prepend: "/_posts/" | prepend: site.repository.blob_root | append: ".md" }})

Auto referente

Bem, não tem como testar agora pelo fato de que este post está em draft e não no repositório do branch principal. Mas podemos tentar com outro post, vamos? Que tal com o Rakefile, parte 2 - criando rascunho? Que foi o último meta-post até o momento?

Vamos lá. Estou citando dessa maneira: {% post_url 2023-12-30-rakefile-create-draft %}. Primeiro eu não consigo manusear diretamente esse post_url, ele é uma tag liquid, não um filtro. Então eu posso jogar o valor dele em uma variável:

{% capture rake2_create %}{% post_url 2023-12-30-rakefile-create-draft %}{% endcapture %}

Então eu poderia citar rake2_create em uma expansão liquid convencional. Abaixo o resultado:

/blog/2023/12/30/rakefile-create-draft

Ok, bingo! Ou quase… acabou capturando blog que não estava na minha mente. Mas posso remover tranquilamente isso usando o filtro liquid remove_first:

{{ rake2_create | remove_first: "/blog" }}
/2023/12/30/rakefile-create-draft

Ok, hora de aplicar o resto da concatenação acima:

{{ rake2_create | remove_first: "/blog" | slugify | prepend: "/_posts/" | prepend: site.repository.blob_root | append: ".md" }}
https://gitlab.com/computaria/blog/-/blob/master//_posts/2023-12-30-rakefile-create-draft.md

E o link? Aqui, vai clica. Curtiu?

Aplicando no layout

Ok, link em mãos (na real, obtível), vamos alterar o layout afinal? Eu acho que ficaria super bonitinho com o ícone do GitLab (já que o uso como repositório).

<a href='{{ rake2_create | remove_first: "/blog" | slugify | prepend: "/_posts/" | prepend: site.repository.blob_root | append: ".md" }}'>
<span class="icon icon--gitlab">{% include icon-gitlab.svg %}</span>
</a>

E fica assim:

O exemplo foi com o post Rakefile, parte 2 - criando rascunho, mas podemos simplesmente usar a auto referência usada mais cedo: . Usando isso no layout de posts, ao lado do nome do usuário. E funcionou para todas as páginas.