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 deteçã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 percentagem — 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 guardado 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 parte todas as ligações 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, pelo que 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 carácter indivisível sem decomposição nenhuma, pelo que 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.

Porque a definiçã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 — pelo que 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, pelo que 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 predefinida, por isso a definição está à vista e a ferramenta diz que convenção produziu aquilo que está a ver. Uma letra é igual em todo o lado: ß é uma ligadura e não um acento, pelo que descartá-la apagaria um som, e é ss em todas as definições aqui.

As escritas que precisam de uma tabela

Nada no navegador romaniza o cirílico, o grego, o hebraico ou o árabe, pelo que 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, pelo que este achataria de imediato para z — e Жуков e Зуков ficariam com o mesmo slug. O dígrafo da BGN sobrevive ao achatamento.

Um pormenor 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 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, pelo que 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 di-lo 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 carácter Unicode — e a regra para o pôr no fio é codificar os bytes UTF-8 como escapes de percentagem. 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 aspeto 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 regista.

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 sítios 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.

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

Fazer um slug retira a pontuação, pelo que títulos que só diferem nela deixam de diferir de todo. «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, pelo que ligá-lo não esconde nada.

Comprimento, e cortar no sítio 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 o lado sem exceção. O hífen é o separador convencional; o traço inferior funciona de forma idêntica mas vê-se pior debaixo de uma ligação sublinhada. 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 das ligações 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.
Porque é 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, pelo que 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 facto, di-lo no resultado, e oferece a forma de caminho Unicode, que conserva o título tal como foi escrito.
Pode um URL conter hebraico, árabe ou chinês diretamente?
Sim. Um caminho pode levar qualquer carácter Unicode; é codificado em percentagem 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 registos do servidor e nas estatísticas.
Porque é 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 definição de idioma escolhe uma convenção, e a ferramenta diz-lhe qual aplicou.
Porque é 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 correm no seu navegador; nada é carregado nem registado, e funciona sem ligação à rede.