#html #ruby #parsing #nokogiri #text-processing
#HTML #ruby #синтаксический анализ #nokogiri #обработка текста #Синтаксический анализ
Вопрос:
У меня есть HTML-документ, в котором есть длинные слова:
<div>this is a veeeeeeeeeeeerryyyyyyyyloooongwoooord<img src="/fooooooooobaaar.jof" ></div>
Я хочу переносить его в word, не обрезая теги или их атрибуты:
<div>this is a veeeeeeeeeeeerryyyyy yyyloooongwoooord<img src="/fooooooooobaaar.jof" ></div>
Также, возможно, что у меня вообще не будет никакого HTML-тега.
Я попробовал Nokogiri, но он вставляет абзац во ввод без тегов и оборачивает весь ответ HTML-документом, что не входит в мои намерения.
Каков наилучший способ добиться этого?
require "Nokogiri"
class String
def wrap()
doc = Nokogiri::HTML(self)
doc.at("body").traverse do |p|
if p.is_a?(Nokogiri::XML::Text)
input = p.content
p.content = input.scan(/.{1,25}/).join(" ")
end
end
doc.to_s # I want only the wrapped string, without the head/body stuff
end
end
Комментарии:
1. Было бы полезно, если бы вы сначала показали написанный вами код. Это дает нам кое-что для начала.
Ответ №1:
Я думаю, что использование Nokogiri:: XML (self) вместо Nokogiri:: HTML (self) поможет вам.
Комментарии:
1. Нет, если это действительно HTML. Nokogiri использует более строгий анализатор для XML, чем для HTML.
Ответ №2:
Это похоже на отправную точку для вас:
require 'nokogiri'
max_word_length = 30
html = '<div>this is a veeeeeeeeeeeerryyyyyyyyloooongwoooord<img src="/fooooooooobaaar.jof" ></div>'
doc = Nokogiri::HTML.fragment(html)
doc.search('text()').each do |n|
n.content = n.content.split(' ').map { |l|
if (l.size > max_word_length)
l = l.scan(/.{1,#{ max_word_length }}/).join("n")
end
l
}.join(' ')
end
puts doc.to_html
# >> <div>this is a veeeeeeeeeeeerryyyyyyyyloooong
# >> woooord<img src="/fooooooooobaaar.jof">
# >> </div>
Комментарии:
1. не работает, если вам нравятся значения htmlв исходном коде, например amp;shy;
2. Затем сначала обработайте их. Это не было готовым решением, это отправная точка.