Метод усечения Rails: игнорировать HTML в строке длины - PullRequest
1 голос
/ 24 августа 2011

Я использую метод усечения, чтобы усечь строку на моем сайте. Усекаю с кодом:

 truncate(auto_link(textilize(post.content)), :length  => 140)

Это усечение усекает содержание сообщения, но есть проблема с содержанием, содержащим ссылки. Например, содержание сообщения:

 <p>Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo 
 <a href="http://www.yahoo.com">Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo 
 Yahoo </a> Google Google Google Google Google Google Google Google Google Google  <a 
 href="http://www.google.com"> Google Google Google Google Google Google Google Google 
 </a><br></p>

В этом случае все html-теги и ссылки подсчитываются в счетчике символов методом усечения, а не методом усечения, подсчитывающим символы, которые фактически увидит зритель:

 Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo
 Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo Yahoo  (etc..)

Есть ли здесь какая-нибудь работа для метода усечения?

РЕДАКТИРОВАТЬ: новый пример для устранения неясностей:

Пользователи публикуют свои сообщения в виде простого текста, и им разрешается использовать текстиль для некоторого форматирования. Что касается публикации ссылок, я разрешаю пользователям (а) вставлять простые URL-адреса (http://www.site.com, www.site.com и т. Д.), (Б) использовать текстовый синтаксис, который преобразует текст «кликни мне»: http://www.example.com в кликни мне текст или найди время, чтобы встроить ссылки в HTML-форму.

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

 Today I went to the market to pick up some fruit. "At the market there was this awesome
 fruit display!":http://www.externalsite.com/picture.jpg Definitely want to go back 
 tomorrow!

Это будет преобразовано с помощью textilize в строку из 193 символов:

 Today I went to the market to pick up some fruit. <a href="http://www.externalsite.com/picture.jpg"> 
 At the market there was this awesome fruit display!</a> Definitely want to go back 
 tomorrow!

Текст, который пользователь увидит на странице, состоит всего из 138 символов:

 Today I went to the market to pick up some fruit. At the market there was this awesome
 fruit display! Definitely want to go back tomorrow!

Текст длиной 193 символа будет обрезан усечением, но если бы у меня была работа, весь текст отображался бы так, что в итоге получалось бы всего 138 символов со встроенной ссылкой.

Ответы [ 3 ]

0 голосов
/ 24 августа 2011

Не стоит обрезать текст, содержащий HTML-код.

Я предлагаю вам использовать простой текст.В противном случае альтернативой будет

  1. use auto_link
  2. заменить каждую ссылку на заполнитель из 1 символа, например $
  3. truncate
  4. replaceвернуть каждому заполнителю старую соответствующую ссылку

Это что-то вроде хака, но оно должно работать.Опять же, я предлагаю вам использовать простой текст при усечении.

0 голосов
/ 21 октября 2011

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

 count = strip_tags(string).count

(Это для строки, содержащей html-теги. Если строка должна быть 'textilized'и т. д. сначала, затем код count = strip_tags (textilize (string)). count).

Вместо того, чтобы использовать усечение, я просто ограничил счет до 140 символов этого истинного счета, т.е. переключил это напроверка на поле.

0 голосов
/ 24 августа 2011

Вы возвращаете строку со всеми ссылками в ней. Так что усечение делает это правильно. То, что вам нужно, - это пройти через метод, который возвращает вам только связанный текст (который, я думаю, должен быть обрезан).

Вы можете использовать RegEx для этого, чтобы получить связанную строку, например, (не проверено)

post.content.gsub /<a[\w\"]*>([a-z]*)<\/a>/i do |link_text|
  truncate(auto_link(link_text), :truncate => 40)
end
...