Skip to content

2. Les exemples de ce document

Je voudrais faire un article court. Les interactions entre une IA et un utilisateur sont présentés dans l’article [Générer un script Python avec des outils d’IA] que j’appellerais désormais [ref1]. Les interactions avec Gemini et ChatGPT ne seront présentées qu’à la marge. De toute façon il était impossible de présenter toutes les itérations.

Je vais présenter maintenant des exemples des particularités de mes documents ODT / DOCX que le convertisseur Gemini / ChatGPT gère correctement. C’est ce propre document que nous proposerons à la conversion HTML au script de Gemini / ChatGPT. Nous verrons ce qu’il en fait.

2.1. Les listes

Le convertisseur Gemini / ChatGPT sait gérer les listes à puces et les listes numérotées même si elles sont imbriquées :

2.1.1. Listes à puces

  • Élément 1 ;
  • Élément 2 :
  • Élément 3 ;
    • Élément 3.1 ;
      • Elément 3.1.1
      • Elément 3.1.2
        • Elément 3.1.2.1
        • Elément 3.1.2.2
    • Élément 3.2 ;
  • Élément 4 ;

2.1.2. Listes numérotées

  1. Élément 1 ;
  1. Élément 2 ;
    1. Elément 2.1
      1. Elément 2.1.1
        1. Elément 2.1.1.1
        2. Elément 2.1.1.2
      2. Elément 2.1.2
    2. Elément 2.2
  2. Élément 3 ;

2.1.3. Listes mixtes 1

  • Élément 1 ;
  • Élément 2 :
  • Élément 3 ;
    • Élément 3.1 ;
      1. Elément 3.1.1
      2. Elément 3.1.2
        • Elément 3.1.2.1
        • Elément 3.1.2.2
    • Élément 3.2 ;
  • Élément 4 ;

2.1.4. Listes mixtes 2

  1. Élément 1 ;
  2. Élément 2 ;
    1. Elément 2.1
      1. Elément 2.1.1
        • Elément 2.1.1.1
        • Elément 2.1.1.2
      2. Elément 2.1.2
    2. Elément 2.2
  3. Élément 3 ;

2.1.5. Listes numérotées manuellement

Par numérotation manuelle, on entend ici que c’est l’utilisateur qui fixe le numéro d’un paragraphe numéroté : [clic droit sur le paragraphe numéroté / paragraphe / paragraphe / recommencer la numérotation / démarrer avec].

Je commence une liste avec un autre numéro que 1.

  1. Élément 6
  2. élément 7

Ici je romps la liste pour dire quelque chose, mais ensuite je veux continuer la numérotation.

  1. Élément 8
  2. élément 9

Puis je commence une nouvelle liste numérotée :

  1. élément 11
  2. élément 12

2.2. Les blocs de code

Mes cours contiennent beaucoup de blocs de code. Ce sont souvent des codes enrichis (gras, couleurs des mots clés) par les IDE (Eclipse, PyCharm, WebStorm, Netbeans). Ces codes enrichis sont rendus à l’identique par le convertisseur.

