Статьи

Создание ссылок в Ruby

Решения для организации

У вас есть приложение с полем для заметок, и вы не можете использовать HTML в этом поле. Пользователи хотели бы иметь возможность добавлять ссылки в это поле. Как насчет реализации функции обнаружения ссылок?

Звучит здорово. С чего начать?

Допустим, вы хотите сделать заметку, которая гласит: «URL http://www.sitepoint.com/ruby/ должен быть ссылкой». URL должен стать ссылкой.

Начиная

Давайте сделаем новый файл Ruby

$ touch make_url.rb

Откройте этот новый файл и добавьте следующий код.

make_url.rb

 NOTE = 'The url http://www.sitepoint.com/ruby/ should be a link'  
puts NOTE

Когда вы запустите этот код, вы увидите вывод NOTE на экран.

 $ ruby make_url.rb
The url http://www.sitepoint.com/ruby/ should be a link

Это действительно никуда нас не приведет. Нам нужно посмотреть, есть ли где-нибудь в этой строке URL. Один из способов — разделить строку, посмотреть на каждое слово и посмотреть, соответствуют ли они шаблону URL.

Давайте разделим строку и посмотрим на отдельные слова.

make_url.rb

 NOTE = 'The url http://www.sitepoint.com/ruby/ should be a link'  

def hasURL(note)
  words = note.split
  words.each do |word|
    puts word
  end
end

hasURL(NOTE)

Запустите это, и вы увидите каждое отдельное слово.

 $ ruby make_url.rb
The
url
http://www.sitepoint.com/ruby/
should
be
a
link

Split берет строку и разбивает ее на массив. Разделителем по умолчанию для разделения является пробел. Это дает нам массив слов, которые мы можем индивидуально проверить по шаблону URL.

make_url.rb

 require 'uri'

NOTE = 'The url http://www.sitepoint.com/ruby/ should be a link'

def isURL(word)
  if word =~ URI::regexp
    puts '---- we have a URL! => ' + word
  else
    puts word
  end
end

def hasURL(note)
  words = note.split
  words.each do |word|
    isURL(word)
  end
end

hasURL(NOTE)

Давайте запустим это и крошечное, что мы получим.

 $ ruby make_url.rb
The
url
---- we have a URL! => http://www.sitepoint.com/ruby/
should
be
a
link

Оно работает! Вам может быть интересно, что делает этот URI::regexp . Он проверяет, является ли это URI-подобной строкой, и возвращает true, если у нас есть URL. Руби отлично.

Мы можем использовать наши новые знания для создания ссылок.

make_url.rb

 require 'uri'

NOTE = 'The url http://www.sitepoint.com/ruby/ should be a link'

def makelink(url)
  puts '<a href="' + url + '">' + url + '</a>'
end

def isURL(word)
  if word =~ URI::regexp
    makelink(word)
  else
    puts word
  end
end

def hasURL(note)
  words = note.split
  words.each do |word|
    isURL(word)
  end
end

hasURL(NOTE)

Это приводит к

 $ ruby make_url.rb 
The
url
<a href="http://www.sitepoint.com/ruby/">http:// www.sitepoint.com/ruby/</a>
should
be
a
link

Мы приближаемся.

Refactor

Что, если мы использовали карту, чтобы пройтись по каждому слову? В файле make_url.rb закомментируйте hasURL(note)

 # hasURL(NOTE)
puts NOTE.split.map { |x| x }

Сохраните файл и запустите его.

 $ ruby make_url.rb 
The
url
http://www.sitepoint.com/ruby/
should
be
a
link

Это шаг назад с точки зрения вывода, теперь мы можем удалить некоторый код. Удалите метод hasURL

Вместо того, чтобы отправлять чек в метод, мы можем проверить прямо в строке. Поскольку мы делаем это, мы также можем удалить метод isURLmakeURL

 require 'uri'

NOTE = 'The url http://www.sitepoint.com/ruby/ should be a link'

def makelink(url)
  '<a href="' + url + '">' + url + '</a>'
end

puts NOTE.split.map { |x| x =~ URI::regexp ? makelink(x) : x }

Давайте запустим этот код.

 $ ruby make_url.rb
The
url
<a href="http://www.sitepoint.com/ruby/">http://www.sitepoint.com/ruby/</a>
should
be
a
link

Теперь вы разделяете, повторяете каждое слово и проверяете это слово, чтобы увидеть, является ли оно URL-адресом. Если так, сделайте ссылку. У нас тот же вывод, что и раньше, и мы удалили половину кода.

Возвращаем группу вместе

Это круто и все, но записка все еще массив. Давайте снова вместе.

 puts NOTE.split.map { |x| x =~ URI::regexp ? makelink(x) : x }.join(" ")

Запустите код и наслаждайтесь простотой.

 $ ruby make_url.rb 
The url <a href="http://www.sitepoint.com/ruby/">http://www.sitepoint.com/ruby/</a> should be a link

Потрясающие.

Код у нас был.

 require 'uri'

NOTE = 'The url http://www.sitepoint.com/ruby/ should be a link'

def makelink(url)
  puts '<a href="' + url + '">' + url + '</a>'
end

def isURL(word)
  if word =~ URI::regexp
    makelink(word)
  else
    puts word
  end
end

def hasURL(note)
  words = note.split
  words.each do |word|
    isURL(word)
  end
end

hasURL(NOTE)

Код у нас есть.

make_url.rb
требует ‘Uri’

 NOTE = 'The url http://www.sitepoint.com/ruby/ should be a link'

def makelink(url)
  '<a href="' + url + '">' + url + '</a>'
end

puts NOTE.split.map { |x| x =~ URI::regexp ? makelink(x) : x }.join(" ")

Гораздо чище.

Когда я впервые начал работать с Ruby, я увидел код, который мы только что написали, и почесал голову. Теперь мы начинаем писать такой код и понимаем, что происходит в этих кратких утверждениях.

Ruby полон утилит и методов, которые позволяют нам быть очень лаконичными в достижении нашей цели. Здесь мы сканируем строки на предмет URL-подобных строк и создаем ссылки HTML из каждой. Это делается с помощью нескольких строк Ruby.

Вы можете использовать эту утилиту, чтобы сохранить заметку с массивом ссылок или просто отобразить заметку в формате HTML.