---
name: resource_node
lang: py
domain: core
version: "1.0.0"
algebraic: product
definition: |
  @dataclass
  class ResourceNode:
      type: NodeType
      title: str | None = None
      level: int = 0
      content: str = ""
      children: list["ResourceNode"] = field(default_factory=list)
      meta: dict[str, Any] = field(default_factory=dict)
description: "Nodo en un arbol jerarquico de documento. Preserva la estructura natural del documento (secciones, subsecciones) sin perder contenido. Resultado intermedio de parsing — los parsers producen arboles de ResourceNode."
tags: [parsing, document, tree, node, hierarchy, markdown, core]
uses_types: [node_type_py_core]
file_path: "python/types/core/resource_node.py"
---

## Metodos

- `add_child(child: ResourceNode) -> None` — agrega un nodo hijo a la lista de children.
- `get_text(include_children: bool = True) -> str` — contenido concatenado del nodo y sus descendientes de forma recursiva.
- `get_abstract(max_length: int = 256) -> str` — resumen corto: el titulo o los primeros N caracteres del contenido.
- `get_overview(max_length: int = 4000) -> str` — overview con el contenido del nodo y lista de titulos de las secciones hijas.
- `to_dict() -> dict` — serializacion recursiva a diccionario (JSON-compatible).
- `from_dict(data: dict) -> ResourceNode` — deserializacion desde diccionario (classmethod).

## Ejemplo

```python
from node_type import NodeType
from resource_node import ResourceNode

root = ResourceNode(type=NodeType.ROOT, title="Mi Documento", level=0)

section = ResourceNode(
    type=NodeType.SECTION,
    title="Introduccion",
    level=1,
    content="Este documento describe...",
)
root.add_child(section)

subsection = ResourceNode(
    type=NodeType.SECTION,
    title="Contexto",
    level=2,
    content="El contexto es el siguiente...",
)
section.add_child(subsection)

print(root.get_abstract())      # "Mi Documento"
print(section.get_text())       # "Este documento describe...\n\nEl contexto es el siguiente..."
print(section.get_text(include_children=False))  # "Este documento describe..."

data = root.to_dict()
restored = ResourceNode.from_dict(data)
```

## Notas

El campo `content` almacena el markdown del nodo directamente — no se parsea internamente. Cada nodo representa una seccion del documento delimitada por su heading y el siguiente heading del mismo nivel. Los parsers construyen el arbol llamando `add_child` en orden de aparicion en el documento. El metodo `from_dict` es el inverso exacto de `to_dict` y permite round-trip sin perdida de informacion.
