# Ejecuciones de texto y párrafos

- Human documentation: [https://docs.univer.ai/es-ES/guides/docs/model/text-runs-and-paragraphs](https://docs.univer.ai/es-ES/guides/docs/model/text-runs-and-paragraphs)

- Agent Markdown: [https://docs.univer.ai/es-ES/guides/docs/model/text-runs-and-paragraphs.md](https://docs.univer.ai/es-ES/guides/docs/model/text-runs-and-paragraphs.md)

- Requested language: `es-ES`

- Content language: `es-ES`

- Documentation version: `1.2.0`

- Source: [docs/model/text-runs-and-paragraphs.es-ES.mdx](https://github.com/dream-num/documentation/blob/dev/content/guides/docs/model/text-runs-and-paragraphs.es-ES.mdx)

---

## Modelo basado en índices

Univer Docs no almacena texto enriquecido como un árbol anidado. Almacena texto sin formato en `body.dataStream`[^utf16-offsets] y luego utiliza rangos de índice para adjuntar estilo y estructura al texto.

Las estructuras basadas en índices más comunes son:

* `ITextRun`: rango de estilos de texto en línea.
* `IParagraph`: metadatos de párrafo y estilo de párrafo.
* `ISectionBreak`: salto de sección metadatos.

## ITextRun

`ITextRun` describe el estilo de un rango de texto continuo.

| Propiedad | Tipo         | Descripción                      |
| --------- | ------------ | -------------------------------- |
| st        | `number`     | **Índice inicial, inclusive.**   |
| ed        | `number`     | **Índice final, exclusivo.**     |
| sId?      | `string`     | ID de estilo referenciado.       |
| ts?       | `ITextStyle` | Estilo de texto en línea objeto. |

```typescript
const body: IDocumentBody = {
  dataStream: 'Hello Univer\r\n',
  textRuns: [
    {
      st: 0,
      ed: 5,
      ts: { bl: 1 },
    },
    {
      st: 6,
      ed: 12,
      ts: { cl: { rgb: '#2563eb' } },
    },
  ],
}
```

En este ejemplo, `Hello` está en negrita y `Univer` es azul. El salto de párrafo `\r\n` no está incluido en los rangos de estilo.

## IParagraph

`IParagraph` describe metadatos a nivel de párrafo. `startIndex` apunta a la posición del salto de párrafo en `dataStream`.

| Propiedad       | Tipo              | Descripción                                                                    |
| --------------- | ----------------- | ------------------------------------------------------------------------------ |
| startIndex      | `number`          | Índice del salto de párrafo.                                                   |
| paragraphId     | `string`          | ID de párrafo estable.                                                         |
| paragraphStyle? | `IParagraphStyle` | Estilo de párrafo como alineación, sangría, interlineado y tipo de encabezado. |
| bullet?         | `IBullet`         | Metadatos del marcador de lista.                                               |

```typescript
const body: IDocumentBody = {
  dataStream: 'Hello Univer\r\nSecond line\r\n',
  paragraphs: [
    {
      startIndex: 12,
      paragraphId: 'p-1',
      paragraphStyle: {
        namedStyleType: NamedStyleType.HEADING_1,
      },
    },
    {
      startIndex: 25,
      paragraphId: 'p-2',
    },
  ],
}
```

## ISectionBreak

`ISectionBreak` también usa un índice para conectar la configuración a nivel de sección al flujo de texto. Puede anular el tamaño de página, los márgenes, los encabezados, los pies de página, las columnas y la dirección del texto de una sección.

```typescript
const body: IDocumentBody = {
  dataStream: 'First section\nSecond section\r\n',
  sectionBreaks: [
    {
      startIndex: 13,
      pageSize: { width: 595, height: 842 },
      marginTop: 72,
      marginBottom: 72,
    },
  ],
}
```

## Notas

* Mantenga los índices alineados con `dataStream`. Los índices incorrectos pueden hacer que los rangos de estilo, los párrafos, las selecciones o la representación se vuelvan inconsistentes.
* Prefiera las API y los comandos de Facade para editar un documento activo.
* Cuando genere instantáneas manualmente, primero cree `dataStream` y luego calcule los rangos y las posiciones de los párrafos a partir de esa cadena.

[^utf16-offsets]: Las posiciones cuentan unidades UTF-16 de JavaScript, no caracteres visibles: `"😀".length` es 2. Un intervalo de texto `[st, ed)` excluye el final, a diferencia de los rangos de celdas que lo incluyen.
