# Markdown — Syntaxe de Base

> Sources : [Markdown Guide — Basic Syntax](https://www.markdownguide.org/basic-syntax/), [Daring Fireball — Syntax](https://daringfireball.net/projects/markdown/syntax), [CommonMark Spec](https://spec.commonmark.org/)

---

## 1. Titres (Headings)

### Style ATX (recommandé)

```markdown
# Titre H1
## Titre H2
### Titre H3
#### Titre H4
##### Titre H5
###### Titre H6
```

- De 1 à 6 niveaux avec des `#`
- Un espace **obligatoire** entre `#` et le texte (sauf titre vide)
- Les `#` de fermeture sont optionnels : `## Titre ##` est valide
- Indentation maximale : 3 espaces (4 espaces = bloc de code)

### Style Setext (H1 et H2 seulement)

```markdown
Titre H1
========

Titre H2
--------
```

- `=` pour H1, `-` pour H2 ; n'importe quelle longueur
- Moins portable, mais supporté partout
- Le trait de soulignement prend la précédence sur le tiret de liste

---

## 2. Paragraphes

```markdown
Premier paragraphe.

Deuxième paragraphe.
```

- Les paragraphes sont séparés par **une ligne vide**
- Ne pas indenter la première ligne (risque de déclenchement de bloc de code)

---

## 3. Sauts de ligne (Line Breaks)

```markdown
Première ligne.  
Deuxième ligne (saut forcé).

Première ligne.\
Deuxième ligne (saut forcé, syntaxe alternative).
```

| Méthode | Syntaxe |
|---------|---------|
| Hard line break | 2 espaces en fin de ligne + Entrée |
| Hard line break (alt) | `\` en fin de ligne + Entrée |
| Soft line break | Simple retour à la ligne (rendu en espace ou saut selon le moteur) |

---

## 4. Emphase (Emphasis)

```markdown
*italique* ou _italique_
**gras** ou __gras__
***gras italique*** ou ___gras italique___
```

| Syntaxe | Résultat HTML | Affichage |
|---------|--------------|-----------|
| `*texte*` | `<em>texte</em>` | *texte* |
| `_texte_` | `<em>texte</em>` | *texte* |
| `**texte**` | `<strong>texte</strong>` | **texte** |
| `__texte__` | `<strong>texte</strong>` | **texte** |
| `***texte***` | `<em><strong>texte</strong></em>` | ***texte*** |

**Règles importantes :**
- `*` fonctionne aussi **intra-mot** : `un*mot*accentué`
- `_` ne fonctionne **pas** intra-mot (pour éviter les soulignés non voulus dans `snake_case`)
- L'ouverture doit être **left-flanking** (pas d'espace après `*`)
- La fermeture doit être **right-flanking** (pas d'espace avant `*`)

---

## 5. Citations (Blockquotes)

```markdown
> Ceci est une citation.
>
> Elle peut contenir plusieurs paragraphes.
>
> > Citation imbriquée.
```

- Le `>` peut être omis sur les lignes de continuation (lazy mode)
- Les blockquotes peuvent contenir d'autres éléments Markdown
- Les blockquotes imbriquées s'obtiennent avec `>>`

---

## 6. Listes

### Liste non ordonnée

```markdown
- Item A
- Item B
  - Sous-item B1
  - Sous-item B2
- Item C

* Alternative avec astérisque
+ Alternative avec plus
```

- Marqueurs : `-`, `*`, `+` (ne pas les mélanger dans la même liste)
- Sous-listes : indenté de 2 à 4 espaces (selon l'implémentation)
- Changer de marqueur démarre une **nouvelle** liste

### Liste ordonnée

```markdown
1. Premier
2. Deuxième
3. Troisième
```

- Le numéro de départ compte (ex. `5.` démarrera à 5 en HTML)
- Les numéros suivants n'ont pas besoin d'être consécutifs
- Terminateur : `.` ou `)` (ex. `1)` — mais `)` n'est pas supporté partout)
- Maximum 9 chiffres (dépassement = débordement entier dans certains navigateurs)

### Listes et blocs imbriqués

```markdown
- Item avec plusieurs paragraphes

  Deuxième paragraphe du même item (indenté de 2 espaces).

