Module: Jatai::Slug

Defined in:
lib/jatai/slug.rb

Overview

Converte texto livre no identificador que o servidor usa na URL.

O servidor gera o slug com name.parameterize (ActiveSupport) e o valida com /\Aa-z0-9?\z/. A CLI não depende de ActiveSupport — carregá-la inteira por uma função encareceria o boot — então a transliteração é feita à mão para o conjunto que os clientes de fato usam (português). Caracteres fora dessa tabela são descartados, e é por isso que esta conversão é só o PALPITE da primeira requisição: quem manda no slug é o servidor, e o jatai up grava de volta no .jatai.yml o slug que ele retorna.

Idempotente: aplicar sobre um slug válido devolve o mesmo slug. É o que dá retrocompatibilidade com os .jatai.yml antigos, em que app: guardava o nome de exibição — "Alves Barbearia" vira "alves-barbearia", que é exatamente o slug que o servidor gerou na criação daquele app.

Constant Summary collapse

TRANSLITERATIONS =
{
  "á" => "a", "à" => "a", "â" => "a", "ã" => "a", "ä" => "a", "å" => "a",
  "é" => "e", "è" => "e", "ê" => "e", "ë" => "e",
  "í" => "i", "ì" => "i", "î" => "i", "ï" => "i",
  "ó" => "o", "ò" => "o", "ô" => "o", "õ" => "o", "ö" => "o",
  "ú" => "u", "ù" => "u", "û" => "u", "ü" => "u",
  "ç" => "c", "ñ" => "n", "ý" => "y"
}.freeze

Class Method Summary collapse

Class Method Details

.from(text) ⇒ Object

nil quando não sobra nada utilizável — quem chama decide o que dizer ao usuário. Devolver "" mandaria uma URL vazia para a API.



30
31
32
33
34
35
36
37
38
# File 'lib/jatai/slug.rb', line 30

def from(text)
  return nil if text.nil?

  slug = text.to_s.downcase
  slug = slug.gsub(/[^a-z0-9\-]/) { |char| TRANSLITERATIONS.fetch(char, "-") }
  slug = slug.gsub(/-+/, "-").gsub(/\A-|-\z/, "")

  slug.empty? ? nil : slug
end