[geany/geany-plugins] c19bfd: Merge pull request #581 from LarsGit223/pretty-printer-prefs

Frank Lanitz git-noreply at xxxxx
Thu Oct 12 19:58:32 UTC 2017


Branch:      refs/heads/master
Author:      Frank Lanitz <frank at frank.uvena.de>
Committer:   GitHub <noreply at github.com>
Date:        Thu, 12 Oct 2017 19:58:32 UTC
Commit:      c19bfd32d1c9031889e4e3ab7c5ac6d271d8276e
             https://github.com/geany/geany-plugins/commit/c19bfd32d1c9031889e4e3ab7c5ac6d271d8276e

Log Message:
-----------
Merge pull request #581 from LarsGit223/pretty-printer-prefs

pretty-printer: added saving and loading of preferences in/from a file. Fixes #494.


Modified Paths:
--------------
    pretty-printer/src/ConfigUI.c
    pretty-printer/src/ConfigUI.h
    pretty-printer/src/PluginEntry.c
    pretty-printer/src/PrettyPrinter.c

Modified: pretty-printer/src/ConfigUI.c
200 lines changed, 195 insertions(+), 5 deletions(-)
===================================================================
@@ -93,11 +93,12 @@ GtkWidget* createPrettyPrinterConfigUI(GtkDialog * dialog)
     return container;
 }
 
-void saveSettings(void)
+static void
+fetchSettingsFromConfigUI(PrettyPrintingOptions* ppo)
 {
     int breakStyle;
-    PrettyPrintingOptions* ppo = prettyPrintingOptions;
 
+    if (ppo == NULL) return;
     ppo->oneLineComment = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(commentOneLine));
     ppo->inlineComment = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(commentInline));
     ppo->alignComment = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(commentAlign));
@@ -118,9 +119,198 @@ void saveSettings(void)
     ppo->indentChar = gtk_combo_box_get_active(GTK_COMBO_BOX(indentationChar))==0 ? '\t' : ' ';
 
     breakStyle = gtk_combo_box_get_active(GTK_COMBO_BOX(lineBreak));
