- if (is_group_open_item (item))
- {
- const struct group_open_item *group_open_item
- = to_group_open_item (item);
- if (e->n_groups >= e->allocated_groups)
- e->groups = x2nrealloc (e->groups, &e->allocated_groups,
- sizeof *e->groups);
- e->groups[e->n_groups] = (group_open_item->command_name
- ? xstrdup (group_open_item->command_name)
- : NULL);
- e->n_groups++;
- }
- else if (is_group_close_item (item))
- {
- assert (e->n_groups > 0);
-
- size_t idx = --e->n_groups;
- free (e->groups[idx]);
- if (idx >= 1 && idx <= 4)
- {
- char *key = xasprintf ("Head%zu", idx);
- free (string_map_find_and_delete (&e->heading_vars, key));
- free (key);
- }
- }
- else if (is_text_item (item))
- {
- const struct text_item *text_item = to_text_item (item);
- enum text_item_type type = text_item_get_type (text_item);
- const char *text = text_item_get_text (text_item);
- if (type == TEXT_ITEM_TITLE
- && e->n_groups >= 1 && e->n_groups <= 4)
- {
- char *key = xasprintf ("Head%zu", e->n_groups);
- string_map_replace (&e->heading_vars, key, text);
- free (key);
- }
- else if (type == TEXT_ITEM_PAGE_TITLE)
- string_map_replace (&e->heading_vars, "PageTitle", text);
- }