Quand le code n’est pas enrichi (code venant du Bloc-Notes ou Notepad ou …), le convertisseur Gemini / ChatGPT le reconnaît (Java, C#, XML, HTML, …) à l’aide de mots clés du langage mis dans un fichier de configuration. Lorsqu’il reconnaît un langage il insère un marqueur (fence) pour MkDocs afin que celui-ci adapte la coloration syntaxique du code au langage utilisé dans le bloc de code.

2.2.1. Blocs de code enrichi (Eclipse, Visual Studio, ...)

Voici des blocs de code enrichis par différents IDE :

Java


package istia.st.spring.core;

import java.util.ArrayList;
import java.util.List;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Demo01 {

    @SuppressWarnings({ "unchecked", "resource" })
    public static void main(String[] args) {
        // récupération du contexte Spring
        ApplicationContext ctx = new ClassPathXmlApplicationContext("config-01.xml");
        // on récupère les beans
        Personne p01 = ctx.getBean("personne_01", Personne.class);
        Personne p02 = ctx.getBean("personne_02", Personne.class);
        List<Personne> club = ctx.getBean("club", new ArrayList<Personne>().getClass());
        Appartement appart01 = ctx.getBean(Appartement.class);
...

C#


using System;

namespace Chap1 {
    class Impots {
        static void Main(string[] args) {
            // tableaux de données nécessaires au calcul de l'impôt
            decimal[] limites = { 4962M, 8382M, 14753M, 23888M, 38868M, 47932M, 0M };
            decimal[] coeffR = { 0M, 0.068M, 0.191M, 0.283M, 0.374M, 0.426M, 0.481M };
            decimal[] coeffN = { 0M, 291.09M, 1322.92M, 2668.39M, 4846.98M, 6883.66M, 9505.54M };

            // on récupère le statut marital
            bool OK = false;
            string reponse = null;
            while (!OK) {
                Console.Write("Etes-vous marié(e) (O/N) ? ");
                reponse = Console.ReadLine().Trim().ToLower();
                if (reponse != "o" && reponse != "n")
                    Console.Error.WriteLine("Réponse incorrecte. Recommencez");
                else OK = true;
            }//while
            bool marie = reponse == "o";
...

Python


# ----------------------------------
def affiche(chaine):
    # affiche chaine
    print("chaine=%s" % chaine)


# ----------------------------------
def affiche_type(variable):
    # affiche le type de variable
    print("type[%s]=%s" % (variable, type(variable)))


# ----------------------------------
def f1(param):
    # ajoute 10 à param
    return param + 10


# ----------------------------------
def f2():
    # rend un tuple de 3 valeurs
    return "un", 0, 100


# -------------------------------- programme principal ------------------------------------
...

PHP


<?php

// types stricts pour les paramètres de fonctions
declare(strict_types=1);

// constantes globales
define("PLAFOND_QF_DEMI_PART", 1551);
define("PLAFOND_REVENUS_CELIBATAIRE_POUR_REDUCTION", 21037);
define("PLAFOND_REVENUS_COUPLE_POUR_REDUCTION", 42074);
define("VALEUR_REDUC_DEMI_PART", 3797);
define("PLAFOND_DECOTE_CELIBATAIRE", 1196);
define("PLAFOND_DECOTE_COUPLE", 1970);
define("PLAFOND_IMPOT_COUPLE_POUR_DECOTE", 2627);
define("PLAFOND_IMPOT_CELIBATAIRE_POUR_DECOTE", 1595);
define("ABATTEMENT_DIXPOURCENT_MAX", 12502);
define("ABATTEMENT_DIXPOURCENT_MIN", 437);

// définition des constantes locales
$DATA = "taxpayersdata.txt";
$RESULTATS = "resultats.txt";
$limites = array(9964, 27519, 73779, 156244, 0);
$coeffR = array(0, 0.14, 0.3, 0.41, 0.45);
$coeffN = array(0, 1394.96, 5798, 13913.69, 20163.45);

// lecture des données
$data = fopen($DATA, "r");
if (!$data) {
  print "Impossible d'ouvrir en lecture le fichier des données [$DATA]\n";
  exit;
}

...

ECMAScript


'use strict';
// ceci est un commentaire
// constante
const nom = "dupont";
// un affichage écran
console.log("nom : ", nom);
// un tableau avec des éléments de type différent
const tableau = ["un", "deux", 3, 4];
// son nombre d'éléments
let n = tableau.length;
// une boucle
for (let i = 0; i < n; i++) {
  console.log("tableau[", i, "] = ", tableau[i]);
}
// initialisation de 2 variables avec le contenu d'un tableau
let [chaine1, chaine2] = ["chaine1", "chaine2"];
// concaténation des 2 chaînes
const chaine3 = chaine1 + chaine2;
// affichage résultat
console.log([chaine1, chaine2, chaine3]);
...

VBScript


' calcul de l'impôt d'un contribuable
' le programme doit être appelé avec trois paramètres : marié enfants salaire
' marié : caractère O si marié, N si non marié
' enfants : nombre d'enfants
' salaire : salaire annuel sans les centimes

' déclaration obligatoire des variables
  Option Explicit
  Dim erreur
  
' on récupère les arguments en vérifiant leur validité
  Dim marie, enfants, salaire
  erreur=getArguments(marie,enfants,salaire)
  ' erreur ?
  If erreur(0)<>0 Then wscript.echo erreur(1) : wscript.quit erreur(0)

' on récupère les données nécessaires au calcul de l'impôt
  Dim limites, coeffR, coeffN
  erreur=getData(limites,coeffR,coeffN)
  ' erreur ?
  If erreur(0)<>0 Then wscript.echo erreur(1) : wscript.quit 5

  ' on affiche le résultat
  wscript.echo "impôt=" & calculerImpot(marie,enfants,salaire,limites,coeffR,coeffN)
  
  ' on quitte sans erreur
  wscript.quit 0

XML


<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <configSections>
    <sectionGroup name="spring">
      <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core" />
      <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />
    </sectionGroup>
  </configSections>

  <spring>
    <context>
      <resource uri="config://spring/objects" />
    </context>
    <objects xmlns="http://www.springframework.net">
      <object name="dao" type="Dao.DataBaseImpot, ImpotsV7-dao">
        <constructor-arg index="0" value="MySql.Data.MySqlClient"/>
        <constructor-arg index="1" value="Server=localhost;Database=bdimpots;Uid=admimpots;Pwd=mdpimpots;"/>
        <constructor-arg index="2" value="select limite, coeffr, coeffn from tranches"/>
      </object>
      <object name="metier" type="Metier.ImpotMetier, ImpotsV7-metier">
        <constructor-arg index="0" ref="dao"/>
      </object>
    </objects>
  </spring>
</configuration>

2.2.2. Blocs de code brut (plain text)

Voici des exemples de code brut :

Résultats d’exécution

On notera que le code ne commence pas avec la ligne n° 1.

C:\Data\st-2020\dev\python\cours-2020\python3-flask-2020\venv\Scripts\python.exe C:/Data/st-2020/dev/python/cours-2020/python3-flask-2020/bases/bases_01.py
nom=dupont
liste[0]=un
liste[1]=deux
liste[2]=3
liste[3]=4
[chaine1,chaine2,chaine1chaine2]
chaine=chaine1
type[4]=<class 'int'>
type[chaine1]=<class 'str'>
type[['un', 'deux', 3, 4]]=<class 'list'>
type[a changé]=<class 'str'>
res1=14s
(res1,res2,res3)=[un,0,100]
liste[0]=un
liste[1]=0
liste[2]=100
liste[0]=8
liste[1]=5
somme=13

Process finished with exit code 0

Ce cas a nécessité des dizaines d’itérations. Le convertisseur ne trouvait jamais le numéro de la première ligne de code. Finalement j’ai demandé à Gemini comment formater le bloc de code pour qu’il le reconnaisse. Voici ce qu’il m’a répondu :

Image

J’ai suivi cette démarche et ça a marché. Moi j’utilisais la méthode via l’icône de liste (Personnaliser). Donc on peut être amené à modifier certains éléments du Document ODT / DOCX pour obtenir ce qu’on veut.

Le convertisseur sait gérer les blocs de code non numérotés.

liste[0]=un
liste[1]=0
liste[2]=100
liste[0]=8
liste[1]=5
somme=13

Voici les mêmes exemples que dans le paragraphe 2.2.1 mais non enrichis. Ce sont alors les mots clés du fichier de configuration qui vont guider le convertisseur vers le bon langage.

Java

package istia.st.spring.core;

import java.util.ArrayList;
import java.util.List;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Demo01 {

@SuppressWarnings({ "unchecked", "resource" })
public static void main(String[] args) {
// récupération du contexte Spring
ApplicationContext ctx = new ClassPathXmlApplicationContext("config-01.xml");
// on récupère les beans
Personne p01 = ctx.getBean("personne_01", Personne.class);
Personne p02 = ctx.getBean("personne_02", Personne.class);
List<Personne> club = ctx.getBean("club", new ArrayList<Personne>().getClass());
Appartement appart01 = ctx.getBean(Appartement.class);
...

C#

using System;

namespace Chap1 {
    class Impots {
        static void Main(string[] args) {
            // tableaux de données nécessaires au calcul de l'impôt
            decimal[] limites = { 4962M, 8382M, 14753M, 23888M, 38868M, 47932M, 0M };
            decimal[] coeffR = { 0M, 0.068M, 0.191M, 0.283M, 0.374M, 0.426M, 0.481M };
            decimal[] coeffN = { 0M, 291.09M, 1322.92M, 2668.39M, 4846.98M, 6883.66M, 9505.54M };

            // on récupère le statut marital
            bool OK = false;
            string reponse = null;
            while (!OK) {
                Console.Write("Etes-vous marié(e) (O/N) ? ");
                reponse = Console.ReadLine().Trim().ToLower();
                if (reponse != "o" && reponse != "n")
                    Console.Error.WriteLine("Réponse incorrecte. Recommencez");
                else OK = true;
            }//while
            bool marie = reponse == "o";
...

Python

# ----------------------------------
def affiche(chaine):
    # affiche chaine
    print("chaine=%s" % chaine)


# ----------------------------------
def affiche_type(variable):
    # affiche le type de variable
    print("type[%s]=%s" % (variable, type(variable)))


# ----------------------------------
def f1(param):
    # ajoute 10 à param
    return param + 10


# ----------------------------------
def f2():
    # rend un tuple de 3 valeurs
    return "un", 0, 100


# -------------------------------- programme principal ------------------------------------
...

PHP

<?php

// types stricts pour les paramètres de fonctions
declare(strict_types=1);

// constantes globales
define("PLAFOND_QF_DEMI_PART", 1551);
define("PLAFOND_REVENUS_CELIBATAIRE_POUR_REDUCTION", 21037);
define("PLAFOND_REVENUS_COUPLE_POUR_REDUCTION", 42074);
define("VALEUR_REDUC_DEMI_PART", 3797);
define("PLAFOND_DECOTE_CELIBATAIRE", 1196);
define("PLAFOND_DECOTE_COUPLE", 1970);
define("PLAFOND_IMPOT_COUPLE_POUR_DECOTE", 2627);
define("PLAFOND_IMPOT_CELIBATAIRE_POUR_DECOTE", 1595);
define("ABATTEMENT_DIXPOURCENT_MAX", 12502);
define("ABATTEMENT_DIXPOURCENT_MIN", 437);

// définition des constantes locales
$DATA = "taxpayersdata.txt";
$RESULTATS = "resultats.txt";
$limites = array(9964, 27519, 73779, 156244, 0);
$coeffR = array(0, 0.14, 0.3, 0.41, 0.45);
$coeffN = array(0, 1394.96, 5798, 13913.69, 20163.45);

// lecture des données
$data = fopen($DATA, "r");
if (!$data) {
  print "Impossible d'ouvrir en lecture le fichier des données [$DATA]\n";
  exit;
}

...

ECMAScript

'use strict';
// ceci est un commentaire
// constante
const nom = "dupont";
// un affichage écran
console.log("nom : ", nom);
// un tableau avec des éléments de type différent
const tableau = ["un", "deux", 3, 4];
// son nombre d'éléments
let n = tableau.length;
// une boucle
for (let i = 0; i < n; i++) {
  console.log("tableau[", i, "] = ", tableau[i]);
}
// initialisation de 2 variables avec le contenu d'un tableau
let [chaine1, chaine2] = ["chaine1", "chaine2"];
// concaténation des 2 chaînes
const chaine3 = chaine1 + chaine2;
// affichage résultat
console.log([chaine1, chaine2, chaine3]);
...

VBScript

' calcul de l'impôt d'un contribuable
' le programme doit être appelé avec trois paramètres : marié enfants salaire
' marié : caractère O si marié, N si non marié
' enfants : nombre d'enfants
' salaire : salaire annuel sans les centimes

' déclaration obligatoire des variables
  Option Explicit
  Dim erreur

' on récupère les arguments en vérifiant leur validité
  Dim marie, enfants, salaire
  erreur=getArguments(marie,enfants,salaire)
  ' erreur ?
  If erreur(0)<>0 Then wscript.echo erreur(1) : wscript.quit erreur(0)

' on récupère les données nécessaires au calcul de l'impôt
  Dim limites, coeffR, coeffN
  erreur=getData(limites,coeffR,coeffN)
  ' erreur ?
  If erreur(0)<>0 Then wscript.echo erreur(1) : wscript.quit 5

  ' on affiche le résultat
  wscript.echo "impôt=" & calculerImpot(marie,enfants,salaire,limites,coeffR,coeffN)

  ' on quitte sans erreur
  wscript.quit 0

XML

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <configSections>
    <sectionGroup name="spring">
      <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core" />
      <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />
    </sectionGroup>
  </configSections>

  <spring>
    <context>
      <resource uri="config://spring/objects" />
    </context>
    <objects xmlns="http://www.springframework.net">
      <object name="dao" type="Dao.DataBaseImpot, ImpotsV7-dao">
        <constructor-arg index="0" value="MySql.Data.MySqlClient"/>
        <constructor-arg index="1" value="Server=localhost;Database=bdimpots;Uid=admimpots;Pwd=mdpimpots;"/>
        <constructor-arg index="2" value="select limite, coeffr, coeffn from tranches"/>
      </object>
      <object name="metier" type="Metier.ImpotMetier, ImpotsV7-metier">
        <constructor-arg index="0" ref="dao"/>
      </object>
    </objects>
  </spring>
</configuration>

HTML

<!DOCTYPE HTML>
<HTML>
    <head>
        <title>Laragon</title>

        <link href="<a href="view-source:https://fonts.googleapis.com/css?family=Karla:400">https://fonts.googleapis.com/css?family=Karla:400</a>" rel="stylesheet" type="text/css">

        <style>
            HTML, body {
                height: 100%;
            }

            body {
                margin: 0;
                padding: 0;
                width: 100%;
                display: table;
                font-weight: 100;
                font-family: 'Karla';
            }

            .container {
                text-align: center;
                display: table-cell;
                vertical-align: middle;
            }

            .content {
                text-align: center;
                display: inline-block;
            }

            .title {
                font-size: 96px;
            }

            .opt {
                margin-top: 30px;
            }

            .opt a {
              text-decoration: none;
              font-size: 150%;
            }

            a:hover {
              color: red;
            }
        </style>
    </head>
    <body>
        <div class="container">
            <div class="content">
                <div class="title" title="Laragon">Laragon</div>

                <div class="info"><br />
                      Apache/2.4.35 (Win64) OpenSSL/1.1.0i PHP/7.2.11<br />
                      PHP version: 7.2.11   <span><a title="phpinfo()" href="<a href="view-source:http://localhost/?q=info">/?q=info</a>">info</a></span><br />
                      Document Root: C:/myprograms/laragon-lite/www<br />

                </div>

2.3. Les liens

Le convertisseur Gemini / ChatGPT sait conserver les liens externes du Document ODT / DOCX. Par exemple Gemini 3 ou [Générer un script Python avec des outils d’IA].

Il sait gérer un lien vers un chapitre Lien vers un chapitre

Un renvoi vers un chapitre : 2.1.1.

Un renvoi vers un repère de texte qui précède : Gemini 3

Un renvoi vers un repère de texte qui suit : GitHub

2.4. L’enrichissement de texte

Le convertisseur sait gérer le gras, l’italique, le souligné et le surlignage. Il respecte la couleur du surlignage.

Un texte avec des mots en gras, en italiques, soulignés ou surlignés ou surlignés ou surlignés.

C’est vrai également pour les liens : [Générer un script Python avec des outils d’IA].

Le convertisseur gère également la couleur des caractères.


Il gère également les bordures supérieure et inférieure des paragraphes.


  1. Un texte avec des mots en gras, en italiques, soulignés ou surlignés ou surlignés ou surlignés.
  2. C’est vrai également pour les liens : [Générer un script Python avec des outils d’IA].
  3. Le convertisseur gère également la couleur des caractères.
  • Un texte avec des mots en gras, en italiques, soulignés ou surlignés ou surlignés ou surlignés.
  • C’est vrai également pour les liens : [Générer un script Python avec des outils d’IA].
  • Le convertisseur gère également la couleur des caractères.

2.5. Un titre peut être également enrichi.

2.6. Les images

Le convertisseur Gemini / ChatGPT sait gérer les images et les tableaux d’images :

Image

Dans les documents ODT il est fréquent d’avoir des dessins. Malgré des dizaines de tentatives, Gemini n’a pas réussi à générer un script qui générerait l’image (comme une copie d’écran) du dessin. Ainsi ci-dessus, l’image 5 est la copie d’écran d’un dessin d’un document ODT.

Toutes les images sont cliquables pour être agrandies. Si ci-dessus on clique sur l’image [1-3], on obtient l’agrandissement suivant :

2.7. Les caractères à protéger

Un site MkDocs1 a des pages dont le contenu n’est pas du HTML mais du MarkDown. Si le Document ODT / DOCX contient des caractères qui existent en MarkDown, ils risquent d’être interprétés par MkDocs et donc ne pas avoir le rendu attendu. Voici deux exemples :

L’astérisque * a une signification MarkDown. La ligne suivante peut être alors mal interprétée :

L'impôt I est alors égal à 0.15*R – 2072.5*nbParts.

Un autre exemple est lorsque vous voulez insérer un bloc de code MarkDown dans votre document comme celui-ci :

# Convertisseur Word/ODT vers Site HTML (MkDocs)

🔗 **[Voir le site de démonstration généré](https://stahe.github.io/word-odt-vers-html-janv-2026/)**

---

## 📝 Description

On se propose dans ce projet de mettre à disposition du lecteur un convertisseur Python de documents Word ou ODT vers un site statique HTML.

Lorsque le Document ODT / DOCX convient, le convertisseur produit un site HTML via **MkDocs** qui a l'aspect professionnel des sites produits par Pandoc.

## 🤖 Contexte de création

Ce convertisseur a été entièrement construit par l’IA **Gemini 3** (avec un abonnement pro). Il est le résultat d'itérations successives pour gérer finement la structure des documents ODT (OpenDocument Text).

## ✨ Fonctionnalités

Le script `convert.py` effectue les actions suivantes :

* **Conversion ODT vers Markdown** : Analyse le fichier `.odt` (XML) pour en extraire la structure.
* **Gestion des Titres** : Génère automatiquement la Table des Matières (TOC) et la navigation latérale.
* **Blocs de Code** : Détection automatique des langages, coloration syntaxique et **gestion précise de la numérotation des lignes** (attributs `start-value`).
* **Listes** : Support des listes à puces et numérotées avec indentation correcte.
* **Mise en forme** : Support du *gras*, *italique*, *souligné* et du *surlignage* (avec respect des couleurs d'origine).
* **Images** : Extraction et intégration automatique des images contenues dans le document.
* **Configuration** : Personnalisation via un fichier `config.py` (Bas de page, Google Analytics, etc.).

## 🚀 Installation

### Prérequis

* Python 3.x
* Les bibliothèques suivantes :

```bash
pip install odfpy unidecode mkdocs mkdocs-material

```

2.8. Les tableaux

Un tableau peut contenir différents contenus :

1

2


package istia.st.spring.core;

import java.util.ArrayList;
import java.util.List;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Demo01 {


    

3

4


# ----------------------------------
def affiche(chaine):
    # affiche chaine
    print("chaine=%s" % chaine)


# ----------------------------------
def affiche_type(variable):
    # affiche le type de variable
    print("type[%s]=%s" % (variable, type(variable)))


Un tableau contenant des liens :

Le convertisseur Gemini / ChatGPT sait conserver les

liens externes du Document ODT / DOCX. Par exemple

Gemini 3 ou

[Générer un script Python avec des outils d’IA].

Il sait gérer un lien vers un chapitre Lien vers un chapitre

Un renvoi vers un chapitre : 2.1.1.

Un renvoi vers un repère de texte qui précède : Gemini 3

Un renvoi vers un repère de texte qui suit : GitHub

Un tableau dont les cellules contiennent un autre tableau :

html:form

sert à la fois à générer la balise HTML <form> et à donner des informations au contrôleur qui aura à traiter ce formulaire :

action

url où seront envoyées les valeurs du formulaire

name

nom du formulaire HTML. C'est aussi le nom du bean qui mémorisera les valeurs de celui-ci

type

nom de la classe qui devra être instanciée pour obtenir le bean de stockage du formulaire

On remarquera que la méthode d'envoi des paramètres du formulaire (GET/POST) au contrôleur n'est pas précisée. On pourrait le faire avec l'attribut method. En l'absence de celui-ci, c'est la méthode POST qui est utilisée par défaut.

html:text

sert à générer la balise <input type="text" value="..."> :

property

nom du champ du bean du formulaire qui sera associé à la zone de saisie. A l'envoi du formulaire au serveur (client -> serveur), le champ du bean prendra la valeur du champ de saisie. A l'affichage du formulaire (serveur -> client), la valeur contenue dans le champ du bean est affichée dans la zone de saisie.

2.9. Les notes de bas de page

Le convertisseur Gemini2 / ChatGPT gère les notes de bas de page. Voici une autre note3 de bas de page.



  1. MkDocs 

  2. Google Gemini 

  3. La note de bas de page