Gerador de slugs

Transforma um título num slug de URL, com transliteração de hebraico, árabe, cirílico e grego, a forma Unicode ao lado e detecção de colisões.

Slug
creme-brulee-grusse-aus-munchen
Caminho Unicode — sem transliteração, sem perdas
crème-brûlée-grüße-aus-münchen
Codificado em porcentagem — o que o servidor vê
cr%C3%A8me-br%C3%BBl%C3%A9e-gr%C3%BC%C3%9Fe-aus-m%C3%BCnchen

O navegador mostra a forma legível acima e envia esta. As duas são o mesmo caminho.

O que esta ferramenta faz

Cole um título em qualquer escrita e ele volta como o slug que um URL consegue transportar: minúsculas, sem pontuação, palavras unidas pelo separador que escolher. Os acentos latinos são retirados, e o hebraico, o árabe, o cirílico e o grego são transliterados para letras latinas.

Ao lado do slug fica o mesmo título preservado na sua própria escrita. Essa forma também é um caminho legítimo, e para as escritas que mais perdem na transliteração é muitas vezes a melhor resposta — por isso ambas são produzidas a partir de um só título, em vez de a ferramenta escolher por si.

Para que serve um slug

Um slug é a parte legível de um URL: o pedaço a seguir à última barra que dá nome à página em vez de a numerar. Existe porque um caminho que se lê como palavras sobrevive a ser colado numa mensagem, impresso num diapositivo ou lido em voz alta ao telefone, e um identificador numérico não faz nada disso.

É também por isso que a sua forma é tão restrita. Um slug deve ser estável — mudá-lo quebra todos os links que já apontam para a página — e deve ser inequívoco quando escrito à mão, o que exclui espaços, maiúsculas que um leitor pode ou não reproduzir, e pontuação que significa algo para uma shell ou para um analisador de Markdown.

Como saem os acentos

A maior parte dos diacríticos latinos é retirada pela plataforma e não por uma tabela. O Unicode define é como decomponível num e simples seguido de um acento agudo combinante, portanto normalizar para essa forma decomposta e depois descartar cada marca combinante deixa para trás a letra simples. A mesma operação trata ñ, ç, ő e mais umas centenas, e não pode ficar desatualizada, porque usa os dados Unicode que o navegador já traz.

Não trata de tudo, e vale a pena conhecer a falha. Uma letra cuja marca é um traço que atravessa o glifo em vez de um sinal por cima — ø, ł, đ, ħ, ŧ — é um único caractere indivisível sem decomposição nenhuma, portanto retirar marcas a deixa exatamente como estava. O mesmo acontece com uma ligadura: ß, æ e œ representam cada uma uma sequência de sons, não uma letra mais um adorno. Todas precisam de uma grafia explícita, e sem ela desapareceriam simplesmente do slug.

Por que a configuração de idioma muda a resposta

Não existe uma única romanização correta de ü. O alemão escreve-a ue desde antes de a diérese existir — os dois pontos começaram como um pequeno e sobrescrito — por isso Müller é propriamente mueller, e a um leitor alemão muller parecerá errado. O francês, o espanhol e o português tratam os seus diacríticos como acentos sobre uma letra que de resto é ela própria, portanto crème brûlée é propriamente creme-brulee, e escrevê-lo cruemme não faria sentido.

As línguas nórdicas discordam entre si da mesma maneira. O dinamarquês e o norueguês duplicam a vogal, seguindo a grafia antiga que a letra substituiu; o sueco não:

  • Alemão — ä passa a ae, ö passa a oe, ü passa a ue, ß passa a ss. München fica muenchen.
  • Dinamarquês e norueguês — æ passa a ae, ø passa a oe, å passa a aa. Ålborg fica aalborg.
  • Sueco — ä passa a a, ö passa a o, å passa a a. Ålborg fica alborg.
  • Genérico — toda a marca cai e a letra de base fica. Ålborg fica alborg, München fica munchen.

Não são aproximações rivais de uma única resposta; são quatro respostas corretas diferentes a quatro perguntas diferentes. Só uma pode ser a padrão, por isso a configuração está à vista e a ferramenta diz que convenção produziu aquilo que está vendo. Uma letra é igual em todo lugar: ß é uma ligadura e não um acento, portanto descartá-la apagaria um som, e é ss em todas as configurações aqui.

As escritas que precisam de uma tabela

Nada no navegador romaniza o cirílico, o grego, o hebraico ou o árabe, portanto cada um é uma tabela escrita à mão contra uma norma publicada. Duas delas saem bem, porque escrevem as suas vogais:

  • O cirílico segue BGN/PCGN, a romanização dos mapas e passaportes em inglês: ж é zh, ч é ch, щ é shch, х é kh. Москва fica moskva e Чехов fica chekhov.
  • O grego segue ELOT 743, incluindo os dígrafos que define: ου é ou e não oy, e ευ é ev. Αθήνα fica athina e Ευρώπη fica evropi.

