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;
} |
Partager