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
@nodes[t].to_s}.join.to_sif typeOf == :deleted raise "Deleted" end return tagRange.select{|x| @nodes[x].class.name == 'HTMLText'}.collect{|t| end |
No hay comentarios:
Publicar un comentario