A ISO 9 é a outra norma cirílica conhecida e aqui não é usada de propósito. É reversível, e esse é o seu objetivo, mas consegue-o com diacríticos: ж é ž. Um slug não tem espaço para um caron, portanto este achataria de imediato para z — e Жуков e Зуков ficariam com o mesmo slug. O dígrafo da BGN sobrevive ao achatamento.

Um detalhe da tabela cirílica é fácil de errar e merece ser dito. ё e й parecem letras com acento, e o Unicode decompõe-nas assim, mas a marca é o que faz delas letras diferentes e não um adorno sobre a mesma. Retirar as marcas antes de consultar a tabela — a ordem certa para todas as outras escritas aqui — transforma calmamente Ёлка em elka e Андрей em andrei.

O hebraico e o árabe, e o que perdem

Ambas as escritas escrevem consoantes e deixam a maioria das vogais a pontos que o texto corrente não leva. Não é um problema de codificação que esta ferramenta pudesse resolver com uma tabela melhor: a informação não está no texto. «מאמר» são quatro letras, mem-alef-mem-resh, e a leitura maamar vem de um leitor que já conhece a palavra. Letra a letra só pode ser mamr.

O que se pode fazer é feito. Onde uma letra serve também de sinal vocálico usa-se a posição, porque é o único sinal que um texto sem pontos deixa:

  • ו e י são consoantes no início de uma palavra e letras vocálicas dentro dela, e é isso que torna שלום em shlom em vez de shlvm.
  • Um וו ou um יי duplicado é a mesma consoante em ambos os casos — essa duplicação é exatamente como o hebraico distingue as duas leituras.
  • ב‎, כ e פ são oclusivas no início de uma palavra e fricativas dentro dela. O daguesh que marca a diferença é um ponto vocálico, portanto a posição é tudo o que resta.
  • Uma letra seguida de gueresh é o som para o qual o alfabeto não tem letra: ג׳ é j, צ׳ é ch, ז׳ é zh. Ignorá-lo faria de ג׳אז outra palavra.
  • As consoantes enfáticas árabes colapsam sobre as suas equivalentes simples, porque o ASCII não tem onde pôr o ponto inferior que as distingue. صابر e سابر produzem o mesmo slug.

O resultado é legível e reconhecível, e não é uma grafia que alguém chamasse correta. A ferramenta o diz em cada resultado hebraico ou árabe em vez de apresentar uma resposta com perdas como se estivesse acabada — e aponta para a forma abaixo, que não perde absolutamente nada.

O caminho Unicode, que não precisa de transliteração

O caminho de um URL não está limitado a ASCII. O RFC 3987 define o IRI — um identificador que pode conter qualquer caractere Unicode — e a regra para o pôr no fio é codificar os bytes UTF-8 como escapes de porcentagem. Todos os navegadores o fazem há duas décadas, e é por isso que a Wikipédia serve os seus títulos hebraicos e russos com o nome deles e a barra de endereço os mostra legíveis.

Por isso a segunda saída aqui é o título com a pontuação e os espaços limpos e nada mais tocado, e a terceira é o aspecto que isso tem realmente no fio. São o mesmo caminho: o legível é o que um navegador mostra e o que uma pessoa copia, e o codificado é o que o servidor registra.

Qual usar é uma decisão a sério e não uma formalidade. A forma Unicode não perde nada, lê-se corretamente para quem fale a língua, e é o que um motor de busca mostrará. A forma transliterada sobrevive a ser colada em lugares que estragam codificações, encaixa em sistemas que pressupõem caminhos ASCII, e pode ser lida ao telefone. Para o hebraico e o árabe em particular a forma Unicode é normalmente a melhor resposta, precisamente porque a transliteração não consegue recuperar as vogais.

Um título árabe, levado até o fim

Tudo isso se encontra em um título comum, então aqui vai um levado do começo ao fim. تعلم البرمجة significa aprender a programar — duas palavras, sem pontuação e sem sinais vocálicos, e é assim que o árabe se escreve em toda parte fora de um livro didático, de um dicionário e de uma escritura sagrada.

Voltam três formas. O slug é tlm-albrmjh; o caminho Unicode é تعلم-البرمجة, ou seja, o próprio título com o separador no lugar do espaço; e no fio esse mesmo caminho é %D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9, as mesmas duas palavras em bytes UTF-8. Só a primeira das três perdeu alguma coisa, e perdeu em cada uma das duas palavras:

  • تعلم se lê taallum. Entram quatro letras e saem três: ع não tem letra no alfabeto latino, então cai em vez de ser escrita com um sinal inventado, e as vogais breves que quem lê ouve nunca chegaram a ser escritas.
  • البرمجة se lê al-barmaja. O artigo definido ال chega como al, e o ta marbuta ة que fecha a palavra é escrito h, pela letra cuja forma toma emprestada, e não como o a que se ouve: vogal é justamente o que esta escrita deixa de fora.
  • Leia tlm-albrmjh de volta e nada nele diz quais vogais estavam entre as consoantes. taallum é o que a palavra é, tlm é o que as letras são, e só quem já conhece a palavra passa de um para o outro.

