SF.net SVN: geany:[3825] trunk

ntrel at users.sourceforge.net ntrel at xxxxx
Sat May 30 11:57:56 UTC 2009


Revision: 3825
          http://geany.svn.sourceforge.net/geany/?rev=3825&view=rev
Author:   ntrel
Date:     2009-05-30 11:57:56 +0000 (Sat, 30 May 2009)

Log Message:
-----------
Implement named styles support for filetypes.* using a
filetypes.common [named_styles] section e.g.:
foo=0xc00000;0xffffff;false;true
bar=foo
These can be used in e.g. filetypes.c as:
comment=foo

Modified Paths:
--------------
    trunk/ChangeLog
    trunk/TODO
    trunk/src/highlighting.c
    trunk/src/utils.c

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2009-05-29 13:35:55 UTC (rev 3824)
+++ trunk/ChangeLog	2009-05-30 11:57:56 UTC (rev 3825)
@@ -1,3 +1,14 @@
+2009-05-30  Nick Treleaven  <nick(dot)treleaven(at)btinternet(dot)com>
+
+ * src/utils.c, src/highlighting.c, TODO:
+   Implement named styles support for filetypes.* using a
+   filetypes.common [named_styles] section e.g.:
+   foo=0xc00000;0xffffff;false;true
+   bar=foo
+   These can be used in e.g. filetypes.c as:
+   comment=foo
+
+
 2009-05-28  Enrico Tröger  <enrico(dot)troeger(at)uvena(dot)de>
 
  * src/ui_utils.c:

Modified: trunk/TODO
===================================================================
--- trunk/TODO	2009-05-29 13:35:55 UTC (rev 3824)
+++ trunk/TODO	2009-05-30 11:57:56 UTC (rev 3825)
@@ -9,7 +9,7 @@
 	Next version or later:
 	o documentation: list and explain filetype modes
 	o common default highlighting styles configurable for all
-	  programming languages
+	  programming languages (filetypes.common named styles now done)
 	o configurable filetype and project make commands (e.g. using
 	  bud for D)
 	o (support for adding plugin filetypes - SCI_LOADLEXERLIBRARY?)

Modified: trunk/src/highlighting.c
===================================================================
--- trunk/src/highlighting.c	2009-05-29 13:35:55 UTC (rev 3824)
+++ trunk/src/highlighting.c	2009-05-30 11:57:56 UTC (rev 3825)
@@ -26,10 +26,12 @@
  * Syntax highlighting for the different filetypes, using the Scintilla lexers.
  */
 
+#include "geany.h"
+
 #include <stdlib.h>
+#include <ctype.h>
 
 #include "SciLexer.h"
-#include "geany.h"
 #include "highlighting.h"
 #include "editor.h"
 #include "utils.h"
@@ -51,10 +53,10 @@
 
 typedef struct
 {
-	gsize				count;		/* number of styles */
+	gsize			count;		/* number of styles */
 	GeanyLexerStyle	*styling;		/* array of styles, NULL if not used or uninitialised */
-	gchar				**keywords;
-	gchar				*wordchars;	/* NULL used for style sets with no styles */
+	gchar			**keywords;
+	gchar			*wordchars;	/* NULL used for style sets with no styles */
 } StyleSet;
 
 /* each filetype has a styleset except GEANY_FILETYPES_NONE, which uses common_style_set */
@@ -93,20 +95,42 @@
 static struct
 {
 	GeanyLexerStyle	 styling[GCS_MAX];
-	FoldingStyle		 folding_style;
-	gboolean			 invert_all;
-	gchar				*wordchars;
+	FoldingStyle	 folding_style;
+	gboolean		 invert_all;
+	gchar			*wordchars;
 } common_style_set;
 
 
 /* used for default styles */
 typedef struct
 {
-	gchar				*name;
+	gchar			*name;
 	GeanyLexerStyle	*style;
 } StyleEntry;
 
 
+/* For filetypes.common [named_styles] section.
+ * e.g. "comment" => &GeanyLexerStyle{0xd00000, 0xffffff, FALSE, FALSE} */
+static GHashTable *named_style_hash = NULL;
+
+
+/* Geany generic styles, initialized to defaults.
+ * Currently only used as default styling for C-like languages.
+ * Note: Ideally named styles would be used as common styling for all programming
+ * languages (and perhaps all filetypes).
+ * These could be replaced by default named styles in filetypes.common. */
+static GeanyLexerStyle gsd_default =		{0x000000, 0xffffff, FALSE, FALSE};
+static GeanyLexerStyle gsd_comment =		{0xd00000, 0xffffff, FALSE, FALSE};
+static GeanyLexerStyle gsd_comment_doc =	{0x3f5fbf, 0xffffff, TRUE, FALSE};
+static GeanyLexerStyle gsd_number =			{0x007f00, 0xffffff, FALSE, FALSE};
+static GeanyLexerStyle gsd_reserved_word =	{0x00007f, 0xffffff, TRUE, FALSE};
+static GeanyLexerStyle gsd_system_word =	{0x991111, 0xffffff, TRUE, FALSE};
+static GeanyLexerStyle gsd_user_word =		{0x0000d0, 0xffffff, TRUE, FALSE};
+static GeanyLexerStyle gsd_string =			{0xff901e, 0xffffff, FALSE, FALSE};
+static GeanyLexerStyle gsd_pragma =			{0x007f7f, 0xffffff, FALSE, FALSE};
+static GeanyLexerStyle gsd_string_eol =		{0x000000, 0xe0c0e0, FALSE, FALSE};
+
+
 static void new_style_array(gint file_type_id, gint styling_count)
 {
 	StyleSet *set = &style_sets[file_type_id];
@@ -165,6 +189,20 @@
 }
 
 
+static void read_named_style(const gchar *name, GeanyLexerStyle *style)
+{
+	GeanyLexerStyle *cs = g_hash_table_lookup(named_style_hash, name);
+
+	if (cs)
+		*style = *cs;
+	else
+	{
+		*style = gsd_default;
+		geany_debug("No named style '%s'! Check filetypes.common.", name);
+	}
+}
+
+
 /* convert 0x..RRGGBB to 0x..BBGGRR */
 static gint rotate_rgb(gint color)
 {
@@ -174,24 +212,25 @@
 }
 
 
-static void get_keyfile_style(GKeyFile *config, GKeyFile *configh,
-		const gchar *key_name, const GeanyLexerStyle *default_style, GeanyLexerStyle *style)
+/* FIXME: is not safe for badly formed key e.g. "key='" */
+static void parse_keyfile_style(gchar **list,
+		const GeanyLexerStyle *default_style, GeanyLexerStyle *style)
 {
-	gchar **list;
-	gsize len;
-
-	g_return_if_fail(config);
-	g_return_if_fail(configh);
-	g_return_if_fail(key_name);
 	g_return_if_fail(default_style);
 	g_return_if_fail(style);
 
-	list = g_key_file_get_string_list(configh, "styling", key_name, &len, NULL);
-	if (list == NULL)
-		list = g_key_file_get_string_list(config, "styling", key_name, &len, NULL);
+	if (G_LIKELY(list != NULL) && G_UNLIKELY(list[0] != NULL))
+	{
+		const gchar *str = list[0];
 
-	if (G_LIKELY(list != NULL) && G_UNLIKELY(list[0] != NULL))
-		style->foreground = (gint) utils_strtod(list[0], NULL, FALSE);
+		if (list[1] == NULL && isalpha(str[0]))
+		{
+			read_named_style(str, style);
+			return;
+		}
+		else
+			style->foreground = (gint) utils_strtod(str, NULL, FALSE);
+	}
 	else
 		style->foreground = rotate_rgb(default_style->foreground);
 
@@ -209,7 +248,26 @@
 		style->italic = utils_atob(list[3]);
 	else
 		style->italic = default_style->italic;
+}
 
+
+static void get_keyfile_style(GKeyFile *config, GKeyFile *configh,
+		const gchar *key_name, const GeanyLexerStyle *default_style, GeanyLexerStyle *style)
+{
+	gchar **list;
+	gsize len;
+
+	g_return_if_fail(config);
+	g_return_if_fail(configh);
+	g_return_if_fail(key_name);
+	g_return_if_fail(default_style);
+	g_return_if_fail(style);
+
+	list = g_key_file_get_string_list(configh, "styling", key_name, &len, NULL);
+	if (list == NULL)
+		list = g_key_file_get_string_list(config, "styling", key_name, &len, NULL);
+
+	parse_keyfile_style(list, default_style, style);
 	g_strfreev(list);
 }
 
