# Segments de texte et paragraphes

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

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

- Requested language: `fr-FR`

- Content language: `fr-FR`

- Documentation version: `1.2.0`

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

---

## Modèle fondé sur des index

Univer Docs ne stocke pas le texte enrichi sous forme d’arborescence imbriquée. Il stocke le texte brut dans `body.dataStream`[^utf16-offsets], puis utilise des plages d’index pour associer le style et la structure au texte.

Les structures fondées sur des index les plus courantes sont les suivantes :

* `ITextRun` : plage de style de texte en ligne.
* `IParagraph` : métadonnées et style du paragraphe.
* `ISectionBreak` : métadonnées du saut de section.

## ITextRun

`ITextRun` décrit le style d’une plage de texte continue.

| Propriété | Type         | Description                       |
| --------- | ------------ | --------------------------------- |
| st        | `number`     | **Index de début, inclus.**       |
| ed        | `number`     | **Index de fin, exclu.**          |
| sId?      | `string`     | ID du style référencé.            |
| ts?       | `ITextStyle` | Objet de style de texte en ligne. |

```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' } },
    },
  ],
}
```

Dans cet exemple, `Hello` est en gras et `Univer` en bleu. Le saut de paragraphe `\r\n` n’est pas inclus dans les plages mises en forme.

## IParagraph

`IParagraph` décrit les métadonnées au niveau du paragraphe. `startIndex` indique la position du saut de paragraphe dans `dataStream`.

| Propriété       | Type              | Description                                                                            |
| --------------- | ----------------- | -------------------------------------------------------------------------------------- |
| startIndex      | `number`          | Index du saut de paragraphe.                                                           |
| paragraphId     | `string`          | ID stable du paragraphe.                                                               |
| paragraphStyle? | `IParagraphStyle` | Style du paragraphe, comme l’alignement, le retrait, l’interligne et le type de titre. |
| bullet?         | `IBullet`         | Métadonnées du marqueur de liste.                                                      |

```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` utilise également un index pour associer les paramètres d’une section au flux de texte. Il permet de redéfinir, pour une section donnée, le format de page, les marges, les en-têtes, les pieds de page, les colonnes et le sens du texte.

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

## Remarques

* Veillez à ce que les index correspondent à `dataStream`. Des index incorrects peuvent rendre incohérents les plages de style, les paragraphes, les sélections ou le rendu.
* Privilégiez les API Facade et les commandes pour modifier un document actif.
* Lorsque vous générez manuellement des instantanés, construisez d’abord `dataStream`, puis calculez les plages et les positions des paragraphes à partir de cette chaîne.

[^utf16-offsets]: Les positions comptent les unités UTF-16 de JavaScript, pas les caractères visibles : `"😀".length` vaut 2. Une plage de texte `[st, ed)` exclut sa fin, contrairement aux plages de cellules dont les indices de fin sont inclusifs.
