Bonjour,

J'essais de mettre en place une numérotarion automatique de section d'un fichier XML. Le but est de calculer le prochain ID de la section du type :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
<section id="I">
  <section id="I-A">
  </section>
  | <!-- Le curseur -->
</section>
Si l'utilisateur demande une nouvelle section au niveau du curseur, la fonction section_next_id doit me retourner la chaîne "I-B".

Voici ce que j'ai fait :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
static char *section_id[4][5] =
{
  {"I", "II", "III", "IV", NULL},
  {"A", "B", "C", "D", NULL},
  {"1", "2", "3", "4", NULL},
  {NULL, NULL, NULL, NULL, NULL}
};
 
static char *section_sep = "-";
 
static gchar *section_next_id (GtkTextBuffer *p_buffer)
{
  gint niveau = 0;
  gint sous_niveau = 0;
  gchar *ret = NULL;
  gchar *section = NULL;
 
  if (p_buffer)
  {
    gint line = 0;
    GtkTextIter iter;
    GtkTextIter match_start;
    GtkTextIter match_end;
 
    /* On recupere la position du curseur */
    gtk_text_buffer_get_iter_at_mark (p_buffer, &iter, gtk_text_buffer_get_insert (p_buffer));
    /* On la sauvegarde la ligne courrante */
    line = gtk_text_iter_get_line (&iter);
    /* Recuperation du texte *" dans <section id="*"[ noNumber=1]> */
    if (gtk_text_iter_backward_search (&iter, "<section id=\"",
          GTK_TEXT_SEARCH_TEXT_ONLY, NULL, &match_start, NULL)
        && gtk_text_iter_forward_search (&match_start, "\"",
               GTK_TEXT_SEARCH_TEXT_ONLY, NULL, &match_end, NULL))
    {
      gchar **sections = NULL;
 
      section = gtk_text_buffer_get_slice (p_buffer, &match_start, &match_end, FALSE);
      /* Suppression du guillement en trop */
      section[g_strlen (section)-1] = '\0';
      sections = str_split (section, section_sep);
      if (sections)
      {
        /* Calcul du niveau de la balise precedente puisque le tableau se termine par NULL */
        while (sections[niveau])
        {
          niveau++;
        }
        {
          GtkTextIter *p_iter = NULL;
 
          /* On se place apres l'id de la section precedente */
          p_iter = gtk_text_iter_copy (&match_end);
          /* Calcul le niveau de la nouvelle balise en decomptant les balises <section> fermees */
          while (gtk_text_iter_forward_search (p_iter, "</section>",
                   GTK_TEXT_SEARCH_TEXT_ONLY, NULL, &match_end, NULL)
                 /* on recherche jusqu'a la ligne du curseur */
                 && gtk_text_iter_get_line (p_iter) <= line)
          {
            niveau--;
            /* Au cas ou l'utilisateur a ajoute une balise fermante de trop */
            if (niveau < 0)
            {
              niveau = 0;
              break;
            }
            gtk_text_iter_free (p_iter); p_iter = NULL;
            p_iter = gtk_text_iter_copy (&match_end);
          }
        }
        /* Recherche de l'id suivant dans le sous-niveau */
        while (sections[niveau]
                && section_id[niveau]
                && section_id[niveau][sous_niveau]
                && g_strcmp (sections[niveau], section_id[niveau][sous_niveau]) == 0)
        {
          sous_niveau++;
        }
        sma_free (sections);
      }
    }
  }
  /* niveau 0 = racine donc pas besoin de concatener les niveaux precedent */
  if (niveau > 0)
  {
    ret = g_strdup_printf ("%s%s%s", section, section_sep, section_id[niveau][sous_niveau]);
    sma_register (ret);
  }
  else
  {
    ret = g_strdup_printf ("%s", section_id[0][sous_niveau]);
    sma_register (ret);
  }
  return ret;
}
Ne vous occupez pas des fonctions sma_* il s'agit d'un gestionnaire de mémoire perso.

ça marche bien pour l'ajout de la section II mais ensuite il me sort toujours "I" (aussi bien à la place de "III" ou "I-A") : il semblerai que la recherche des balises fermantes ne s'arrête pas au curseur puisque j'obtiens un niveau négatif.

Si vous avec des remarques concernant l'algo/codage pour faire avancer le smilblick je suis prenneur

d'avoir tenu le coup jusqu'ici