10.lines do: Limpiando comentarios HTML

25.02.2009 0

Otra nueva sección. Esta dedicada a esos pequeños truquillos que vas aplicando con el tiempo en tus proyectos, que no llegan a tener la entidad suficiente como para ser algo liberable en forma de proyecto, pero que seguro que a alguien más le puede resultar igual de útil que te resultó a ti en su momento.

La mayoría de la gente que se ha enfrentado a los “editores WYSIWYG” incrustados en una web se ha encontrado ante el caso en que los editores que lo han utilizado han copiado texto directamente desde Word y similares. Estos programas, en especial los de Microsoft, tienen la manía de insertar junto con el código que copias una ristra de comentarios HTML con definiciones de estilo, que al ser tratados por las diferentes funciones tanto del editor visual como del gestor de contenidos generan un alto riesgo de que el HTML resultante no valide o no cierre como es debido.

La solución que llevo aplicando durante un tiempo en mis proyectos consta de dos partes. La primera es extender la clase String para dotarla de un método que elimine los comentarios HTML

class String
  def strip_html_comments!
    self.gsub!(/\<![ \r\n\t]*(--([^\-]|[\r\n]|-[^\-])*--[ \r\n\t]*)\>/, '')
  end
end

Podéis comprobar desde irb que funciona:

>> "<!-- foo -->bar<!-- baz -->".strip_html_comments!
=> "bar"

La segunda parte es incorporar en nuestro modelo un método al que llamar antes de que se produzca el guardado de nuestro registro (ya sea en la creación o en la actualización) que aplique el filtro que acabamos de definir sobre los campos que nos interesen. Por ejemplo:

class Article < ActiveRecord::Base
  before_save :filter_bad_html

  private
    def filter_bad_html
      [excerpt, content].each(&:strip_html_comments!)
    end
end

En este caso estaría filtrando los campos excerpt y content del modelo Article.

Hay gente que suele hacer este filtrado en el controlador en vez de en el modelo. Personalmente prefiero el tan repetido “Fat model, skinny controller” que más de uno habréis oído. Los filtros before_* y after_* que incorpora ActiveRecord son unas herramientas bastante potentes que nos pueden ayudar a hacer una aplicación mucho más legible, más sencilla y más mantenible.

Aunque el código que hemos visto sea Ruby y utilice cosas de Rails, es bastante sencillo extrapolarlo a otros lenguajes como PHP (por ejemplo usando preg_replace).

Espero que esto os resulte de utilidad :)

Sin comentarios

Envía tu comentario