направляющие: получите тизер/выборку для статьи

Контент здесь является байтовым объектом. Вы пытаетесь найти строку в байтовом объекте. Преобразуйте содержимое в строку, изменив строку

Content = response.read()

на

Content = str(response.read())
8
задан Ankit Pandya 3 December 2015 в 08:43
поделиться

5 ответов

Большое спасибо за Ваши ответы! Однако тем временем я наткнулся на HTML jQuery плагин Truncator, который отлично соответствует моим целям и смещает усечение к клиентскому. Это не становится немного легче :-)

2
ответ дан 5 December 2019 в 07:37
поделиться

Мой ответ здесь должен сделать работу. Исходный вопрос (допускают ошибку, спрошенные мной) был об усечении скидки с цены, но я закончил тем, что преобразовал скидку с цены в HTML, затем усекающий это, таким образом, это должно работать.

Конечно, если Ваш сайт получает много трафика, необходимо ли кэшировать выборку (возможно, когда сообщение создается/обновляется, Вы могли сохранить выборку в базе данных?), это также означало бы, что Вы могли позволить пользователю изменять или вводить их собственную выборку

Использование:

>> puts "<p><b><a href=\"hi\">Something</a></p>".truncate_html(5, at_end = "...")
=> <p><b><a href="hi">Someth...</a></b></p>

.. и код (скопированный с другого ответа):

require 'rexml/parsers/pullparser'

class String
  def truncate_html(len = 30, at_end = nil)
    p = REXML::Parsers::PullParser.new(self)
    tags = []
    new_len = len
    results = ''
    while p.has_next? && new_len > 0
      p_e = p.pull
      case p_e.event_type
      when :start_element
        tags.push p_e[0]
        results << "<#{tags.last}#{attrs_to_s(p_e[1])}>"
      when :end_element
        results << "</#{tags.pop}>"
      when :text
        results << p_e[0][0..new_len]
        new_len -= p_e[0].length
      else
        results << "<!-- #{p_e.inspect} -->"
      end
    end
    if at_end
      results << "..."
    end
    tags.reverse.each do |tag|
      results << "</#{tag}>"
    end
    results
  end

  private

  def attrs_to_s(attrs)
    if attrs.empty?
      ''
    else
      ' ' + attrs.to_a.map { |attr| %{#{attr[0]}="#{attr[1]}"} }.join(' ')
    end
  end
end
3
ответ дан 5 December 2019 в 07:37
поделиться

Можно использовать комбинацию, Санируют и Усекают.

truncate("And they found that many people were sleeping better.", 
  :omission => "... (continued)", :length => 15)
# => And they found... (continued)

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

sanitize(truncate(blog_post.body, length: 150))

Это разделяет HTML-тэги, дает мне первые 150 символов и обрабатывается в представлении, таким образом, это - товарищеская встреча MVC.

Удачи!

15
ответ дан 5 December 2019 в 07:37
поделиться

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

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

если бы это возможно вообще, что я попытался бы не поместить любые теги в статьи или сохранить его к тегам, которые ничего не содержат (нет <div> и так далее). тем путем необходимо было бы только проверить, ли Вы посреди тега, который довольно прост:

  def shorten (string, count = 30)
     if string.length >= count
       shortened = string[0, count]
       splitted = shortened.split(/\s/)
       words = splitted.length
       if(splitted[words-1].include? "<")
         splitted[0,words-2].join(" ") + ' ...'
       else
         splitted[0, words-1].join(" ") + ' ...'
     else
       string
     end   
  end
1
ответ дан 5 December 2019 в 07:37
поделиться

Я санировал бы HTML и извлек бы первое предложение. Принятие Вас имеет модель статьи с атрибутом 'тела', который содержит HTML:

# lib/core_ext/string.rb
class String
  def first_sentence
    self[/(\A[^.|!|?]+)/, 1]
  end
end

# app/models/article.rb
def teaser
  HTML::FullSanitizer.new.sanitize(body).first_sentence
end

Это преобразовало бы" <b> Этот </b>, <они>, важные </их> статья! И вот остальная часть статьи". в "Это важная статья".

1
ответ дан 5 December 2019 в 07:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: