SF.net SVN: geany: [994] trunk

ntrel at users.sourceforge.net ntrel at xxxxx
Tue Nov 14 16:03:25 UTC 2006


Revision: 994
          http://svn.sourceforge.net/geany/?rev=994&view=rev
Author:   ntrel
Date:     2006-11-14 08:03:25 -0800 (Tue, 14 Nov 2006)

Log Message:
-----------
Add NULL-safe FILETYPE_ID macro to get filetype::id from pointer.
Allow insertion of GPL notice and file header when the filetype is
not set.
Add commenting for PHP & HTML GPL notice and file header templates.
Add make_comment_block() to templates.c.
Move document_prepare_template(), filetypes_get_template() to
templates.c.

Modified Paths:
--------------
    trunk/ChangeLog
    trunk/src/callbacks.c
    trunk/src/document.c
    trunk/src/document.h
    trunk/src/filetypes.c
    trunk/src/filetypes.h
    trunk/src/templates.c
    trunk/src/templates.h

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2006-11-14 01:27:12 UTC (rev 993)
+++ trunk/ChangeLog	2006-11-14 16:03:25 UTC (rev 994)
@@ -1,3 +1,16 @@
+2006-11-14  Nick Treleaven  <nick.treleaven at btinternet.com>
+
+ * src/templates.c, src/templates.h, src/callbacks.c, src/filetypes.c,
+   src/filetypes.h, src/document.c, src/document.h:
+   Add NULL-safe FILETYPE_ID macro to get filetype::id from pointer.
+   Allow insertion of GPL notice and file header when the filetype is
+   not set.
+   Add commenting for PHP & HTML GPL notice and file header templates.
+   Add make_comment_block() to templates.c.
+   Move document_prepare_template(), filetypes_get_template() to
+   templates.c.
+
+
 2006-11-13  Enrico Tröger  <enrico.troeger at uvena.de>
 
  * src/filetypes.c, src/filetypes.h, src/highlighting.c,

Modified: trunk/src/callbacks.c
===================================================================
--- trunk/src/callbacks.c	2006-11-14 01:27:12 UTC (rev 993)
+++ trunk/src/callbacks.c	2006-11-14 16:03:25 UTC (rev 994)
@@ -1582,34 +1582,8 @@
 	gint idx = document_get_cur_idx();
 	gchar *text;
 
-	if (doc_list[idx].file_type == NULL)
-	{
-		msgwin_status_add(_("Please set the filetype for the current file before using this function."));
-		return;
-	}
+	text = templates_get_template_gpl(FILETYPE_ID(doc_list[idx].file_type));
 
-	switch (doc_list[idx].file_type->id)
-	{
-		case GEANY_FILETYPES_PASCAL:
-		{
-			text = templates_get_template_gpl(GEANY_TEMPLATE_GPL_PASCAL);
-			break;
-		}
-		case GEANY_FILETYPES_PYTHON:
-		case GEANY_FILETYPES_RUBY:
-		case GEANY_FILETYPES_SH:
-		case GEANY_FILETYPES_MAKE:
-		case GEANY_FILETYPES_PERL:
-		{
-			text = templates_get_template_gpl(GEANY_TEMPLATE_GPL_ROUTE);
-			break;
-		}
-		default:
-		{
-			text = templates_get_template_gpl(GEANY_TEMPLATE_GPL);
-		}
-	}
-
 	sci_insert_text(doc_list[idx].sci, editor_info.click_pos, text);
 	g_free(text);
 }
@@ -1638,39 +1612,9 @@
 {
 	gint idx = document_get_cur_idx();
 	gchar *text;
-	gchar *ext = NULL;
 
-	if (doc_list[idx].file_type == NULL)
-	{
-		msgwin_status_add(_("Please set the filetype for the current file before using this function."));
-		return;
-	}
+	text = templates_get_template_fileheader(idx);
 
-	if (doc_list[idx].file_name == NULL)
-		ext = doc_list[idx].file_type->extension;
-
-	switch (doc_list[idx].file_type->id)
-	{
-		case GEANY_FILETYPES_PASCAL:
-		{
-			text = templates_get_template_fileheader(GEANY_TEMPLATE_FILEHEADER_PASCAL, ext, idx);
-			break;
-		}
-		case GEANY_FILETYPES_PYTHON:
-		case GEANY_FILETYPES_RUBY:
-		case GEANY_FILETYPES_SH:
-		case GEANY_FILETYPES_MAKE:
-		case GEANY_FILETYPES_PERL:
-		{
-			text = templates_get_template_fileheader(GEANY_TEMPLATE_FILEHEADER_ROUTE, ext, idx);
-			break;
-		}
-		default:
-		{
-			text = templates_get_template_fileheader(GEANY_TEMPLATE_FILEHEADER, ext, idx);
-		}
-	}
-
 	sci_insert_text(doc_list[idx].sci, 0, text);
 	sci_goto_pos(doc_list[idx].sci, 0, FALSE);
 	g_free(text);

Modified: trunk/src/document.c
===================================================================
--- trunk/src/document.c	2006-11-14 01:27:12 UTC (rev 993)
+++ trunk/src/document.c	2006-11-14 16:03:25 UTC (rev 994)
@@ -408,7 +408,7 @@
 void document_new_file(filetype *ft)
 {
 	gint idx = document_create_new_sci(NULL);
-	gchar *template = document_prepare_template(ft);
+	gchar *template = templates_get_template_new_file(ft);
 
 	g_assert(idx != -1);
 
@@ -1309,68 +1309,6 @@
 }
 
 
-/// TODO move me to filetypes.c
-gchar *document_prepare_template(filetype *ft)
-{
-	gchar *gpl_notice = NULL;
-	gchar *template = NULL;
-	gchar *ft_template = NULL;
-
-	if (ft != NULL)
-	{
-		switch (ft->id)
-		{
-			case GEANY_FILETYPES_PHP:
-			{	// PHP: include the comment in <?php ?> - tags
-				gchar *tmp = templates_get_template_fileheader(
-						GEANY_TEMPLATE_FILEHEADER, ft->extension, -1);
-				gpl_notice = g_strconcat("<?php\n", tmp, "?>\n\n", NULL);
-				g_free(tmp);
-				break;
-			}
-			case GEANY_FILETYPES_HTML:
-			{	// HTML: include the comment in <!-- --> - tags
-				gchar *tmp = templates_get_template_fileheader(
-						GEANY_TEMPLATE_FILEHEADER, ft->extension, -1);
-				gpl_notice = g_strconcat("<!--\n", tmp, "-->\n\n", NULL);
-				g_free(tmp);
-				break;
-			}
-			case GEANY_FILETYPES_PASCAL:
-			{	// Pascal: comments are in { } brackets
-				gpl_notice = templates_get_template_fileheader(
-						GEANY_TEMPLATE_FILEHEADER_PASCAL, ft->extension, -1);
-				break;
-			}
-			case GEANY_FILETYPES_PYTHON:
-			case GEANY_FILETYPES_RUBY:
-			case GEANY_FILETYPES_SH:
-			case GEANY_FILETYPES_MAKE:
-			case GEANY_FILETYPES_PERL:
-			{
-				gpl_notice = templates_get_template_fileheader(
-						GEANY_TEMPLATE_FILEHEADER_ROUTE, ft->extension, -1);
-				break;
-			}
-			default:
-			{	// -> C, C++, Java, ...
-				gpl_notice = templates_get_template_fileheader(
-						GEANY_TEMPLATE_FILEHEADER, ft->extension, -1);
-			}
-		}
-		ft_template = filetypes_get_template(ft);
-		template = g_strconcat(gpl_notice, ft_template, NULL);
-		g_free(ft_template);
-		g_free(gpl_notice);
-		return template;
-	}
-	else
-	{	// new file w/o template
-		return templates_get_template_fileheader(GEANY_TEMPLATE_FILETYPE_NONE, NULL, -1);
-	}
-}
-
-
 void document_unfold_all(gint idx)
 {
 	gint lines, pos, i;

Modified: trunk/src/document.h
===================================================================
--- trunk/src/document.h	2006-11-14 01:27:12 UTC (rev 993)
+++ trunk/src/document.h	2006-11-14 16:03:25 UTC (rev 994)
@@ -161,8 +161,6 @@
 
 gchar *document_get_eol_mode(gint);
 
-gchar *document_prepare_template(filetype *ft);
-
 void document_fold_all(gint idx);
 
 void document_unfold_all(gint idx);

Modified: trunk/src/filetypes.c
===================================================================
--- trunk/src/filetypes.c	2006-11-14 01:27:12 UTC (rev 993)
+++ trunk/src/filetypes.c	2006-11-14 16:03:25 UTC (rev 994)
@@ -513,15 +513,11 @@
 	filetypes[GEANY_FILETYPES_HTML]->has_tags = FALSE;
 	filetypes[GEANY_FILETYPES_HTML]->title = g_strdup(_("HTML source file"));
 	filetypes[GEANY_FILETYPES_HTML]->extension = g_strdup("html");
-	filetypes[GEANY_FILETYPES_HTML]->pattern = g_new0(gchar*, 8);
-	filetypes[GEANY_FILETYPES_HTML]->pattern[0] = g_strdup("*.htm");
-	filetypes[GEANY_FILETYPES_HTML]->pattern[1] = g_strdup("*.html");
-	filetypes[GEANY_FILETYPES_HTML]->pattern[2] = g_strdup("*.shtml");
-	filetypes[GEANY_FILETYPES_HTML]->pattern[3] = g_strdup("*.hta");
-	filetypes[GEANY_FILETYPES_HTML]->pattern[4] = g_strdup("*.htd");
-	filetypes[GEANY_FILETYPES_HTML]->pattern[5] = g_strdup("*.htt");
-	filetypes[GEANY_FILETYPES_HTML]->pattern[6] = g_strdup("*.cfm");
-	filetypes[GEANY_FILETYPES_HTML]->pattern[7] = NULL;
+	{
+		gchar *patterns[] = {"*.htm", "*.html", "*.shtml", "*.hta", "*.htd", "*.htt",
+			"*.cfm", NULL};
+		filetypes[GEANY_FILETYPES_HTML]->pattern = g_strdupv(patterns);
+	}
 	filetypes[GEANY_FILETYPES_HTML]->style_func_ptr = styleset_html;
 	filetypes[GEANY_FILETYPES_HTML]->comment_open = g_strdup("<!--");
 	filetypes[GEANY_FILETYPES_HTML]->comment_close = g_strdup("-->");
@@ -893,33 +889,6 @@
 }
 
 
-gchar *filetypes_get_template(filetype *ft)
-{
-	if (ft == NULL) return NULL;
-
-	switch (ft->id)
-	{
-		case GEANY_FILETYPES_C:
-			return templates_get_template_generic(GEANY_TEMPLATE_FILETYPE_C); break;
-		case GEANY_FILETYPES_CPP:
-			return templates_get_template_generic(GEANY_TEMPLATE_FILETYPE_CPP); break;
-		case GEANY_FILETYPES_PHP:
-			return templates_get_template_generic(GEANY_TEMPLATE_FILETYPE_PHP); break;
-		case GEANY_FILETYPES_JAVA:
-			return templates_get_template_generic(GEANY_TEMPLATE_FILETYPE_JAVA); break;
-		case GEANY_FILETYPES_PASCAL:
-			return templates_get_template_generic(GEANY_TEMPLATE_FILETYPE_PASCAL); break;
-		case GEANY_FILETYPES_RUBY:
-			return templates_get_template_generic(GEANY_TEMPLATE_FILETYPE_RUBY); break;
-		case GEANY_FILETYPES_D:
-			return templates_get_template_generic(GEANY_TEMPLATE_FILETYPE_D); break;
-		case GEANY_FILETYPES_HTML:
-			return templates_get_template_generic(GEANY_TEMPLATE_FILETYPE_HTML); break;
-		default: return NULL;
-	}
-}
-
-
 void filetypes_get_config(GKeyFile *config, GKeyFile *configh, gint ft)
 {
 	gchar *result;

Modified: trunk/src/filetypes.h
===================================================================
--- trunk/src/filetypes.h	2006-11-14 01:27:12 UTC (rev 993)
+++ trunk/src/filetypes.h	2006-11-14 16:03:25 UTC (rev 994)
@@ -64,7 +64,11 @@
 	GEANY_MAX_FILE_TYPES
 };
 
+// Safe wrapper to get the id field of a possibly NULL filetype pointer.
+#define FILETYPE_ID(filetype_ptr) \
+	(((filetype_ptr) != NULL) ? (filetype_ptr)->id : GEANY_FILETYPES_ALL)
 
+
 struct build_menu_items
 {
 	GtkWidget		*menu;
@@ -124,8 +128,6 @@
 /* frees the array and all related pointers */
 void filetypes_free_types();
 
-gchar *filetypes_get_template(filetype *ft);
-
 void filetypes_get_config(GKeyFile *config, GKeyFile *configh, gint ft);
 
 void filetypes_save_commands();

Modified: trunk/src/templates.c
===================================================================
--- trunk/src/templates.c	2006-11-14 01:27:12 UTC (rev 993)
+++ trunk/src/templates.c	2006-11-14 16:03:25 UTC (rev 994)
@@ -84,7 +84,7 @@
  * name: {functionname}\n\
  * @param\n\
  * @return\n\
-*/\n";
+ */\n";
 
 static const gchar templates_function_description_pascal[] = "\
 {\n\
@@ -103,7 +103,7 @@
 static const gchar templates_multiline[] = "\
 /* \n\
  * \n\
-*/";
+ */";
 
 static const gchar templates_multiline_pascal[] = "\
 {\n\
@@ -121,7 +121,7 @@
  *      Copyright {year} {developer} <{mail}>\n\
  *\n\
 {gpl}\
- */\n\n";
+ */\n";
 
 static const gchar templates_fileheader_pascal[] = "\
 {\n\
@@ -130,7 +130,7 @@
       Copyright {year} {developer} <{mail}>\n\
 \n\
 {gpl}\
-}\n\n";
+}\n";
 
 static const gchar templates_fileheader_route[] = "\
 #\n\
@@ -139,7 +139,7 @@
 #      Copyright {year} {developer} <{mail}>\n\
 #\n\
 {gpl}\
-#\n\n";
+#\n";
 
 static const gchar templates_changelog[] = "\
 {date}  {developer}  <{mail}>\n\
@@ -409,28 +409,97 @@
 }
 
 
+/* double_comment is a hack for PHP/HTML for whether to first add C style commenting.
+ * In future we could probably remove the need for this by making most templates
+ * automatically commented (so template files are not commented) */
+static gchar *make_comment_block(const gchar *comment_text, gint filetype_id,
+		gboolean double_comment)
+{
+	switch (filetype_id)
+	{
+		case GEANY_FILETYPES_ALL:
+		return g_strdup(comment_text);	// no need to add to the text
+
+		case GEANY_FILETYPES_PHP:
+		case GEANY_FILETYPES_HTML:
+		{	// double comment
+			gchar *tmp = (double_comment) ?
+				make_comment_block(comment_text, GEANY_FILETYPES_C, FALSE) :
+				g_strdup(comment_text);
+			gchar *block = (filetype_id == GEANY_FILETYPES_PHP) ?
+				g_strconcat("<?php\n", tmp, "?>\n", NULL) :
+				g_strconcat("<!--\n", tmp, "-->\n", NULL);
+			g_free(tmp);
+			return block;
+		}
+
+		case GEANY_FILETYPES_PYTHON:
+		case GEANY_FILETYPES_RUBY:
+		case GEANY_FILETYPES_SH:
+		case GEANY_FILETYPES_MAKE:
+		case GEANY_FILETYPES_PERL:
+		return g_strconcat("#\n", comment_text, "#\n", NULL);
+
+		case GEANY_FILETYPES_PASCAL:
+		return g_strconcat("{\n", comment_text, "}\n", NULL);
+
+		default:
+		return g_strconcat("/*\n", comment_text, " */\n", NULL);
+	}
+}
+
+
+gchar *templates_get_template_gpl(gint filetype_id)
+{
+	const gchar *text;
+
+	switch (filetype_id)
+	{
+		case GEANY_FILETYPES_PYTHON:
+		case GEANY_FILETYPES_RUBY:
+		case GEANY_FILETYPES_SH:
+		case GEANY_FILETYPES_MAKE:
+		case GEANY_FILETYPES_PERL:
+		text = templates[GEANY_TEMPLATE_GPL_ROUTE];
+		break;
+
+		case GEANY_FILETYPES_PASCAL:
+		case GEANY_FILETYPES_ALL:
+		text = templates[GEANY_TEMPLATE_GPL_PASCAL];
+		break;
+
+		case GEANY_FILETYPES_HTML:
+		case GEANY_FILETYPES_PHP:
+		default:
+		text = templates[GEANY_TEMPLATE_GPL];
+		break;
+	}
+	return make_comment_block(text, filetype_id, TRUE);
+}
+
+
 /* Returns a template chosen by template with GEANY_STRING_UNTITLED.extension
  * as filename if idx is -1, or the real filename if idx is greater than -1.
- * The flag gpl decides wether a GPL notice is appended or not
-*/
-gchar *templates_get_template_fileheader(gint template, const gchar *extension, gint idx)
+ * The flag gpl decides whether a GPL notice is appended or not */
+static gchar *
+prepare_file_header(gint template, const gchar *extension, const gchar *filename)
 {
 	gchar *result = g_strdup(templates[template]);
-	gchar *filename;
+	gchar *shortname;
 	gchar *date = utils_get_date_time();
 
-	if (idx == -1 || doc_list[idx].file_name == NULL)
+	if (filename == NULL)
 	{
 		if (extension != NULL)
-			filename = g_strconcat(GEANY_STRING_UNTITLED, ".", extension, NULL);
+			shortname = g_strconcat(GEANY_STRING_UNTITLED, ".", extension, NULL);
 		else
-			filename = g_strdup(GEANY_STRING_UNTITLED);
+			shortname = g_strdup(GEANY_STRING_UNTITLED);
 	}
 	else
 	{
-		filename = g_path_get_basename(doc_list[idx].file_name);
+		shortname = g_path_get_basename(filename);
 	}
-	result = utils_str_replace(result, "{filename}", filename);
+	result = utils_str_replace(result, "{filename}", shortname);
 
 	if (template == GEANY_TEMPLATE_FILEHEADER_PASCAL)
 	{
@@ -446,12 +515,117 @@
 	}
 	result = utils_str_replace(result, "{datetime}", date);
 
-	g_free(filename);
+	g_free(shortname);
 	g_free(date);
 	return result;
 }
 
 
+// ft, fname can be NULL
+static gchar *get_file_header(filetype *ft, const gchar *fname)
+{
+	gchar *text = NULL;
+
+	switch (FILETYPE_ID(ft))
+	{
+		case GEANY_FILETYPES_ALL:	// ft may be NULL
+		{
+			text = prepare_file_header(GEANY_TEMPLATE_FILEHEADER, NULL, fname);
+			break;
+		}
+		case GEANY_FILETYPES_PHP:
+		case GEANY_FILETYPES_HTML:
+		{
+			gchar *tmp = prepare_file_header(
+					GEANY_TEMPLATE_FILEHEADER, ft->extension, fname);
+			text = make_comment_block(tmp, ft->id, FALSE);
+			g_free(tmp);
+			break;
+		}
+		case GEANY_FILETYPES_PASCAL:
+		{	// Pascal: comments are in { } brackets
+			text = prepare_file_header(
+					GEANY_TEMPLATE_FILEHEADER_PASCAL, ft->extension, fname);
+			break;
+		}
+		case GEANY_FILETYPES_PYTHON:
+		case GEANY_FILETYPES_RUBY:
+		case GEANY_FILETYPES_SH:
+		case GEANY_FILETYPES_MAKE:
+		case GEANY_FILETYPES_PERL:
+		{
+			text = prepare_file_header(
+					GEANY_TEMPLATE_FILEHEADER_ROUTE, ft->extension, fname);
+			break;
+		}
+		default:
+		{	// -> C, C++, Java, ...
+			text = prepare_file_header(
+					GEANY_TEMPLATE_FILEHEADER, ft->extension, fname);
+		}
+	}
+	return text;
+}
+
+
+gchar *templates_get_template_fileheader(gint idx)
+{
+	gchar *fname;
+	filetype *ft;
+
+	g_return_val_if_fail(DOC_IDX_VALID(idx), NULL);
+	ft = doc_list[idx].file_type;
+	fname = doc_list[idx].file_name;
+
+	return get_file_header(ft, fname);
+}
+
+
+static gchar *get_file_template(filetype *ft)
+{
+	switch (FILETYPE_ID(ft))
+	{
+		case GEANY_FILETYPES_ALL:
+			return templates_get_template_generic(GEANY_TEMPLATE_FILETYPE_NONE); break;
+		case GEANY_FILETYPES_C:
+			return templates_get_template_generic(GEANY_TEMPLATE_FILETYPE_C); break;
+		case GEANY_FILETYPES_CPP:
+			return templates_get_template_generic(GEANY_TEMPLATE_FILETYPE_CPP); break;
+		case GEANY_FILETYPES_PHP:
+			return templates_get_template_generic(GEANY_TEMPLATE_FILETYPE_PHP); break;
+		case GEANY_FILETYPES_JAVA:
+			return templates_get_template_generic(GEANY_TEMPLATE_FILETYPE_JAVA); break;
+		case GEANY_FILETYPES_PASCAL:
+			return templates_get_template_generic(GEANY_TEMPLATE_FILETYPE_PASCAL); break;
+		case GEANY_FILETYPES_RUBY:
+			return templates_get_template_generic(GEANY_TEMPLATE_FILETYPE_RUBY); break;
+		case GEANY_FILETYPES_D:
+			return templates_get_template_generic(GEANY_TEMPLATE_FILETYPE_D); break;
+		case GEANY_FILETYPES_HTML:
+			return templates_get_template_generic(GEANY_TEMPLATE_FILETYPE_HTML); break;
+		default: return NULL;
+	}
+}
+
+
+gchar *templates_get_template_new_file(filetype *ft)
+{
+	gchar *template = NULL;
+	gchar *ft_template = NULL;
+	gchar *file_header = NULL;
+
+	if (FILETYPE_ID(ft) == GEANY_FILETYPES_ALL)
+		return get_file_template(ft);
+
+	file_header = get_file_header(ft, NULL);	// file template only used for new files
+	ft_template = get_file_template(ft);
+	template = g_strconcat(file_header, "\n", ft_template, NULL);
+	g_free(ft_template);
+	g_free(file_header);
+	return template;
+}
+
+
 gchar *templates_get_template_generic(gint template)
 {
 	return g_strdup(templates[template]);
@@ -473,28 +647,6 @@
 	return result;
 }
 
-gchar *templates_get_template_gpl(gint template)
-{
-	switch (template)
-	{
-		case GEANY_TEMPLATE_GPL_PASCAL:
-		{
-			return g_strconcat("{\n", templates[template], "}\n", NULL);
-			break;
-		}
-		case GEANY_TEMPLATE_GPL_ROUTE:
-		{
-			return g_strconcat("#\n", templates[template], "#\n", NULL);
-			break;
-		}
-		default:
-		{
-			return g_strconcat("/*\n", templates[template], "*/\n", NULL);
-		}
-	}
-}
-
-
 gchar *templates_get_template_changelog(void)
 {
 	gchar *date = utils_get_date_time();

Modified: trunk/src/templates.h
===================================================================
--- trunk/src/templates.h	2006-11-14 01:27:12 UTC (rev 993)
+++ trunk/src/templates.h	2006-11-14 16:03:25 UTC (rev 994)
@@ -23,18 +23,22 @@
 #ifndef GEANY_TEMPLATES_H
 #define GEANY_TEMPLATES_H 1
 
+#include "filetypes.h"
 
+
 void templates_init(void);
 
-gchar *templates_get_template_fileheader(gint template, const gchar *extension, gint idx);
+gchar *templates_get_template_fileheader(gint idx);
 
+gchar *templates_get_template_new_file(filetype *ft);
+
 gchar *templates_get_template_changelog(void);
 
 gchar *templates_get_template_generic(gint template);
 
 gchar *templates_get_template_function(gint template, const gchar *func_name);
 
-gchar *templates_get_template_gpl(gint template);
+gchar *templates_get_template_gpl(gint filetype_id);
 
 void templates_free_templates(void);
 


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