una classe CSS è solo un altro attributo di un elemento:
doc.search('a').each do |anchor|
anchor.inner_text = "hello!"
anchor['class']="whatever"
end
Dal classi CSS sono delimitato da spazi nell'attributo, se non siete sicuri se potrebbero già esistere una o più classi Avrete bisogno di qualcosa come
anchor['class'] ||= ""
anchor['class'] = anchor['class'] << " whatever"
È necessario impostare in modo esplicito l'attributo utilizzando =
invece di mutare la stringa restituita per l'attributo. Questo, ad esempio, non cambierà il DOM:
anchor['class'] ||= ""
anchor['class'] << " whatever"
Anche se si traduce in più lavoro svolto, probabilmente sarei fare questo in questo modo:
class Nokogiri::XML::Node
def add_css_class(*classes)
existing = (self['class'] || "").split(/\s+/)
self['class'] = existing.concat(classes).uniq.join(" ")
end
end
Se non si desidera di scimmia-patch della classe, si potrebbe in alternativa:
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"
Modifica: si può vedere che questo è fondamentalmente ciò che fa Nokogiri internamente per la add_class
metodo che hai trovato cliccando sulla classe per visualizzare la fonte:
# 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 il ClassMutator! Grazie! – flunder