-    if (breakStyle == 0) ppo->newLineChars = "\r";
-    else if (breakStyle == 1) ppo->newLineChars = "\n";
-    else ppo->newLineChars = "\r\n";
+    g_free ((gpointer)ppo->newLineChars);
+    if (breakStyle == 0) ppo->newLineChars = g_strdup("\r");
+    else if (breakStyle == 1) ppo->newLineChars = g_strdup("\n");
+    else ppo->newLineChars = g_strdup("\r\n");
+}
+
+static gchar *
+prefsToData (PrettyPrintingOptions* ppo,
+             gsize* size,
+             GError** error)
+{
+    GKeyFile *kf;
+    gchar    *contents;
+
+    kf = g_key_file_new ();
+
+    g_key_file_set_string (kf, "pretty-printer", "newLineChars", ppo->newLineChars);
+    g_key_file_set_integer (kf, "pretty-printer", "indentChar", (int)ppo->indentChar);
+    g_key_file_set_integer (kf, "pretty-printer", "indentLength", ppo->indentLength);
+    g_key_file_set_boolean (kf, "pretty-printer", "oneLineText", ppo->oneLineText);
+    g_key_file_set_boolean (kf, "pretty-printer", "inlineText", ppo->inlineText);
+    g_key_file_set_boolean (kf, "pretty-printer", "oneLineComment", ppo->oneLineComment);
+    g_key_file_set_boolean (kf, "pretty-printer", "inlineComment", ppo->inlineComment);
+    g_key_file_set_boolean (kf, "pretty-printer", "oneLineCdata", ppo->oneLineCdata);
+    g_key_file_set_boolean (kf, "pretty-printer", "inlineCdata", ppo->inlineCdata);
+    g_key_file_set_boolean (kf, "pretty-printer", "emptyNodeStripping", ppo->emptyNodeStripping);
+    g_key_file_set_boolean (kf, "pretty-printer", "emptyNodeStrippingSpace", ppo->emptyNodeStrippingSpace);
+    g_key_file_set_boolean (kf, "pretty-printer", "forceEmptyNodeSplit", ppo->forceEmptyNodeSplit);
+    g_key_file_set_boolean (kf, "pretty-printer", "trimLeadingWhites", ppo->trimLeadingWhites);
+    g_key_file_set_boolean (kf, "pretty-printer", "trimTrailingWhites", ppo->trimTrailingWhites);
+    g_key_file_set_boolean (kf, "pretty-printer", "alignComment", ppo->alignComment);
+    g_key_file_set_boolean (kf, "pretty-printer", "alignText", ppo->alignText);
+    g_key_file_set_boolean (kf, "pretty-printer", "alignCdata", ppo->alignCdata);
+
+    contents = g_key_file_to_data (kf, size, error);
+    g_key_file_free (kf);
+    return contents;
+}
+
+static gboolean
+prefsFromData (PrettyPrintingOptions* ppo,
+               const gchar* contents,
+               gssize size,
+               GError** error)
+{
+    GKeyFile *kf;
+
+    g_return_val_if_fail (contents != NULL, FALSE);
+
+    kf = g_key_file_new ();
+
+    if (!g_key_file_load_from_data (kf, contents, size,
+             G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS,
+             error))
+    {
+        g_key_file_free (kf);
+        return FALSE;
+    }
+
+    if (g_key_file_has_key (kf, "pretty-printer", "newLineChars", NULL))
+    {
+        g_free ((gpointer)ppo->newLineChars);
+        ppo->newLineChars = g_key_file_get_string (kf, "pretty-printer", "newLineChars", error);
+    }
+    if (g_key_file_has_key (kf, "pretty-printer", "indentChar", NULL))
+    {
+        ppo->indentChar = (char)g_key_file_get_integer (kf, "pretty-printer", "indentChar", error);
+    }
+    if (g_key_file_has_key (kf, "pretty-printer", "indentLength", NULL))
+    {
+        ppo->indentLength = g_key_file_get_integer (kf, "pretty-printer", "indentLength", error);
+    }
+    if (g_key_file_has_key (kf, "pretty-printer", "oneLineText", NULL))
+    {
+        ppo->oneLineText = g_key_file_get_boolean (kf, "pretty-printer", "oneLineText", error);
+    }
+    if (g_key_file_has_key (kf, "pretty-printer", "inlineText", NULL))
+    {
+        ppo->inlineText = g_key_file_get_boolean (kf, "pretty-printer", "inlineText", error);
+    }
+    if (g_key_file_has_key (kf, "pretty-printer", "oneLineComment", NULL))
+    {
+        ppo->oneLineComment = g_key_file_get_boolean (kf, "pretty-printer", "oneLineComment", error);
+    }
+    if (g_key_file_has_key (kf, "pretty-printer", "inlineComment", NULL))
+    {
+        ppo->inlineComment = g_key_file_get_boolean (kf, "pretty-printer", "inlineComment", error);
+    }
+    if (g_key_file_has_key (kf, "pretty-printer", "oneLineCdata", NULL))
+    {
+        ppo->oneLineCdata = g_key_file_get_boolean (kf, "pretty-printer", "oneLineCdata", error);
+    }
+    if (g_key_file_has_key (kf, "pretty-printer", "inlineCdata", NULL))
+    {
+        ppo->inlineCdata = g_key_file_get_boolean (kf, "pretty-printer", "inlineCdata", error);
+    }
+    if (g_key_file_has_key (kf, "pretty-printer", "emptyNodeStripping", NULL))
+    {
+        ppo->emptyNodeStripping = g_key_file_get_boolean (kf, "pretty-printer", "emptyNodeStripping", error);
+    }
+    if (g_key_file_has_key (kf, "pretty-printer", "emptyNodeStrippingSpace", NULL))
+    {
+        ppo->emptyNodeStrippingSpace = g_key_file_get_boolean (kf, "pretty-printer", "emptyNodeStrippingSpace", error);
+    }
+    if (g_key_file_has_key (kf, "pretty-printer", "forceEmptyNodeSplit", NULL))
+    {
+        ppo->forceEmptyNodeSplit = g_key_file_get_boolean (kf, "pretty-printer", "forceEmptyNodeSplit", error);
+    }
+    if (g_key_file_has_key (kf, "pretty-printer", "trimLeadingWhites", NULL))
+    {
+        ppo->trimLeadingWhites = g_key_file_get_boolean (kf, "pretty-printer", "trimLeadingWhites", error);
+    }
+    if (g_key_file_has_key (kf, "pretty-printer", "trimTrailingWhites", NULL))
+    {
+        ppo->trimTrailingWhites = g_key_file_get_boolean (kf, "pretty-printer", "trimTrailingWhites", error);
+    }
+    if (g_key_file_has_key (kf, "pretty-printer", "alignComment", NULL))
+    {
+        ppo->alignComment = g_key_file_get_boolean (kf, "pretty-printer", "alignComment", error);
+    }
+    if (g_key_file_has_key (kf, "pretty-printer", "alignText", NULL))
+    {
+        ppo->alignText = g_key_file_get_boolean (kf, "pretty-printer", "alignText", error);
+    }
+    if (g_key_file_has_key (kf, "pretty-printer", "alignCdata", NULL))
+    {
+        ppo->alignCdata = g_key_file_get_boolean (kf, "pretty-printer", "alignCdata", error);
+    }
+
+    g_key_file_free (kf);
+    return TRUE;
+}
+
+gboolean
+prefsLoad (const gchar* filename,
+           GError** error)
+{
+    PrettyPrintingOptions* ppo;
+    gchar  *contents = NULL;
+    gsize   size = 0;
+
+    g_return_val_if_fail (filename != NULL, FALSE);
+
+    /* default printing options */
+    if (prettyPrintingOptions == NULL) { prettyPrintingOptions = createDefaultPrettyPrintingOptions(); }
+    ppo = prettyPrintingOptions;
+
+    if (!g_file_get_contents (filename, &contents, &size, error))
+        return FALSE;
+    if (!prefsFromData (ppo, contents, size, error))
+    {
+        g_free (contents);
+        return FALSE;
+    }
+    g_free (contents);
+    return TRUE;
+}
+
+gboolean
+prefsSave (const gchar* filename,
+           GError** error)
+{
+    PrettyPrintingOptions* ppo;
+    gchar *contents = NULL;
+    gsize size = 0;
+
+    g_return_val_if_fail (filename != NULL, FALSE);
+    ppo = prettyPrintingOptions;
+    fetchSettingsFromConfigUI (ppo);
+    contents = prefsToData (ppo, &size, error);
+    if (contents == NULL)
+        return FALSE;
+    if (! g_file_set_contents (filename, contents, size, error))
+    {
+        g_free (contents);
+        return FALSE;
+    }
+    g_free (contents);
+    return TRUE;
+}
+
+gchar *
+getDefaultPrefs (GError** error)
+{
+    gchar *contents = NULL;
+    gsize size = 0;
+    PrettyPrintingOptions* ppo;
+
+    ppo = createDefaultPrettyPrintingOptions();
+    g_return_val_if_fail (ppo != NULL, NULL);
+    contents = prefsToData (ppo, &size, error);
+    return contents;
 }
 
 /*============================================= PRIVATE FUNCTIONS =======================================*/


