Класс CSS это просто еще один атрибут элемента:
doc.search('a').each do |anchor|
anchor.inner_text = "hello!"
anchor['class']="whatever"
end
Поскольку классы CSS являются разделенных пробелами в атрибуте, если вы не уверены, если один или несколько классов, возможно, уже существует, вы будете нужно что-то вроде
anchor['class'] ||= ""
anchor['class'] = anchor['class'] << " whatever"
Вам нужно явно задать атрибут, используя =
вместо того, чтобы просто мутируют возвращаемую строку для атрибута. Это, к примеру, не будет изменять DOM:
anchor['class'] ||= ""
anchor['class'] << " whatever"
Несмотря на то, что приводит к более работы делается, я бы, наверное, сделать это так:
class Nokogiri::XML::Node
def add_css_class(*classes)
existing = (self['class'] || "").split(/\s+/)
self['class'] = existing.concat(classes).uniq.join(" ")
end
end
Если вы не хотите обезьяне-патч класс, вы могли бы в качестве альтернативы:
module ClassMutator
def add_css_class(*classes)
existing = (self['class'] || "").split(/\s+/)
self['class'] = existing.concat(classes).uniq.join(" ")
end
end
anchor.extend ClassMutator
anchor.add_css_class "whatever"
Edit: вы можете видеть, что это в основном то, что делает Nokogiri внутренне для add_class
метод, который вы нашли, нажав на классе, чтобы просмотреть исходный код:
# File lib/nokogiri/xml/node_set.rb, line 136
def add_class name
each do |el|
next unless el.respond_to? :get_attribute
classes = el.get_attribute('class').to_s.split(" ")
el.set_attribute('class', classes.push(name).uniq.join(" "))
end
self
end
bigup the ClassMutator! Спасибо! – flunder