Running with Ruby

Tag: String

CamelCase na underline – w języku Ruby – zamiana konwencji

Aby zamieniać CamelCase (np. ToJestCamel) na odpowiednik z podkreślnikami (to_jest_camel), w języku Ruby najprościej dopisać sobie małe rozszerzenie do klasy String:

class String
  def underlinize
    self.split(/(?=[A-Z])/).join('_').downcase
  end
end

Dzięku temu możemy wywoływać sobie naszą metodę w ten sposób:

txt = 'NaszCamelCase'
puts txt.underlinize
# wynik:
nasz_camel_case

String to URL czyli jak zamienić nazwę lub tekst na link

Dzisiaj potrzebowałem napisać sobie metodę która nazwy działów zamieni na linki. Początkowo chciałem to zrealizować w modelu Menu gdzie po prostu wywoływałbym metodę to_url która zwracałaby mi adres w formie id-jakis-tam-link. Niestety wadą takiego rozwiązania jest fakt że wtedy linki mogłyby być generowane tylko z modelu Menu.

Aby tego uniknąć napisałem malutkie rozszerzenie do klasy String, które zamienia nam tekst na odpowiednik z samymi małymi literkami, usuwa nasze “ogonki”, usuwa inne niechciane w URLach znaki oraz zamienia spacje na pauzy. Jest ona bardzo prosta i niezbyt elegancka ;) ale swoje robi. Sam proces zamiany znaków polskich na ich odpowiedniki “bezogonkowe” wzorowałem na kodzie Tomasha – ascii_tic. Jednak resztę miałem już napisaną zanim zacząłem szukać rozwiązania na usunięcie ogonków.

Poniżej zamieszczam cały kod rozwiązania:

# Dodatkowe metody klasy string

class String
  # Zwraca strina bez polskich literek, z małej litery, z usuniętymi innymi
  # znakami oraze z zamienioną spacją na pauze (-)
  def to_url
    temp = self.downcase
    temp
    temp.gsub!(/[âäàãáäå�?ăąǎǟǡǻ�?ȃȧẵặ]/,'a')
    temp.gsub!(/[ëêéèẽēĕėẻȅȇẹȩęḙḛ�?ếễểḕḗệ�?]/,'e')
    temp.gsub!(/[�?iìíîĩīĭïỉ�?ịįȉȋḭɨḯ]/,'i')
    temp.gsub!(/[òóôõ�?�?ȯö�?őǒ�?�?ơǫ�?ɵøồốỗổȱȫȭ�?�?ṑṓ�?ớỡởợǭộǿ]/,'o')
    temp.gsub!(/[ùúûũūŭüủůűǔȕȗưụṳųṷṵṹṻǖǜǘǖǚừứữửự]/,'u')
    temp.gsub!(/[ỳýŷỹȳ�?ÿỷẙƴỵ]/,'y')
    temp.gsub!(/[ñǹń]/,'n')
    temp.gsub!(/[çć]/,'c')
    temp.gsub!(/[ß]/,'ss')
    temp.gsub!(/[œ]/,'oe')
    temp.gsub!(/[ij]/,'ij')
    temp.gsub!(/[�?ł]/,'l')
    temp.gsub!(/[ś]/,'s')
    temp.gsub!(/[źż]/,'z')
    temp.gsub!(/[^a-zA-Z 0-9]/, "")
    temp.gsub!(/\s/,'-')
    temp.gsub!(/\-+$/,'')
    temp.gsub!(/^\-+/,'')
    temp
  end

  # to_url tylko wykonane na sobie
  def to_url!
    self.replace self.to_url
  end
end

Od teraz, mając jakikolwiek tekst, możemy na nim wywołac metodę to_url która zwróci nam jego “odpowiednik linkowy”.

Copyright © 2018 Running with Ruby

Theme by Anders NorenUp ↑