static void test_parse_text (void) { GPtrArray *items; static const gchar *text = "line-background=\"rgba(235,202,210,.4)\"\n" "foreground=\"rgba(100%, 50%, 25%,.4)\"\n" "color: #8d9091;\n" "color: #123;\n" "background-color: hsl(65, 70%, 72%);\n" "text-shadow: 0 1px black;"; printf ("\n"); items = gstyle_color_parse (text); for (gint i = 0; i < items->len; ++i) { gchar *str; const GstyleColor *color; GstyleColorItem *item; guint start, len; item = g_ptr_array_index (items, i); color = gstyle_color_item_get_color (item); start = gstyle_color_item_get_start (item); len = gstyle_color_item_get_len (item); str = gstyle_color_to_string ((GstyleColor *)color, GSTYLE_COLOR_KIND_ORIGINAL); printf ("item(%i,%i): '%s'\n", start, len, str); g_free (str); } g_ptr_array_free (items, TRUE); }
/** * gstyle_palette_new_from_buffer: * @buffer: a #GtkTextBUffer * @begin: (nullable): a begin #GtkTextIter * @end: (nullable): a end #GtkTextIter * @cancellable: A #GCancellable * @error: (nullable): a #GError location or %NULL * * Create a new #GstylePalette from a text buffer. * if @begin is %NULL, the buffer start iter is used. * if @end is %NULL, the buffer end is used. * * Returns: A #GstylePalette or %NULL if an error occur. */ GstylePalette * gstyle_palette_new_from_buffer (GtkTextBuffer *buffer, GtkTextIter *begin, GtkTextIter *end, GCancellable *cancellable, GError **error) { g_autofree gchar *text = NULL; GstylePalette *palette = NULL; g_autofree gchar *name = NULL; GtkTextIter real_begin, real_end; GtkTextIter buffer_begin, buffer_end; GstyleColorItem *item; GstyleColor *color; GPtrArray *items; GError *tmp_error = NULL; g_return_val_if_fail (GTK_IS_TEXT_BUFFER (buffer), NULL); g_return_val_if_fail (begin == NULL || gtk_text_iter_get_buffer (begin) == buffer, NULL); g_return_val_if_fail (end == NULL || gtk_text_iter_get_buffer (end) == buffer, NULL); gtk_text_buffer_get_bounds (buffer, &buffer_begin, &buffer_end); real_begin = (begin == NULL) ? buffer_begin : *begin; real_end = (end == NULL) ? buffer_end : *end; text = gtk_text_buffer_get_slice (buffer, &real_begin, &real_end, FALSE); items = gstyle_color_parse (text); if (items == NULL) { g_set_error (error, GSTYLE_PALETTE_ERROR, GSTYLE_PALETTE_ERROR_PARSE, _("failed to parse\n")); return NULL; } if (items->len > 0) { /* To translators: always in singular form like in: generated palette number <generated_count> */ name = g_strdup_printf ("%s %i", _("Generated"), ++generated_count); palette = g_object_new (GSTYLE_TYPE_PALETTE, "id", NULL, "name", name, "file", NULL, NULL); for (gint i = 0; i < items->len; ++i) { item = g_ptr_array_index (items, i); color = (GstyleColor *)gstyle_color_item_get_color (item); gstyle_palette_add (palette, color, &tmp_error); } } g_ptr_array_free (items, TRUE); return palette; }
static void gb_color_picker_document_monitor_colorize (GbColorPickerDocumentMonitor *self, GtkTextBuffer *buffer, GtkTextIter *begin, GtkTextIter *end) { g_autofree gchar *text = NULL; g_autoptr(GPtrArray) items = NULL; GstyleColorItem *item; GtkTextTag *tag; GtkTextIter real_begin; GtkTextIter real_end; GtkTextIter tag_begin; GtkTextIter tag_end; gint offset; gint len; gint pos; g_return_if_fail (GB_IS_COLOR_PICKER_DOCUMENT_MONITOR (self)); g_return_if_fail (GTK_IS_TEXT_BUFFER (buffer)); if (begin == NULL) gtk_text_buffer_get_start_iter (GTK_TEXT_BUFFER (buffer), &real_begin); else real_begin = *begin; if (end == NULL) gtk_text_buffer_get_end_iter (GTK_TEXT_BUFFER (buffer), &real_end); else real_end = *end; if (gtk_text_iter_equal (&real_begin, &real_end)) return; offset = gtk_text_iter_get_offset (&real_begin); text = gtk_text_buffer_get_slice (GTK_TEXT_BUFFER (buffer), &real_begin, &real_end, TRUE); items = gstyle_color_parse (text); for (guint n = 0; n < items->len; ++n) { GstyleColor *color; item = g_ptr_array_index (items, n); pos = offset + gstyle_color_item_get_start (item); gtk_text_buffer_get_iter_at_offset (GTK_TEXT_BUFFER (buffer), &tag_begin, pos); len = gstyle_color_item_get_len (item); gtk_text_buffer_get_iter_at_offset (GTK_TEXT_BUFFER (buffer), &tag_end, pos + len); color = (GstyleColor *)gstyle_color_item_get_color (item); tag = gb_color_picker_helper_create_color_tag (GTK_TEXT_BUFFER (buffer), color); gtk_text_buffer_apply_tag (GTK_TEXT_BUFFER (buffer), tag, &tag_begin, &tag_end); /* FIXME: is the tag added to the tag table or should we handle a hash table/tag table ourself ? */ } }