Modified: pretty-printer/src/ConfigUI.h
4 lines changed, 3 insertions(+), 1 deletions(-)
===================================================================
@@ -37,6 +37,8 @@ extern PrettyPrintingOptions* prettyPrintingOptions;
 /*========================================== FUNCTIONS ========================================================*/
 
 GtkWidget* createPrettyPrinterConfigUI(GtkDialog* dialog);
-void saveSettings(void);
+gboolean prefsLoad (const gchar* filename, GError** error);
+gboolean prefsSave (const gchar* filename, GError** error);
+gchar *getDefaultPrefs (GError** error);
 
 #endif


Modified: pretty-printer/src/PluginEntry.c
76 lines changed, 75 insertions(+), 1 deletions(-)
===================================================================
@@ -21,7 +21,12 @@
  *       http://www.geany.org/manual/reference/howto.html
  */
 
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
 #include "PluginEntry.h"
+#include <errno.h>
 
 
 GeanyPlugin*           geany_plugin;
@@ -49,10 +54,70 @@ static void config_closed(GtkWidget* configWidget, gint response, gpointer data)
 
 /*========================================== FUNCTIONS ===================================================================*/
 
+static gchar *
+get_config_file (void)
+{
+    gchar *dir;
+    gchar *fn;
+
+    dir = g_build_filename (geany_data->app->configdir, "plugins", "pretty-printer", NULL);
+    fn = g_build_filename (dir, "prefs.conf", NULL);
+
+    if (! g_file_test (fn, G_FILE_TEST_IS_DIR))
+    {
+        if (g_mkdir_with_parents (dir, 0755) != 0)
+        {
+            g_critical ("failed to create config dir '%s': %s", dir, g_strerror (errno));
+            g_free (dir);
+            g_free (fn);
+            return NULL;
+        }
+    }
+
+    g_free (dir);
+
+    if (! g_file_test (fn, G_FILE_TEST_EXISTS))
+    {
+        GError *error = NULL;
+        const gchar *def_config;
+
+        def_config = getDefaultPrefs(&error);
+        if (def_config == NULL)
+        {
+            g_critical ("failed to fetch default config data (%s)",
+                        error->message);
+            g_error_free (error);
+            g_free (fn);
+            return NULL;
+        }
+        if (!g_file_set_contents (fn, def_config, -1, &error))
+        {
+            g_critical ("failed to save default config to file '%s': %s",
+                        fn, error->message);
+            g_error_free (error);
+            g_free (fn);
+            return NULL;
+        }
+    }
+
+    return fn;
+}
+
 void plugin_init(GeanyData *data)
 {
+    gchar         *conf_file;
+    GError        *error = NULL;
     GeanyKeyGroup *key_group;
 
+    /* load preferences */
+    conf_file = get_config_file ();
+    if (!prefsLoad (conf_file, &error))
+    {
+        g_critical ("failed to load preferences file '%s': %s", conf_file, error->message);
+        g_error_free (error);
+    }
+    g_free (conf_file);
+
     /* initializes the libxml2 */
     LIBXML_TEST_VERSION
 
@@ -95,7 +160,16 @@ void config_closed(GtkWidget* configWidget, gint response, gpointer gdata)
     if (response == GTK_RESPONSE_OK ||
         response == GTK_RESPONSE_APPLY)
     {
-        saveSettings();
+        gchar* conf_file;
+        GError* error = NULL;
+
+        conf_file = get_config_file ();
+        if (! prefsSave (conf_file, &error))
+        {
+            g_critical ("failed to save preferences to file '%s': %s", conf_file, error->message);
+            g_error_free (error);
+        }
+        g_free (conf_file);
     }
 }
 


Modified: pretty-printer/src/PrettyPrinter.c
2 lines changed, 1 insertions(+), 1 deletions(-)
===================================================================
@@ -172,7 +172,7 @@ PrettyPrintingOptions* createDefaultPrettyPrintingOptions(void)
         return NULL;
     }
     
-    defaultOptions->newLineChars = "\r\n";
+    defaultOptions->newLineChars = g_strdup ("\r\n");
     defaultOptions->indentChar = ' ';
     defaultOptions->indentLength = 2;
     defaultOptions->oneLineText = FALSE;



--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).


More information about the Plugins-Commits mailing list