sábado, 24 de agosto de 2013

Cambiando el documento

Cambiando el documento

Hasta aquí hemos consultado el documento y su contenido. Lo cual está muy bien. Pero... ¿y si quiero hacer cambios?

Vayamos por partes. Comencemos por un método que permita eliminar un nodo, junto con sus posibles nodos hijos:

def removeFromDocument
  if typeOf == :document
   raise 'Cannot remove the whole document'
  end

 
deleteTags(tagRange)
end

Mal empezamos. Este método llama a otro que dejaremos para más adelante. ¿Cuántos os debo ya? Uno, dos, tres, cuatro...

Pero si lo vamos a dejar para más adelante, lo dejamos y seguimos. Que si no nos atrancamos. Que, como bien apuntan los Monty Python, ya se sabe que hay que hablar menos y hacer más. Porque sólo diciendo no se avanza y es preciso actuar. Porque lo importante es lo que se hace y habría que dejar a un lado la palabrería para centrarnos en lo importante...

¿Por dónde íbamos? Eso... vamos a crear un método que nos permita cambiar el “innerHTML” de una etiqueta. Para ello, primero miramos si la etiqueta no cuenta con un cierre explícito y, si es necesario, lo añadimos. Después, eliminamos los nodos correspondientes al “innerHTML” antiguo. Y finalmente insertamos en su lugar lo nuevo:

def changeInnerHTML(html)
  if typeOf != :HTMLTag
   raise 'Not a tag'
  end

  # If there is no closing tag, add it
  
if @nodes[@starts_at].autoclosed
   insertTags(@starts_at + 1, [HTMLclose.new(tagName)])
   @ends_at = @starts_at + 1
   @nodes[@starts_at].autoclosed = false
  end
   

  deleteTags((@starts_at + 1)..(@ends_at - 1))
   

  insertTags(@starts_at + 1, HTMLParser.new.parseHTML(html))
end

Para las inserciones, realizamos llamadas a otro método, “insertTags”. Y sabéis qué: voy a dejar éste también para más adelante... Por ahora sólo diré que inserta, en la posición que le indiquemos como primer parámetro, el código HTML que le pasemos como segundo.

Utilizando “insertTags” podemos crear otros dos métodos que permitan insertar código HTML antes o después del objeto que estamos manipulando:

def insertBefore(html)
  insertTags(@starts_at, HTMLParser.new.parseHTML(html))
end

def insertAfter(html)
  insertTags(@ends_at + 1, HTMLParser.new.parseHTML(html))
end

No hay comentarios:

Publicar un comentario