Skip to content

Blocs de Code Délimités ​

Les blocs de code délimités sont une fonctionnalité importante de la syntaxe étendue de Markdown, offrant des capacités d'affichage de code plus puissantes que les blocs de code basiques, incluant la coloration syntaxique, la numérotation des lignes, les noms de fichiers et d'autres fonctionnalités avancées.

Blocs de Code Délimités de Base ​

Trois Accents Graves ​

Utilisez trois accents graves ``` pour créer un bloc de code :

markdown
```
function hello() {
    console.log("Hello, World!");
}
```

Rendu affiché :

function hello() {
    console.log("Hello, World!");
}

Trois Tildes ​

Vous pouvez aussi utiliser trois tildes ~~~ pour créer un bloc de code :

markdown
~~~
function hello() {
    console.log("Hello, World!");
}
~~~

Rendu affiché :

function hello() {
    console.log("Hello, World!");
}

Coloration Syntaxique ​

Spécifier le Langage de Programmation ​

Indiquez le nom du langage après le marqueur d'ouverture pour activer la coloration syntaxique :

markdown
```javascript
function fibonacci(n) {
    if (n <= 1) return n;
    return fibonacci(n - 1) + fibonacci(n - 2);
}

console.log(fibonacci(10)); // 55
```

Rendu affiché :

javascript
function fibonacci(n) {
    if (n <= 1) return n;
    return fibonacci(n - 1) + fibonacci(n - 2);
}

console.log(fibonacci(10)); // 55

Exemples de Langages Courants ​

Python ​

markdown
```python
def quicksort(arr):
    if len(arr) <= 1:
        return arr
    
    pivot = arr[len(arr) // 2]
    left = [x for x in arr if x < pivot]
    middle = [x for x in arr if x == pivot]
    right = [x for x in arr if x > pivot]
    
    return quicksort(left) + middle + quicksort(right)

# Exemple d'utilisation
numbers = [3, 6, 8, 10, 1, 2, 1]
print(quicksort(numbers))
```

Rendu affiché :

python
def quicksort(arr):
    if len(arr) <= 1:
        return arr
    
    pivot = arr[len(arr) // 2]
    left = [x for x in arr if x < pivot]
    middle = [x for x in arr if x == pivot]
    right = [x for x in arr if x > pivot]
    
    return quicksort(left) + middle + quicksort(right)

# Exemple d'utilisation
numbers = [3, 6, 8, 10, 1, 2, 1]
print(quicksort(numbers))

TypeScript ​

markdown
```typescript
interface User {
    id: number;
    name: string;
    email: string;
    isActive: boolean;
}

class UserService {
    private users: User[] = [];

    async createUser(userData: Omit<User, 'id'>): Promise<User> {
        const newUser: User = {
            id: Date.now(),
            ...userData
        };
        
        this.users.push(newUser);
        return newUser;
    }

    async getUserById(id: number): Promise<User | undefined> {
        return this.users.find(user => user.id === id);
    }
}
```

Rendu affiché :

typescript
interface User {
    id: number;
    name: string;
    email: string;
    isActive: boolean;
}

class UserService {
    private users: User[] = [];

    async createUser(userData: Omit<User, 'id'>): Promise<User> {
        const newUser: User = {
            id: Date.now(),
            ...userData
        };
        
        this.users.push(newUser);
        return newUser;
    }

    async getUserById(id: number): Promise<User | undefined> {
        return this.users.find(user => user.id === id);
    }
}

Go ​

markdown
```go
package main

import (
    "fmt"
    "net/http"
    "log"
)

type Server struct {
    port string
}

func NewServer(port string) *Server {
    return &Server{port: port}
}

func (s *Server) Start() error {
    http.HandleFunc("/", s.handleHome)
    http.HandleFunc("/api/health", s.handleHealth)
    
    fmt.Printf("Server starting on port %s\n", s.port)
    return http.ListenAndServe(":"+s.port, nil)
}

func (s *Server) handleHome(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Welcome to Go Server!")
}

func (s *Server) handleHealth(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    fmt.Fprintf(w, `{"status": "healthy"}`)
}

func main() {
    server := NewServer("8080")
    log.Fatal(server.Start())
}
```

Rendu affiché :

go
package main

import (
    "fmt"
    "net/http"
    "log"
)

type Server struct {
    port string
}

func NewServer(port string) *Server {
    return &Server{port: port}
}

func (s *Server) Start() error {
    http.HandleFunc("/", s.handleHome)
    http.HandleFunc("/api/health", s.handleHealth)
    
    fmt.Printf("Server starting on port %s\n", s.port)
    return http.ListenAndServe(":"+s.port, nil)
}

func (s *Server) handleHome(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Welcome to Go Server!")
}

func (s *Server) handleHealth(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    fmt.Fprintf(w, `{"status": "healthy"}`)
}

func main() {
    server := NewServer("8080")
    log.Fatal(server.Start())
}

Fonctionnalités Avancées ​

Mise en évidence des Lignes ​

Certains processeurs Markdown supportent la mise en évidence de lignes spécifiques :

markdown
```javascript {2,4-6}
function calculateTotal(items) {
    let total = 0; // This line is highlighted
    
    for (const item of items) { // These lines are highlighted
        total += item.price * item.quantity;
    } // Highlight ends
    
    return total;
}
```

Afficher les Numéros de Ligne ​

Affichez les numéros de ligne :

markdown
```python:line-numbers
def binary_search(arr, target):
    left, right = 0, len(arr) - 1
    
    while left <= right:
        mid = (left + right) // 2
        if arr[mid] == target:
            return mid
        elif arr[mid] < target:
            left = mid + 1
        else:
            right = mid - 1
    
    return -1
```

Rendu affiché :

python
def binary_search(arr, target):
    left, right = 0, len(arr) - 1
    
    while left <= right:
        mid = (left + right) // 2
        if arr[mid] == target:
            return mid
        elif arr[mid] < target:
            left = mid + 1
        else:
            right = mid - 1
    
    return -1

Nom du Fichier Titre ​

Affichez le nom du fichier :

markdown
```typescript title="userService.ts"
export class UserService {
    private apiUrl = '/api/users';

    async getUsers(): Promise<User[]> {
        const response = await fetch(this.apiUrl);
        return response.json();
    }

    async createUser(user: CreateUserDto): Promise<User> {
        const response = await fetch(this.apiUrl, {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify(user)
        });
        return response.json();
    }
}
```

Rendu affiché :

typescript
export class UserService {
    private apiUrl = '/api/users';

    async getUsers(): Promise<User[]> {
        const response = await fetch(this.apiUrl);
        return response.json();
    }

    async createUser(user: CreateUserDto): Promise<User> {
        const response = await fetch(this.apiUrl, {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify(user)
        });
        return response.json();
    }
}

Affichage Différent du Code ​

Affichez les changements de code :

markdown
```diff
function calculateTax(amount) {
-   return amount * 0.05; // Old tax rate
+   return amount * 0.08; // New tax rate
}

+ // New function
+ function calculateDiscount(amount, percentage) {
+     return amount * (percentage / 100);
+ }
```

Rendu affiché :

diff
function calculateTax(amount) {
-   return amount * 0.05; // Old tax rate
+   return amount * 0.08; // New tax rate
}

+ // New function
+ function calculateDiscount(amount, percentage) {
+     return amount * (percentage / 100);
+ }

Exemples de Fichiers de Configuration ​

Configuration JSON ​

markdown
```json
{
  "name": "my-app",
  "version": "1.0.0",
  "scripts": {
    "start": "node server.js",
    "dev": "nodemon server.js",
    "build": "webpack --mode production",
    "test": "jest"
  },
  "dependencies": {
    "express": "^4.18.2",
    "mongoose": "^7.0.3",
    "jsonwebtoken": "^9.0.0"
  },
  "devDependencies": {
    "nodemon": "^2.0.22",
    "jest": "^29.5.0",
    "webpack": "^5.82.0"
  }
}
```

Rendu affiché :

json
{
  "name": "my-app",
  "version": "1.0.0",
  "scripts": {
    "start": "node server.js",
    "dev": "nodemon server.js",
    "build": "webpack --mode production",
    "test": "jest"
  },
  "dependencies": {
    "express": "^4.18.2",
    "mongoose": "^7.0.3",
    "jsonwebtoken": "^9.0.0"
  },
  "devDependencies": {
    "nodemon": "^2.0.22",
    "jest": "^29.5.0",
    "webpack": "^5.82.0"
  }
}

Configuration YAML ​

markdown
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
  labels:
    app: web-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web-app
  template:
    metadata:
      labels:
        app: web-app
    spec:
      containers:
      - name: web
        image: nginx:1.21
        ports:
        - containerPort: 80
        env:
        - name: NODE_ENV
          value: production
        resources:
          requests:
            memory: "64Mi"
            cpu: "250m"
          limits:
            memory: "128Mi"
            cpu: "500m"
```

Rendu affiché :

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
  labels:
    app: web-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web-app
  template:
    metadata:
      labels:
        app: web-app
    spec:
      containers:
      - name: web
        image: nginx:1.21
        ports:
        - containerPort: 80
        env:
        - name: NODE_ENV
          value: production
        resources:
          requests:
            memory: "64Mi"
            cpu: "250m"
          limits:
            memory: "128Mi"
            cpu: "500m"

Requête SQL ​

markdown
```sql
-- Create users table
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    username VARCHAR(50) UNIQUE NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    password_hash VARCHAR(255) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- Create indexes
CREATE INDEX idx_users_email ON users(email);
CREATE INDEX idx_users_username ON users(username);

-- Query active users
SELECT 
    u.id,
    u.username,
    u.email,
    COUNT(p.id) as post_count
FROM users u
LEFT JOIN posts p ON u.id = p.user_id
WHERE u.created_at >= NOW() - INTERVAL '30 days'
GROUP BY u.id, u.username, u.email
HAVING COUNT(p.id) > 0
ORDER BY post_count DESC
LIMIT 10;
```

Rendu affiché :

sql
-- Create users table
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    username VARCHAR(50) UNIQUE NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    password_hash VARCHAR(255) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- Create indexes
CREATE INDEX idx_users_email ON users(email);
CREATE INDEX idx_users_username ON users(username);

-- Query active users
SELECT 
    u.id,
    u.username,
    u.email,
    COUNT(p.id) as post_count
FROM users u
LEFT JOIN posts p ON u.id = p.user_id
WHERE u.created_at >= NOW() - INTERVAL '30 days'
GROUP BY u.id, u.username, u.email
HAVING COUNT(p.id) > 0
ORDER BY post_count DESC
LIMIT 10;

Scripts et Commandes Shell ​

Script Bash ​

markdown
```bash
#!/bin/bash

# Deployment script
set -e

APP_NAME="my-app"
DEPLOY_DIR="/var/www/${APP_NAME}"
BACKUP_DIR="/var/backups/${APP_NAME}"
CURRENT_DATE=$(date +%Y%m%d_%H%M%S)

echo "Starting deployment of ${APP_NAME}..."

# Create backup
if [ -d "$DEPLOY_DIR" ]; then
    echo "Creating backup at ${BACKUP_DIR}/${CURRENT_DATE}"
    mkdir -p "$BACKUP_DIR"
    cp -r "$DEPLOY_DIR" "${BACKUP_DIR}/${CURRENT_DATE}"
fi

# Stop service
echo "Stopping service..."
sudo systemctl stop $APP_NAME || true

# Deploy new version
echo "Deploying new version..."
rm -rf "$DEPLOY_DIR"
mkdir -p "$DEPLOY_DIR"
tar -xzf "${APP_NAME}.tar.gz" -C "$DEPLOY_DIR"

# Install dependencies
echo "Installing dependencies..."
cd "$DEPLOY_DIR"
npm ci --production

# Start service
echo "Starting service..."
sudo systemctl start $APP_NAME
sudo systemctl enable $APP_NAME

echo "Deployment complete!"
```

Rendu affiché :

bash
#!/bin/bash

# Deployment script
set -e

APP_NAME="my-app"
DEPLOY_DIR="/var/www/${APP_NAME}"
BACKUP_DIR="/var/backups/${APP_NAME}"
CURRENT_DATE=$(date +%Y%m%d_%H%M%S)

echo "Starting deployment of ${APP_NAME}..."

# Create backup
if [ -d "$DEPLOY_DIR" ]; then
    echo "Creating backup at ${BACKUP_DIR}/${CURRENT_DATE}"
    mkdir -p "$BACKUP_DIR"
    cp -r "$DEPLOY_DIR" "${BACKUP_DIR}/${CURRENT_DATE}"
fi

# Stop service
echo "Stopping service..."
sudo systemctl stop $APP_NAME || true

# Deploy new version
echo "Deploying new version..."
rm -rf "$DEPLOY_DIR"
mkdir -p "$DEPLOY_DIR"
tar -xzf "${APP_NAME}.tar.gz" -C "$DEPLOY_DIR"

# Install dependencies
echo "Installing dependencies..."
cd "$DEPLOY_DIR"
npm ci --production

# Start service
echo "Starting service..."
sudo systemctl start $APP_NAME
sudo systemctl enable $APP_NAME

echo "Deployment complete!"

Erreurs et Solutions Communes ​

1. Nombre Incohérent de Backticks ​

markdown
❌ Erreur :
```javascript
function hello() {
    console.log("Hello");
}
``  ← Seulement deux backticks

✅ Correct :
```javascript
function hello() {
    console.log("Hello");
}
```  ← Trois backticks

2. Identificateur de Langage Incorrect ​

markdown
❌ Erreur :
```js  ← Certains processeurs ne reconnaissent pas
function hello() {}
```

✅ Recommandé :
```javascript  ← Utilisez le nom complet
function hello() {}
```

3. Blocs de Code imbriqués ​

markdown
❌ Problème : Ne peut pas afficher le code contenant ```

✅ Solution : Utilisez quatre backticks pour envelopper trois backticks
````markdown
```javascript
console.log("hello");
```

### 4. Gestion des Caractères Spéciaux

````markdown
```markdown
<!-- Afficher la syntaxe Markdown dans un bloc de code Markdown -->
\```javascript  ← Échapper les backticks
code ici
\```
```

Langages Supportés ​

Langages de Programmation ​

LangageIdentificateurAlias
JavaScriptjavascriptjs
TypeScripttypescriptts
Pythonpythonpy
Javajava
C++cppc++, cxx
C#csharpcs
Gogogolang
Rustrustrs
PHPphp
Rubyrubyrb
Swiftswift
Kotlinkotlinkt

Langages de Marquage et de Configuration ​

LangageIdentificateurUsage
HTMLhtmlMarquage Web
CSScssFeuille de style
XMLxmlÉchange de données
JSONjsonFormat de données
YAMLyaml, ymlFichier de configuration
TOMLtomlFichier de configuration
Markdownmarkdown, mdDocumentation

Langages de Données et de Requête ​

LangageIdentificateurUsage
SQLsqlRequête de base de données
GraphQLgraphqlRequête API
RrCalcul statistique
MATLABmatlabCalcul numérique

Scripts et Shell ​

LangageIdentificateurUsage
Bashbash, shShell Unix
PowerShellpowershell, ps1Shell Windows
Batchbatch, batBatch Windows
DockerfiledockerfileConfiguration de conteneur

Meilleures Pratiques ​

1. Choisir l'Identificateur de Langage Approprié ​

markdown
✅ Recommandé : Utilisez l'identificateur de langage précis
```typescript
interface User {
    id: number;
    name: string;
}
```

❌ Non recommandé : Utilisez l'identificateur incorrect
```javascript  ← Ce code est en TypeScript
interface User {
    id: number;
    name: string;
}
```

2. Ajouter des Commentaires Pertinents ​

markdown
✅ Recommandé : Incluez des commentaires explicatifs
```python
def fibonacci(n):
    """Calculer le n-ième nombre de Fibonacci"""
    if n <= 1:
        return n
    return fibonacci(n-1) + fibonacci(n-2)
```

❌ Non recommandé : Code sans explication
```python
def fib(n):
    if n <= 1:
        return n
    return fib(n-1) + fib(n-2)
```

3. Garder le Code Concis ​

markdown
✅ Recommandé : Montrer la logique essentielle
```javascript
// Middleware d'authentification utilisateur
function authenticate(req, res, next) {
    const token = req.headers.authorization;
    if (!token) {
        return res.status(401).json({ error: 'Aucun token fourni' });
    }
    // Logique de vérification...
    next();
}
```

❌ Non recommandé : Trop de code non pertinent
```javascript
// Omis beaucoup de code non lié...
```

4. Utiliser les Noms de Fichiers Titres ​

markdown
✅ Recommandé : Afficher le nom du fichier
```javascript title="middleware/auth.js"
export function authenticate(req, res, next) {
    // Logique d'authentification
}
```

✅ Recommandé : Afficher le nom du fichier de configuration
```json title="package.json"
{
  "name": "my-app",
  "version": "1.0.0"
}
```

Scénarios d'Application Pratique ​

1. Documentation API ​

markdown
## API de Connexion Utilisateur

**Exemple de Requête :**

```bash
curl -X POST https://api.example.com/auth/login \
  -H "Content-Type: application/json" \
  -d '{
    "email": "user@example.com",
    "password": "password123"
  }'
```

**Exemple de Réponse :**

```json
{
  "success": true,
  "data": {
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
    "user": {
      "id": 1,
      "email": "user@example.com",
      "name": "Zhang San"
    }
  }
}
```

**Exemple de Réponse d'Erreur :**

```json
{
  "success": false,
  "error": {
    "code": "INVALID_CREDENTIALS",
    "message": "Email ou mot de passe invalide"
  }
}
```

2. Guide d'Installation ​

markdown
## Configuration de l'Environnement

### 1. Installation de Node.js

**macOS (via Homebrew) :**

```bash
# Installer Homebrew (si non déjà installé)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# Installer Node.js
brew install node

# Vérifier l'installation
node --version
npm --version
```

**Ubuntu/Debian :**

```bash
# Mettre à jour la liste des paquets
sudo apt update

# Installer Node.js et npm
sudo apt install nodejs npm

# Vérifier l'installation
node --version
npm --version
```

**Windows (via Chocolatey) :**

```powershell
# Installer Chocolatey (exécuter en tant qu'administrateur)
Set-ExecutionPolicy Bypass -Scope Process -Force; 
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; 
iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))

# Installer Node.js
choco install nodejs

# Vérifier l'installation
node --version
npm --version
```

3. Comparaison de Code ​

markdown
## Avant et Après la Refactorisation

**Avant (Callback Hell) :**

```javascript
function getUserData(userId, callback) {
    getUser(userId, function(err, user) {
        if (err) {
            callback(err);
            return;
        }
        
        getPosts(user.id, function(err, posts) {
            if (err) {
                callback(err);
                return;
            }
            
            getComments(posts[0].id, function(err, comments) {
                if (err) {
                    callback(err);
                    return;
                }
                
                callback(null, { user, posts, comments });
            });
        });
    });
}
```

**Après (async/await) :**

```javascript
async function getUserData(userId) {
    try {
        const user = await getUser(userId);
        const posts = await getPosts(user.id);
        const comments = await getComments(posts[0].id);
        
        return { user, posts, comments };
    } catch (error) {
        throw error;
    }
}
```

Sortie HTML ​

Les blocs de code délimités sont convertis en HTML :

markdown
```javascript
function hello() {
    console.log("Hello");
}
```

Converti en :

html
<pre><code class="language-javascript">
function hello() {
    console.log("Hello");
}
</code></pre>

Syntaxes Relatives ​

Pratique ​

Essayez de créer les blocs de code suivants :

  1. Une collection d'exemples de code dans plusieurs langages de programmation
  2. Une documentation complète d'utilisation d'API (y compris les requêtes et les réponses)
  3. Une documentation de script de déploiement
  4. Un script SQL pour la conception de base de données

Outils et Plugins ​

Bibliothèques de Coloration Syntaxique ​

  • Prism.js : Coloration syntaxique légère
  • highlight.js : Bibliothèque de coloration riche
  • CodeMirror : Éditeur de code en ligne
  • Monaco Editor : Noyau de l'éditeur VS Code

Processors Markdown ​

  • markdown-it : Parser Markdown extensible
  • remark : Traitement Markdown unifié
  • marked : Parser Markdown rapide
  • gray-matter : Parser Front Matter

Plugins d'Éditeur ​

  • VS Code : Aperçu Markdown Amélioré
  • Sublime Text : MarkdownEditing
  • Atom : markdown-preview-plus
  • Vim : vim-markdown

Build by www.markdownlang.com