Hi! Ive made a plugin to solve Bug 103753. http://bugzilla.gnome.org/show_bug.cgi?id=103753 This patch contains the convert/ plugin code. It guesses the file type {DOS,MAC,UNIX} and uses gedit_document_replace_string(); It runs a dialog in the middle, for user to abort conversions, or convert from Dos-Unix-Mac-Dos-Unix, All the 6 conversion combo's are possible, but based on your file type. You can test the utility by using $unix2dos, dos2unix tools to make your custom files, and get them converted via gedit. Thanks Muthu. __________________________________ Discover Yahoo! Stay in touch with email, IM, photo sharing and more. Check it out! http://discover.yahoo.com/stayintouch.html
Attachment:
convert.tgz
Description: 4044610658-convert.tgz
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* * convert.c * This file is part of gedit * [Shamelessly copied from time.c] * (C) 2005 Muthiah Annamalai. * * Copyright (C) 2002 Paolo Maggi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the gedit Team, 2002. See the AUTHORS file for a * list of people on the gedit Team. * See the ChangeLog files for a list of changes. */ #ifdef HAVE_CONFIG_H #include <config.h> #endif #include <string.h> #include <time.h> #include <glib/gi18n.h> #include <glade/glade-xml.h> #include <gconf/gconf-client.h> #include <libgnome/gnome-help.h> #include <libgnome/gnome-config.h> #include <gedit/gedit-plugin.h> #include <gedit/gedit-debug.h> #include <gedit/gedit-menus.h> #include <gedit/gedit-utils.h> #include <gedit/gedit-document.h> #define MENU_ITEM_LABEL N_("Convert _Unix <-> Dos <-> Mac <-> Unix") #define MENU_ITEM_PATH "/menu/Edit/EditOps_3/" #define MENU_ITEM_NAME "PluginConvertEncoding" #define MENU_ITEM_TIP N_("Convert OS formats between Mac, Unix & Dos") /* For the people to pickup.. */ G_MODULE_EXPORT GeditPluginState update_ui (GeditPlugin *plugin, BonoboWindow *window); G_MODULE_EXPORT GeditPluginState destroy (GeditPlugin *pd); G_MODULE_EXPORT GeditPluginState activate (GeditPlugin *pd); G_MODULE_EXPORT GeditPluginState deactivate (GeditPlugin *pd); G_MODULE_EXPORT GeditPluginState init (GeditPlugin *pd); G_MODULE_EXPORT GeditPluginState configure (GeditPlugin *p, GtkWidget *parent); /* Painfully UniThreaded....! */ static void convert_os (BonoboUIComponent *uic,gpointer user_data, const gchar* verbname) { GeditDocument *doc; GtkTextIter sit={0,},eit={0,}; GtkWidget *dlg=NULL; GtkWidget *pbar=NULL,*ebox=NULL; gchar *data=NULL; gchar *add_str=NULL; gchar *ip_str=NULL; int length=0,query_length=0,i=0; int mac_count=0,dos_count=0,unix_count=0; enum {IN=0,OUT=1}; enum {DOS=0, MAC=1, UNIX=2} FileType[2]; char *FileTypeString[]={"DOS \\r\\n CR+LF","MAC \\r CR","UNIX \\n LF"}; GtkWidget *FileTypeWidget[2]={0,}; GtkTooltips *ttips=NULL; GString *opstr=NULL; gedit_debug (DEBUG_PLUGINS, "Conversion Routine."); /* For Undo Redo stuff? */ doc = gedit_get_active_document (); gedit_document_begin_user_action (doc); gedit_debug (DEBUG_PLUGINS, "Conversion Routine 2"); gtk_text_buffer_get_start_iter(GTK_TEXT_BUFFER (doc),&sit); gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER (doc),&eit); gedit_debug (DEBUG_PLUGINS, "Conversion Routine 3"); /* Can be very slow.... */ data=gtk_text_buffer_get_text(GTK_TEXT_BUFFER (doc), &sit,&eit,FALSE); g_return_if_fail(data!=NULL || strlen(data)<1); gedit_debug (DEBUG_PLUGINS, "Conversion Routine 4"); length=strlen(data); /* MIN 200 characters or {FILE_LENG} to probe the type of file*/ if(length>200) { query_length=200; } else query_length=length; /* Probing. */ for(i=0;i<(query_length-1);i++) { if(data[i]=='\r' && data[i+1]=='\n') dos_count++; else if(data[i]=='\r') mac_count++; else if(data[i]=='\n') unix_count++; } FileType[IN] = (mac_count > unix_count) ? MAC : UNIX; FileType[IN] = (MAX(mac_count,unix_count) > dos_count) ? FileType[IN] : DOS; /* Popup-dialog: Buildit earlier in Init or something.*/ dlg=gtk_message_dialog_new(NULL,0, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, "This file type is %s.\n Choose the Format you want to convert this file to.",FileTypeString[FileType[IN]]); switch(FileType[IN]) { case DOS: FileTypeWidget[0]=gtk_button_new_with_label("Dos -> Unix"); ttips=gtk_tooltips_new(); gtk_tooltips_set_tip(ttips,FileTypeWidget[0], "Convert \\r\\n to \\n in Text",""); FileTypeWidget[1]=gtk_button_new_with_label("Dos -> Mac"); ttips=gtk_tooltips_new(); gtk_tooltips_set_tip(ttips,FileTypeWidget[1], "Convert \\r\\n to \\r in Text",""); break; case MAC: FileTypeWidget[0]=gtk_button_new_with_label("Mac -> Dos"); ttips=gtk_tooltips_new(); gtk_tooltips_set_tip(ttips,FileTypeWidget[0], "Convert \\r to \\r\\n in Text",""); FileTypeWidget[1]=gtk_button_new_with_label("Mac -> Unix"); ttips=gtk_tooltips_new(); gtk_tooltips_set_tip(ttips,FileTypeWidget[1], "Convert \\r to \\n in Text",""); break; case UNIX: FileTypeWidget[0]=gtk_button_new_with_label("Unix -> Dos"); ttips=gtk_tooltips_new(); gtk_tooltips_set_tip(ttips,FileTypeWidget[0], "Convert \\n to \\r\\n in Text",""); FileTypeWidget[1]=gtk_button_new_with_label("Unix -> Mac"); ttips=gtk_tooltips_new(); gtk_tooltips_set_tip(ttips,FileTypeWidget[1], "Convert \\n to \\r in Text",""); break; } FileTypeWidget[2]=gtk_button_new_from_stock(GTK_STOCK_CANCEL); gtk_dialog_add_action_widget(GTK_DIALOG(dlg), FileTypeWidget[0], 0); gtk_dialog_add_action_widget(GTK_DIALOG(dlg), FileTypeWidget[1], 1); gtk_dialog_add_action_widget(GTK_DIALOG(dlg), FileTypeWidget[2], 2); gtk_widget_show_all(dlg); gedit_debug(DEBUG_PLUGINS,"Dialog Runs..."); /* Modal dialog */ FileType[OUT]=gtk_dialog_run(GTK_DIALOG(dlg)); gedit_debug(DEBUG_PLUGINS,"Dialog Finished.. %d",FileType[OUT]); /* MAGIC! */ while(gtk_events_pending()) gtk_main_iteration(); gtk_widget_hide(dlg); gtk_widget_destroy(dlg); /* MAGIC! */ while(gtk_events_pending()) gtk_main_iteration(); gedit_debug(DEBUG_PLUGINS,"Dialog Destroyed.. %d",FileType[OUT]); if(FileType[OUT]==2) { gedit_debug(DEBUG_PLUGINS,"User aborted Convert operation"); return; } opstr=g_string_new(NULL); gedit_debug(DEBUG_PLUGINS,"Progression Action"); gedit_debug(DEBUG_PLUGINS,"ft[IN]=%d ft[OUT]=%d", FileType[IN],FileType[OUT]); g_assert(data!=NULL); gedit_debug(DEBUG_PLUGINS,"Iter %d",i); add_str=NULL; ip_str=NULL; switch(FileType[IN]) { case DOS: gedit_debug(DEBUG_PLUGINS,FileTypeString[FileType[OUT]+1]); ip_str="\r\n"; /* MAC */ if(FileType[OUT]==0) add_str="\r"; /* UNIX */ else if(FileType[OUT]==1) add_str="\n"; g_assert(add_str!=NULL); opstr=g_string_append(opstr,add_str); break; case MAC: gedit_debug(DEBUG_PLUGINS,FileTypeString[(OUT==1)?2:0]); ip_str="\r"; /* DOS */ if(FileType[OUT]==0) add_str="\r\n"; /* UNIX */ else if(FileType[OUT]==1) add_str="\n"; g_assert(add_str!=NULL); opstr=g_string_append(opstr,add_str); break; case UNIX: gedit_debug(DEBUG_PLUGINS,FileTypeString[FileType[OUT]]); ip_str="\n"; /* DOS */ if(FileType[OUT]==0) add_str="\r\n"; /* MAC */ else if(FileType[OUT]==1) add_str="\r"; g_assert(add_str!=NULL); opstr=g_string_append(opstr,add_str); break; default: g_message("Critical region IN=%d",IN); return; } /* MAGIC! */ while(gtk_events_pending()) gtk_main_iteration(); gtk_text_buffer_get_start_iter(GTK_TEXT_BUFFER(doc),&sit); gtk_text_buffer_place_cursor (GTK_TEXT_BUFFER(doc),&sit); g_assert(opstr->str!=NULL); gedit_document_replace_all(doc,ip_str /*Find */, opstr->str /* Replace */, GEDIT_SEARCH_FROM_CURSOR); g_string_free(opstr,TRUE); if(data) g_free(data); /* DONE! */ gedit_document_end_user_action (doc); return; } G_MODULE_EXPORT GeditPluginState configure (GeditPlugin *p, GtkWidget *parent) { GtkWidget *dlg=NULL; gedit_debug (DEBUG_PLUGINS, "Informing Convert Dialog"); dlg=gtk_message_dialog_new (NULL,GTK_DIALOG_MODAL,GTK_MESSAGE_INFO,GTK_BUTTONS_OK, "To Convert text from MAC<to>DOS<to>UNIX<to>MAC fromats"); g_return_val_if_fail(dlg!=NULL,PLUGIN_OK); gtk_widget_show_all(dlg); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy (dlg); gedit_debug (DEBUG_PLUGINS, "Done"); return PLUGIN_OK; } G_MODULE_EXPORT GeditPluginState update_ui (GeditPlugin *plugin, BonoboWindow *window) { BonoboUIComponent *uic; GeditDocument *doc; GeditMDI *mdi; gedit_debug (DEBUG_PLUGINS, "OS Update ui"); g_return_val_if_fail (window != NULL, PLUGIN_ERROR); mdi = gedit_get_mdi (); g_return_val_if_fail (window != NULL, PLUGIN_ERROR); uic = gedit_get_ui_component_from_window (window); doc = gedit_get_active_document (); if ((doc == NULL) || (gedit_document_is_readonly (doc)) || (gedit_mdi_get_state (mdi) != GEDIT_STATE_NORMAL)) gedit_menus_set_verb_sensitive (uic, "/commands/" MENU_ITEM_NAME, FALSE); else gedit_menus_set_verb_sensitive (uic, "/commands/" MENU_ITEM_NAME, TRUE); return PLUGIN_OK; } G_MODULE_EXPORT GeditPluginState activate (GeditPlugin *pd) { /* Standard stuff */ GList *top_windows; gedit_debug (DEBUG_PLUGINS, ""); top_windows = gedit_get_top_windows (); g_return_val_if_fail (top_windows != NULL, PLUGIN_ERROR); while (top_windows) { gedit_menus_add_menu_item (BONOBO_WINDOW (top_windows->data), MENU_ITEM_PATH, MENU_ITEM_NAME, MENU_ITEM_LABEL, MENU_ITEM_TIP, NULL, convert_os); pd->update_ui (pd, BONOBO_WINDOW (top_windows->data)); top_windows = g_list_next (top_windows); } return PLUGIN_OK; } G_MODULE_EXPORT GeditPluginState deactivate (GeditPlugin *pd) { gedit_debug (DEBUG_PLUGINS, "Deactivated Convert plugin"); gedit_menus_remove_menu_item_all (MENU_ITEM_PATH, MENU_ITEM_NAME); return PLUGIN_OK; } G_MODULE_EXPORT GeditPluginState destroy (GeditPlugin *pd) { gedit_debug (DEBUG_PLUGINS, "Closing Convert Plugin"); return PLUGIN_OK; } G_MODULE_EXPORT GeditPluginState init (GeditPlugin *pd) { /* initialize */ gedit_debug (DEBUG_PLUGINS, "Convert Init plugin"); pd->private_data = NULL; /* NO GConf Stuff */ return PLUGIN_OK; }