У вас есть приложение с полем для заметок, и вы не можете использовать 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
Вместо того, чтобы отправлять чек в метод, мы можем проверить прямо в строке. Поскольку мы делаем это, мы также можем удалить метод isURL
makeURL
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.