lunes, 5 de agosto de 2013

El contenido de los nodos

El contenido de los nodos

Una vez que tengamos un documento o uno de sus elementos, quizá queramos saber qué tiene dentro. Tanto su código HTML como el texto que pudiera contener.

En cuanto al código HTML podemos distinguir entre HTML interno y externo. Si nos fijamos en la etiqueta “<div>” del siguiente ejemplo:

<div>
<a href="#asd">Prueba</a>
</div>

… su HTML interno es lo que hay dentro del <div>. Así, quitándole la cáscara a nuestra etiqueta nos queda:

<a href="#asd">Prueba</a>

… mientras que su HTML externo es todo el código fuente correspondiente a la etiqueta <div>:

<div>
<a href="#asd">Prueba</a>
</div>

Y, en lo que al texto de la etiqueta respecta, tendríamos sólo:

Prueba

Para conseguir el HTML externo definiremos el método outerHTML:

def outerHTML
  if typeOf == :deleted
   raise "Deleted"
  
end
  return nodesHTML(tagRange)
end

Primero miramos si el nodo no ha sido eliminado, porque si sí lo ha sido, no hay nada que mirar. Si todo está OK, llamamos a otro método que definiremos más adelante llamado “nodesHTML” que lista el contenido de unos cuantos de los nodos que componen el documento principal.

¿Que cuáles nodos lista? Bueno, eso lo indicamos mediante el parámetro que le pasamos, que debe ser un rango. Y, en este caso, ese rango es el resultado de “tagRange”, otro método que dejamos para más adelante y que nos proporciona el rango de nodos que componen el elemento actual.

Ya os debo dos métodos.

También vamos a crear el método “to_s” como un alias para “outerHTML”.

alias_method :to_s, :outerHTML

Del HTML interno sólo tiene sentido hablar si estamos ante una etiqueta o bien de un documento.

def innerHTML
  if typeOf == :document
   return outerHTML
  
elsif typeOf != :HTMLTag
   raise 'Not a tag'
  end

  range = tagRange
  return nodesHTML((range.first + 1) .. (range.last - 1))
end

Finalmente, para el contenido de texto de un nodo habría que seleccionar aquellos elementos de tipo “texto” que le pertenezcan y concatenar sus contenidos. Para quienes sólo tengan interés por la palabrería pura y dura, su método preferido será:


def textContent
  if typeOf == :deleted
   raise "Deleted"
  
end
  return tagRange.select{|x| @nodes[x].class.name == 'HTMLText'}.collect{|t|
       @nodes[t].to_s}.join.to_s
end

No hay comentarios:

Publicar un comentario