@@ -314,6 +372,9 @@
 		g_strfreev(style_ptr->keywords);
 		g_free(style_ptr->wordchars);
 	}
+
+	if (named_style_hash)
+		g_hash_table_destroy(named_style_hash);
 }
 
 
@@ -355,6 +416,40 @@
 }
 
 
+static void get_named_styles(GKeyFile *config)
+{
+	const gchar group[] = "named_styles";
+	gchar **keys = g_key_file_get_keys(config, group, NULL, NULL);
+	gchar **ptr = keys;
+
+	if (!ptr)
+		return;
+
+	while (1)
+	{
+		gchar **list;
+		gsize len;
+		const gchar *key = *ptr;
+
+		if (!key)
+			break;
+
+		list = g_key_file_get_string_list(config, group, key, &len, NULL);
+		/* we allow a named style to reference another style above it */
+		if (list && len >= 1)
+		{
+			GeanyLexerStyle *style = g_new0(GeanyLexerStyle, 1);
+
+			parse_keyfile_style(list, &gsd_default, style);
+			g_hash_table_insert(named_style_hash, g_strdup(key), style);
+		}
+		g_strfreev(list);
+		ptr++;
+	}
+	g_strfreev(keys);
+}
+
+
 static void styleset_common_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
 {
 	static gboolean common_style_set_valid = FALSE;
@@ -413,6 +508,11 @@
 	get_keyfile_wordchars(config, config_home, &common_style_set.wordchars);
 	whitespace_chars = get_keyfile_whitespace_chars(config, config_home);
 
+	/* named styles */
+	named_style_hash = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
+	get_named_styles(config);
+	/* home overwrites any system named style */
+	get_named_styles(config_home);
 }
 
 
@@ -615,22 +715,6 @@
 }
 
 
-/* Geany generic styles, initialized to defaults.
- * Ideally these would be used as common styling for all compilable programming
- * languages (and perhaps partially used for scripting languages too).
- * Currently only used as default styling for C-like languages. */
-GeanyLexerStyle gsd_default =		{0x000000, 0xffffff, FALSE, FALSE};
-GeanyLexerStyle gsd_comment =		{0xd00000, 0xffffff, FALSE, FALSE};
-GeanyLexerStyle gsd_comment_doc =	{0x3f5fbf, 0xffffff, TRUE, FALSE};
-GeanyLexerStyle gsd_number =		{0x007f00, 0xffffff, FALSE, FALSE};
-GeanyLexerStyle gsd_reserved_word =	{0x00007f, 0xffffff, TRUE, FALSE};
-GeanyLexerStyle gsd_system_word =	{0x991111, 0xffffff, TRUE, FALSE};
-GeanyLexerStyle gsd_user_word =		{0x0000d0, 0xffffff, TRUE, FALSE};
-GeanyLexerStyle gsd_string =		{0xff901e, 0xffffff, FALSE, FALSE};
-GeanyLexerStyle gsd_pragma =		{0x007f7f, 0xffffff, FALSE, FALSE};
-GeanyLexerStyle gsd_string_eol =	{0x000000, 0xe0c0e0, FALSE, FALSE};
-
-
 /* call new_style_array(filetype_idx, >= 20) before using this. */
 static void
 styleset_c_like_init(GKeyFile *config, GKeyFile *config_home, gint filetype_idx)

Modified: trunk/src/utils.c
===================================================================
--- trunk/src/utils.c	2009-05-29 13:35:55 UTC (rev 3824)
+++ trunk/src/utils.c	2009-05-30 11:57:56 UTC (rev 3825)
@@ -928,7 +928,7 @@
 }
 
 
- guint utils_get_value_of_hex(const gchar ch)
+ static guint utils_get_value_of_hex(const gchar ch)
 {
 	if (ch >= '0' && ch <= '9')
 		return ch - '0';


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.



More information about the Commits mailing list