A perda não para na leitura. عمر, o nome Omar, volta como mr — e مر também, que é outra palavra, porque o ع que as separava sumiu. Dois títulos diferentes podem por isso cair em um mesmo slug, o que o modo de lista marca como choque em vez de numerar em silêncio; a forma de caminho Unicode de cada um mantém os dois separados, porque mantém tudo.

Colisões, e porque não são resolvidas por si

Fazer um slug retira a pontuação, portanto títulos que só diferem nela deixam de diferir por completo. «O nosso guia de CSS» e «O nosso guia de CSS!» são dois artigos e um só slug. No modo de lista cada choque desses é marcado com a linha com que colide, porque esta é a falha que um gestor de conteúdos esconde: acrescenta um sufixo em silêncio, publica, e o URL que esperava pertence ao outro artigo.

O sufixo está disponível como interruptor e produz o estilo do WordPress e do Django — o-nosso-guia-de-css, o-nosso-guia-de-css-2 — para o caso de uma lista ser para colar algures tal como está. Vem desligado porque uma colisão costuma ser um problema de conteúdo e não de nomes, e a colisão continua marcada mesmo com o interruptor ligado, portanto ligá-lo não esconde nada.

Comprimento, e cortar no lugar certo

Um limite de comprimento corta numa fronteira de separador, nunca dentro de uma palavra. Truncar a meio de uma palavra não produz tanto um slug mais curto como um slug diferente — introduction-to-crypt não é um introduction-to-cryptography mais arrumado — e meia palavra é uma palavra que significa outra coisa. Se uma única palavra ultrapassar o limite não há fronteira onde cortar, e ela é devolvida inteira em vez de fatiada.

Não há um limite universalmente certo. Os motores de busca mostram sensivelmente os primeiros sessenta a setenta caracteres de um URL, e sistemas antigos por vezes limitam um segmento de caminho, mas nada se parte num número em concreto. Deixar o campo vazio deixa o slug tão comprido quanto o título precisar.

Perguntas frequentes

Que caracteres são seguros num slug de URL?
Letras ASCII minúsculas, algarismos e um único separador funcionam em todo lugar sem exceção. O hífen é o separador convencional; o traço inferior funciona de forma idêntica mas vê-se pior debaixo de um link sublinhado. Espaços, maiúsculas e pontuação são todos tecnicamente codificáveis e todos dão problemas na prática, por isso um slug retira-os.
Hífen ou traço inferior?
Hífen, por duas razões que sobrevivem às modas. É o que todas as grandes plataformas usam, logo é o que leitores e outras ferramentas esperam, e desaparece debaixo do sublinhado que a maioria dos links leva, o que o traço inferior não faz. A escolha é oferecida aqui porque os sistemas existentes têm convenções existentes, e a coerência dentro de um mesmo site importa mais do que qualquer das respostas.
Por que o meu título em hebraico ou árabe perde as vogais?
Porque nunca foram escritas. Ambas as escritas marcam a maioria das vogais com pontos que o texto corrente omite, portanto uma leitura letra a letra é tudo o que qualquer ferramenta pode produzir sem um motor de vocalização a adivinhar que palavra se pretendia. Esta translitera o que lá está de fato, diz isso no resultado, e oferece a forma de caminho Unicode, que conserva o título tal como foi escrito.
Por que meu título árabe perde letras inteiras, e não só vogais?
Porque duas consoantes árabes não têm letra latina em que se transformar. ع e ء são sons que o inglês não escreve, e inventar um sinal para eles seria pior do que perdê-los, então caem: por isso تعلم volta como tlm, três letras de quatro. As vogais são a perda mais conhecida e não são a única. A forma de caminho Unicode ao lado do slug não tem nenhum dos dois problemas, porque não translitera nada.
Pode um URL conter hebraico, árabe ou chinês diretamente?
Sim. Um caminho pode levar qualquer caractere Unicode; é codificado em porcentagem como UTF-8 no fio e mostrado legível pelo navegador. É assim que a Wikipédia serve títulos de artigo em todas as línguas que cobre. Esta ferramenta mostra tanto a forma legível como a codificada, já que a segunda é a que aparece nos registros do servidor e nas estatísticas.
Por que Müller é umas vezes mueller e outras muller?
Porque ambos estão certos, em línguas diferentes. O alemão escreve a diérese por extenso — os dois pontos nasceram como um pequeno e sobrescrito — enquanto o francês e o espanhol tratam os seus diacríticos como marcas sobre uma letra que de resto é ela própria. A configuração de idioma escolhe uma convenção, e a ferramenta diz a você qual aplicou.
Por que dois dos meus títulos produzem o mesmo slug?
Porque fazer um slug remove a pontuação e as maiúsculas, muitas vezes a única coisa que separa dois títulos. O modo de lista marca cada colisão com a linha com que choca. Pode ligar o sufixo -2 ao estilo do WordPress, mas a pergunta de fundo — se dois artigos devem mesmo ter quase o mesmo nome — merece ser respondida primeiro.
Alguma coisa do que escrevo é enviada para um servidor?
Não. Todas as transformações rodam no seu navegador; nada é carregado nem registrado, e funciona sem conexão à rede.

Ferramentas relacionadas