Nano Hash - криптовалюты, майнинг, программирование

Rails 4: как идентифицировать и форматировать ссылки, хэштеги и упоминания в атрибутах модели?

В моем приложении Rails 4 у ​​меня есть модель Post с :copy и :short_copy в качестве пользовательских атрибутов (строк).

Эти атрибуты содержат копии для социальных сетей (Facebook, Twitter, Instagram, Pinterest и т. д.).

Я отображаю содержимое этих атрибутов в своем представлении Posts#Show.

В настоящее время URL-адреса, #хэштеги и @упоминания форматируются так же, как и остальной текст.

Что я хотел бы сделать, так это отформатировать их по-другому, например, другим цветом или жирным шрифтом.

Я нашел жемчуг twitter-text, который, кажется, предлагает такие функции , но моя проблема в том, что мне НЕ нужно и я НЕ хочу, чтобы эти URL-адреса, #хэштеги и @упоминания превращались в настоящие ссылки.

Действительно, похоже, что гем twitter-text по умолчанию преобразует URL-адреса, #хэштеги и @mentions с помощью Twitter::Autolink, как описано в этот вопрос Stack Overflow.

Это не то, что я ищу: я просто хочу обновить стиль своих URL-адресов, #хэштегов и @упоминаний.

Как я могу сделать это в Ruby/Rails?

—————

ОБНОВЛЕНИЕ:

Следуя ответу Уэса Фостера, я реализовал следующий метод в post.rb:

def highlight(string)
  string.gsub!(/\S*#(\[[^\]]+\]|\S+)/, '<span class="highlight">\1</span>')
end

Затем я определил следующий класс CSS:

.highlight {
    color: #337ab7;
}

Наконец, я реализовал <%= highlight(post.copy) %> в нужном виде.

Теперь я получаю следующую ошибку:

ArgumentError
wrong number of arguments (1 for 2..3)
<td><%= highlight(post.copy) %></td>

Что я делаю неправильно?

—————


  • Используйте регулярное выражение и оберните их в <span class="hashtag">. 20.10.2015

Ответы:


1

Я уверен, что каждый из следующих шаблонов регулярных выражений можно улучшить, чтобы они соответствовали еще большему количеству параметров, однако для меня работает следующий код:

def highlight_url(str)
    str.gsub!(/(https?:\/\/[\S]+)/, '[\1]')
end

def highlight_hashtag(str)
    str.gsub!(/\S*#(\[[^\]]+\]|\S+)/, '[#\1]')
end

def highlight_mention(str)
    str.gsub!(/\B(\@[a-z0-9_-]+)/i, '[\1]')
end

# Initial string
str = "Myself and @doggirl bought a new car: http://carpictures.com #nomoremoney"

# Pass through each
highlight_mention(str)
highlight_hashtag(str)
highlight_url(str)

puts str   # > Myself and [@doggirl] bought a new car: [http://carpictures.com] [#nomoremoney]

В этом примере я заключил совпадения в скобки []. Вы должны использовать тег span и стилизовать его. Кроме того, для простоты вы можете объединить все три gsub! в один метод.

Обновлено для вопроса об ошибке задающего вопрос о дополнении

Похоже, ошибка ссылается на другой метод с именем highlight. Попробуйте изменить имя метода с highlight на new_highlight, чтобы посмотреть, решит ли это новую проблему.

20.10.2015
  • Потрясающе, большое спасибо! Я пытаюсь использовать диапазон, как вы рекомендуете, но это вызывает некоторую синтаксическую ошибку. Вот что я пытался сделать, например, в первом методе: def highlight(string) string..gsub!(/(https?:\/\/[\S]+)/, '<span class="highlight">\1</span>') end Любая идея, как я могу заставить это работать? 20.10.2015
  • @ThibaudClement В вашем коде две точки: string..gsub 20.10.2015
  • Извините, это опечатка. Я считаю, что проблема связана с ' и ", которые я использую. Вам не кажется? 20.10.2015
  • Какая точная ошибка? Я не думаю, что это будут цитаты. Возможно, обновите конец вашего вопроса, чтобы я мог увидеть ваш точный код и ошибку. 20.10.2015
  • Вы были правы, с кавычками проблем не было. Однако теперь я получаю новую ошибку, как вы можете видеть в моем ОБНОВЛЕНИИ. 20.10.2015
  • Я обновил метод до new_highlight как в модели, так и в представлении, и я получил NoMethodError undefined method new_highlight'`. 21.10.2015
  • Добавьте свой new_highlight в помощник представления, а не в свою модель. Или, если вы собираетесь внедрить его в свою модель, вам нужно будет ссылаться на него из экземпляра этой модели. Например: post.new_highlight 21.10.2015
  • Ok. Итак, я обновил метод в модели до def new_highlight self.copy.gsub!(/\S*#(\[[^\]]+\]|\S+)/, '<span class="highlight">\1</span>') end, а затем обновил представление с помощью «post.new_highlight». Это не вызывает никакой ошибки, но нет, у меня <span class="highlight">Test</span>, т.е. теги <span> отображаются как текст, а не внедряются в HTML. 21.10.2015
  • Это входит в основы Rails и MVC. Поместите код в помощник представления, используйте raw, чтобы гарантировать, что HTML не экранируется, и все будет готово. 21.10.2015
  • Нормально будет сделать. Просто быстрый вопрос: этот метод должен форматировать атрибут сообщения, но будет отображаться в представлении календаря. Итак, должен ли я определить метод в posts_helper или calendars_helper? 21.10.2015
  • Вы можете выбрать то, что имеет для вас наибольший смысл. Я бы выбрал posts_helper 21.10.2015
  • Спасибо большое за вашу помощь. У меня нет большого опыта, и я пытаюсь учиться на ходу, поэтому такое руководство действительно полезно;) 21.10.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..