static VALUE rg_toggles_tag_p(VALUE self, VALUE tag) { return CBOOL2RVAL(gtk_text_iter_toggles_tag(_SELF(self), RVAL2TAG(tag))); }
guint8 * gimp_text_buffer_serialize (GtkTextBuffer *register_buffer, GtkTextBuffer *content_buffer, const GtkTextIter *start, const GtkTextIter *end, gsize *length, gpointer user_data) { GString *string; GtkTextIter iter, old_iter; GSList *tag_list; GSList *active_tags; string = g_string_new ("<markup>"); iter = *start; tag_list = NULL; active_tags = NULL; do { GSList *tmp; gchar *tmp_text, *escaped_text; active_tags = NULL; tag_list = gtk_text_iter_get_tags (&iter); /* Handle added tags */ for (tmp = tag_list; tmp; tmp = tmp->next) { GtkTextTag *tag = tmp->data; open_tag (GIMP_TEXT_BUFFER (register_buffer), string, tag); active_tags = g_slist_prepend (active_tags, tag); } g_slist_free (tag_list); old_iter = iter; /* Now try to go to either the next tag toggle, or if a pixbuf appears */ while (TRUE) { gunichar ch = gtk_text_iter_get_char (&iter); if (ch == 0xFFFC) { /* pixbuf? can't happen! */ } else if (ch == 0) { break; } else { gtk_text_iter_forward_char (&iter); } if (gtk_text_iter_toggles_tag (&iter, NULL)) break; } /* We might have moved too far */ if (gtk_text_iter_compare (&iter, end) > 0) iter = *end; /* Append the text */ tmp_text = gtk_text_iter_get_slice (&old_iter, &iter); escaped_text = g_markup_escape_text (tmp_text, -1); g_free (tmp_text); g_string_append (string, escaped_text); g_free (escaped_text); /* Close any open tags */ for (tmp = active_tags; tmp; tmp = tmp->next) close_tag (GIMP_TEXT_BUFFER (register_buffer), string, tmp->data); g_slist_free (active_tags); } while (! gtk_text_iter_equal (&iter, end)); g_string_append (string, "</markup>"); *length = string->len; return (guint8 *) g_string_free (string, FALSE); }
guint8 * gimp_text_buffer_serialize (GtkTextBuffer *register_buffer, GtkTextBuffer *content_buffer, const GtkTextIter *start, const GtkTextIter *end, gsize *length, gpointer user_data) { GString *string; GtkTextIter iter, old_iter; GSList *tag_list, *new_tag_list; GSList *active_tags; string = g_string_new ("<markup>"); iter = *start; tag_list = NULL; active_tags = NULL; do { GList *added, *removed; GList *tmp; gchar *tmp_text, *escaped_text; new_tag_list = gtk_text_iter_get_tags (&iter); find_list_delta (tag_list, new_tag_list, &added, &removed); /* Handle removed tags */ for (tmp = removed; tmp; tmp = tmp->next) { GtkTextTag *tag = tmp->data; /* Only close the tag if we didn't close it before (by using * the stack logic in the while() loop below) */ if (g_slist_find (active_tags, tag)) { /* Drop all tags that were opened after this one (which are * above this on in the stack), but move them to the added * list so they get re-opened again, *unless* they are also * closed at this iter */ while (active_tags->data != tag) { close_tag (GIMP_TEXT_BUFFER (register_buffer), string, active_tags->data); /* if it also in the list of removed tags, *don't* add * it to the list of added tags again */ if (! g_list_find (removed, active_tags->data)) added = g_list_prepend (added, active_tags->data); active_tags = g_slist_remove (active_tags, active_tags->data); } /* then, close the tag itself */ close_tag (GIMP_TEXT_BUFFER (register_buffer), string, tag); active_tags = g_slist_remove (active_tags, active_tags->data); } } /* Handle added tags */ for (tmp = added; tmp; tmp = tmp->next) { GtkTextTag *tag = tmp->data; open_tag (GIMP_TEXT_BUFFER (register_buffer), string, tag); active_tags = g_slist_prepend (active_tags, tag); } g_slist_free (tag_list); tag_list = new_tag_list; g_list_free (added); g_list_free (removed); old_iter = iter; /* Now try to go to either the next tag toggle, or if a pixbuf appears */ while (TRUE) { gunichar ch = gtk_text_iter_get_char (&iter); if (ch == 0xFFFC) { /* pixbuf? can't happen! */ } else if (ch == 0) { break; } else { gtk_text_iter_forward_char (&iter); } if (gtk_text_iter_toggles_tag (&iter, NULL)) break; } /* We might have moved too far */ if (gtk_text_iter_compare (&iter, end) > 0) iter = *end; /* Append the text */ tmp_text = gtk_text_iter_get_slice (&old_iter, &iter); escaped_text = g_markup_escape_text (tmp_text, -1); g_free (tmp_text); g_string_append (string, escaped_text); g_free (escaped_text); } while (! gtk_text_iter_equal (&iter, end)); g_slist_free (tag_list); /* Close any open tags */ for (tag_list = active_tags; tag_list; tag_list = tag_list->next) close_tag (GIMP_TEXT_BUFFER (register_buffer), string, tag_list->data); g_slist_free (active_tags); g_string_append (string, "</markup>"); *length = string->len; return (guint8 *) g_string_free (string, FALSE); }