- Item avec bloc de code :

      code indenté de 4 espaces par rapport au texte de l'item
```

**Listes serrées vs lâches :**
- **Tight** (serrée) : pas de ligne vide entre les items → pas de `<p>`
- **Loose** (lâche) : ligne vide entre au moins deux items → items enveloppés dans `<p>`

---

## 7. Code

### Code inline

```markdown
Utilisez la fonction `printf()` pour afficher du texte.
```

- Délimiteurs : backtick `` ` `` (un ou plusieurs)
- Si le code contient un backtick, utilisez des doubles backticks : ``` `` `code` `` ```
- Les espaces en début/fin sont supprimés si présents des deux côtés

### Bloc de code indenté

```markdown
    code indenté de 4 espaces
    ou une tabulation
```

- **Ne peut pas interrompre un paragraphe** (ligne vide requise avant)
- Le contenu est traité littéralement (pas d'interprétation Markdown)

---

## 8. Règles horizontales (Thematic Breaks)

```markdown
---
***
___
```

- Minimum 3 caractères identiques (`-`, `*`, ou `_`)
- Espaces entre les caractères autorisés : `- - -` est valide
- Si une ligne de tirets peut être interprétée comme soulignement de titre setext, **le titre prend la précédence**

---

## 9. Liens

### Lien inline

```markdown
[texte affiché](https://exemple.com)
[texte affiché](https://exemple.com "Titre au survol")
[texte affiché](/chemin/relatif)
```

### Lien par référence

```markdown
[texte affiché][référence]

[référence]: https://exemple.com "Titre optionnel"
```

- La définition de référence peut être n'importe où dans le document
- La comparaison des labels est **insensible à la casse**
- Les espaces intérieurs consécutifs sont traités comme un seul espace

### Lien raccourci

```markdown
[référence]

[référence]: https://exemple.com
```

### Lien automatique (Autolink)

```markdown
<https://exemple.com>
<utilisateur@exemple.com>
```

---

## 10. Images

```markdown
![texte alternatif](image.png)
![texte alternatif](image.png "Titre au survol")
![texte alternatif][ref]

[ref]: image.png "Titre"
```

- Même syntaxe que les liens, mais préfixé par `!`
- Le texte alternatif est utilisé pour l'accessibilité et comme attribut `alt` en HTML

---

## 11. HTML inline

Markdown accepte du HTML directement dans le texte :

```markdown
Texte normal avec du <strong>HTML</strong> inline.

<div>
  Bloc HTML complet
</div>
```

**Règles :**
- Le HTML inline dans un paragraphe est passé tel quel
- Les blocs HTML (éléments de niveau bloc : `<div>`, `<table>`, `<pre>`, etc.) doivent être séparés par des lignes vides
- **Le Markdown n'est pas interprété à l'intérieur des blocs HTML** (à l'exception de certains dialectes)

---

## 12. Échappement (Escaping)

```markdown
\*pas d'emphase\*
\# pas un titre
\[pas un lien\]
\`pas du code\`
```

Caractères pouvant être échappés avec `\` :

```
\ ` * _ { } [ ] ( ) # + - . ! |
```

---

## 13. Entités HTML

```markdown
&amp;   →  &
&lt;    →  <
&gt;    →  >
&copy;  →  ©
&#42;   →  *  (référence numérique décimale)
&#x2A;  →  *  (référence numérique hexadécimale)
```

**Important :** Les entités HTML ne peuvent pas remplacer les marqueurs de structure Markdown (ex. `&#42;` ne peut pas servir de délimiteur d'emphase).
