SF.net SVN: geany-plugins:[2103] trunk/geany-plugins/pretty-printer/src
ctabin at users.sourceforge.net
ctabin at xxxxx
Fri Jul 22 09:57:55 UTC 2011
Revision: 2103
http://geany-plugins.svn.sourceforge.net/geany-plugins/?rev=2103&view=rev
Author: ctabin
Date: 2011-07-22 09:57:55 +0000 (Fri, 22 Jul 2011)
Log Message:
-----------
XML Pretty-Printer: Configuration panel added and new features for comments and text node formatting
Modified Paths:
--------------
trunk/geany-plugins/pretty-printer/src/ConfigUI.c
trunk/geany-plugins/pretty-printer/src/PluginEntry.c
trunk/geany-plugins/pretty-printer/src/PluginEntry.h
trunk/geany-plugins/pretty-printer/src/PrettyPrinter.c
trunk/geany-plugins/pretty-printer/src/PrettyPrinter.h
Modified: trunk/geany-plugins/pretty-printer/src/ConfigUI.c
===================================================================
--- trunk/geany-plugins/pretty-printer/src/ConfigUI.c 2011-06-26 22:03:46 UTC (rev 2102)
+++ trunk/geany-plugins/pretty-printer/src/ConfigUI.c 2011-07-22 09:57:55 UTC (rev 2103)
@@ -18,65 +18,203 @@
#include "ConfigUI.h"
-//redefine the variable declared as extern
+//======================= FUNCTIONS ====================================================================
+
+static GtkWidget* createTwoOptionsBox(const char* label, const char* checkBox1, const char* checkBox2, gboolean cb1Active, gboolean cb2Active, GtkWidget** option1, GtkWidget** option2);
+static GtkWidget* createEmptyTextOptions(gboolean emptyNodeStripping, gboolean emptyNodeStrippingSpace, gboolean forceEmptyNodeSplit);
+static GtkWidget* createIndentationOptions(char indentation, int count);
+static GtkWidget* createLineReturnOptions(const char* lineReturn);
+
+//============================================ PRIVATE PROPERTIES ======================================
+
+static GtkWidget* commentOneLine;
+static GtkWidget* commentInline;
+static GtkWidget* textOneLine;
+static GtkWidget* textInline;
+static GtkWidget* cdataOneLine;
+static GtkWidget* cdataInline;
+static GtkWidget* emptyNodeStripping;
+static GtkWidget* emptyNodeStrippingSpace;
+static GtkWidget* emptyNodeSplit;
+static GtkWidget* indentationChar;
+static GtkWidget* indentationCount;
+static GtkWidget* lineBreak;
+
+//============================================= PUBLIC FUNCTIONS ========================================
+
+//redeclaration of extern variable
PrettyPrintingOptions* prettyPrintingOptions;
-GtkWidget* createPrettyPrinterConfigUI(GtkDialog* dialog)
+//Will never be used, just here for example
+GtkWidget* createPrettyPrinterConfigUI(GtkDialog * dialog)
{
//default printing options
if (prettyPrintingOptions == NULL) { prettyPrintingOptions = createDefaultPrettyPrintingOptions(); }
+ PrettyPrintingOptions* ppo = prettyPrintingOptions;
+
+ GtkWidget* container = gtk_hbox_new(FALSE, 10);
- //TODO create configuration widget
+ GtkWidget* leftBox = gtk_vbox_new(TRUE, 6);
+ GtkWidget* commentOptions = createTwoOptionsBox("Comments", "Put on one line", "Inline if possible", ppo->oneLineComment, ppo->inlineComment, &commentOneLine, &commentInline);
+ GtkWidget* textOptions = createTwoOptionsBox("Text nodes", "Put on one line", "Inline if possible", ppo->oneLineText, ppo->inlineText, &textOneLine, &textInline);
+ GtkWidget* cdataOptions = createTwoOptionsBox("CDATA", "Put on one line", "Inline if possible", ppo->oneLineCdata, ppo->inlineCdata, &cdataOneLine, &cdataInline);
+ GtkWidget* emptyOptions = createEmptyTextOptions(ppo->emptyNodeStripping, ppo->emptyNodeStrippingSpace, ppo->forceEmptyNodeSplit);
+ GtkWidget* indentationOptions = createIndentationOptions(ppo->indentChar, ppo->indentLength);
+ GtkWidget* lineReturnOptions = createLineReturnOptions(ppo->newLineChars);
+
+ gtk_box_pack_start(GTK_BOX(leftBox), commentOptions, FALSE, FALSE, 3);
+ gtk_box_pack_start(GTK_BOX(leftBox), textOptions, FALSE, FALSE, 3);
+ gtk_box_pack_start(GTK_BOX(leftBox), cdataOptions, FALSE, FALSE, 3);
- return NULL;
+ GtkWidget* rightBox = gtk_vbox_new(FALSE, 6);
+ gtk_box_pack_start(GTK_BOX(rightBox), emptyOptions, FALSE, FALSE, 3);
+ gtk_box_pack_start(GTK_BOX(rightBox), indentationOptions, FALSE, FALSE, 3);
+ gtk_box_pack_start(GTK_BOX(rightBox), lineReturnOptions, FALSE, FALSE, 3);
+
+ gtk_box_pack_start(GTK_BOX(container), leftBox, FALSE, FALSE, 3);
+ gtk_box_pack_start(GTK_BOX(container), rightBox, FALSE, FALSE, 3);
+
+ gtk_widget_show_all(container);
+ return container;
}
void saveSettings()
{
- //TODO save settings into a file
+ PrettyPrintingOptions* ppo = prettyPrintingOptions;
+
+ ppo->oneLineComment = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(commentOneLine));
+ ppo->inlineComment = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(commentInline));
+ ppo->oneLineText = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(textOneLine));
+ ppo->inlineText = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(textInline));
+ ppo->oneLineCdata = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(cdataOneLine));
+ ppo->inlineCdata = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(cdataInline));
+
+ ppo->emptyNodeStripping = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(emptyNodeStripping));
+ ppo->emptyNodeStrippingSpace = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(emptyNodeStrippingSpace));
+ ppo->forceEmptyNodeSplit = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(emptyNodeSplit));
+
+ ppo->indentLength = gtk_spin_button_get_value(GTK_SPIN_BUTTON(indentationCount));
+ ppo->indentChar = gtk_combo_box_get_active(GTK_COMBO_BOX(indentationChar))==0 ? '\t' : ' ';
+
+ int 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";
}
+//============================================= PRIVATE FUNCTIONS =======================================
-//Will never be used, just here for example
-/*GtkWidget* plugin_configure(GtkDialog * dialog)
+GtkWidget* createTwoOptionsBox(const char* label, const char* checkBox1, const char* checkBox2, gboolean cb1Active, gboolean cb2Active, GtkWidget** option1, GtkWidget** option2)
{
- //default printing options
- if (prettyPrintingOptions == NULL) { prettyPrintingOptions = createDefaultPrettyPrintingOptions(); }
+ GtkWidget* container = gtk_hbox_new(TRUE, 2);
+ GtkWidget* rightBox = gtk_vbox_new(FALSE, 6);
+ GtkWidget* leftBox = gtk_vbox_new(FALSE, 6);
- GtkWidget* globalBox = gtk_hbox_new(TRUE, 4);
+ GtkWidget* lbl = gtk_label_new(label);
+ GtkWidget* chb1 = gtk_check_button_new_with_label(checkBox1);
+ GtkWidget* chb2 = gtk_check_button_new_with_label(checkBox2);
+
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(chb1), cb1Active);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(chb2), cb2Active);
+
+ gtk_box_pack_start(GTK_BOX(container), leftBox, FALSE, FALSE, 3);
+ gtk_box_pack_start(GTK_BOX(container), rightBox, FALSE, FALSE, 3);
+
+ gtk_box_pack_start(GTK_BOX(leftBox), lbl, FALSE, FALSE, 3);
+ gtk_box_pack_start(GTK_BOX(rightBox), chb1, FALSE, FALSE, 3);
+ gtk_box_pack_start(GTK_BOX(rightBox), chb2, FALSE, FALSE, 3);
+
+ *option1 = chb1;
+ *option2 = chb2;
+
+ return container;
+}
+
+GtkWidget* createEmptyTextOptions(gboolean optEmptyNodeStripping, gboolean optEmptyNodeStrippingSpace, gboolean optForceEmptyNodeSplit)
+{
+ GtkWidget* container = gtk_hbox_new(FALSE, 2);
GtkWidget* rightBox = gtk_vbox_new(FALSE, 6);
- GtkWidget* centerBox = gtk_vbox_new(FALSE, 6);
GtkWidget* leftBox = gtk_vbox_new(FALSE, 6);
- GtkWidget* textLabel = gtk_label_new("Text nodes");
- GtkWidget* textOneLine = gtk_check_button_new_with_label("One line");
- GtkWidget* textInline = gtk_check_button_new_with_label("Inline");
+ GtkWidget* lbl = gtk_label_new("Empty nodes");
+ GtkWidget* chb1 = gtk_check_button_new_with_label("Concatenation (<x></x> to <x/>)");
+ GtkWidget* chb2 = gtk_check_button_new_with_label("Spacing (<x/> to <x />)");
+ GtkWidget* chb3 = gtk_check_button_new_with_label("Expansion (<x/> to <x></x>)");
- GtkWidget* cdataLabel = gtk_label_new("CDATA nodes");
- GtkWidget* cdataOneLine = gtk_check_button_new_with_label("One line");
- GtkWidget* cdataInline = gtk_check_button_new_with_label("Inline");
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(chb1), optEmptyNodeStripping);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(chb2), optEmptyNodeStrippingSpace);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(chb3), optForceEmptyNodeSplit);
- GtkWidget* commentLabel = gtk_label_new("Comments");
- GtkWidget* commentOneLine = gtk_check_button_new_with_label("One line");
- GtkWidget* commentInline = gtk_check_button_new_with_label("Inline");
+ gtk_box_pack_start(GTK_BOX(container), leftBox, FALSE, FALSE, 3);
+ gtk_box_pack_start(GTK_BOX(container), rightBox, FALSE, FALSE, 3);
- gtk_box_pack_start(GTK_BOX(globalBox), leftBox, FALSE, FALSE, 3);
- gtk_box_pack_start(GTK_BOX(globalBox), centerBox, FALSE, FALSE, 3);
- gtk_box_pack_start(GTK_BOX(globalBox), rightBox, FALSE, FALSE, 3);
+ gtk_box_pack_start(GTK_BOX(leftBox), lbl, FALSE, FALSE, 3);
+ gtk_box_pack_start(GTK_BOX(rightBox), chb1, FALSE, FALSE, 3);
+ gtk_box_pack_start(GTK_BOX(rightBox), chb2, FALSE, FALSE, 3);
+ gtk_box_pack_start(GTK_BOX(rightBox), chb3, FALSE, FALSE, 3);
+
+ emptyNodeStripping = chb1;
+ emptyNodeStrippingSpace = chb2;
+ emptyNodeSplit = chb3;
+
+ return container;
+}
- gtk_box_pack_start(GTK_BOX(leftBox), textLabel, FALSE, FALSE, 3);
- gtk_box_pack_start(GTK_BOX(centerBox), textOneLine, FALSE, FALSE, 3);
- gtk_box_pack_start(GTK_BOX(rightBox), textInline, FALSE, FALSE, 3);
+GtkWidget* createIndentationOptions(char indentation, int count)
+{
+ GtkWidget* container = gtk_hbox_new(FALSE, 20);
+ GtkWidget* rightBox = gtk_hbox_new(FALSE, 6);
+ GtkWidget* leftBox = gtk_vbox_new(FALSE, 6);
+
+ GtkWidget* lbl = gtk_label_new("Indentation");
+ GtkWidget* comboChar = gtk_combo_box_text_new();
+ GtkWidget* spinIndent = gtk_spin_button_new_with_range(0, 100, 1);
+
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(comboChar), "Tab");
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(comboChar), "Space");
+ gtk_combo_box_set_active(GTK_COMBO_BOX(comboChar), (indentation == ' ') ? 1 : 0);
+
+ gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinIndent), count);
+
+ gtk_box_pack_start(GTK_BOX(leftBox), lbl, FALSE, FALSE, 3);
+ gtk_box_pack_start(GTK_BOX(rightBox), comboChar, FALSE, FALSE, 3);
+ gtk_box_pack_start(GTK_BOX(rightBox), spinIndent, FALSE, FALSE, 3);
+
+ gtk_box_pack_start(GTK_BOX(container), leftBox, FALSE, FALSE, 3);
+ gtk_box_pack_start(GTK_BOX(container), rightBox, FALSE, FALSE, 3);
+
+ indentationChar = comboChar;
+ indentationCount = spinIndent;
+
+ return container;
+}
- gtk_box_pack_start(GTK_BOX(leftBox), cdataLabel, FALSE, FALSE, 3);
- gtk_box_pack_start(GTK_BOX(centerBox), cdataOneLine, FALSE, FALSE, 3);
- gtk_box_pack_start(GTK_BOX(rightBox), cdataInline, FALSE, FALSE, 3);
+static GtkWidget* createLineReturnOptions(const char* lineReturn)
+{
+ GtkWidget* container = gtk_hbox_new(FALSE, 25);
+ GtkWidget* rightBox = gtk_hbox_new(FALSE, 6);
+ GtkWidget* leftBox = gtk_vbox_new(FALSE, 6);
- gtk_box_pack_start(GTK_BOX(leftBox), commentLabel, FALSE, FALSE, 3);
- gtk_box_pack_start(GTK_BOX(centerBox), commentOneLine, FALSE, FALSE, 3);
- gtk_box_pack_start(GTK_BOX(rightBox), commentInline, FALSE, FALSE, 3);
-
- gtk_widget_show_all(globalBox);
- return globalBox;
+ GtkWidget* lbl = gtk_label_new("Line break");
+ GtkWidget* comboChar = gtk_combo_box_text_new();
+
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(comboChar), "\\r");
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(comboChar), "\\n");
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(comboChar), "\\r\\n");
+
+ int active = 0;
+ if (strlen(lineReturn) == 2) active = 2;
+ else if (lineReturn[0] == '\n') active = 1;
+
+ gtk_combo_box_set_active(GTK_COMBO_BOX(comboChar), active);
+
+ gtk_box_pack_start(GTK_BOX(leftBox), lbl, FALSE, FALSE, 3);
+ gtk_box_pack_start(GTK_BOX(rightBox), comboChar, FALSE, FALSE, 3);
+
+ gtk_box_pack_start(GTK_BOX(container), leftBox, FALSE, FALSE, 3);
+ gtk_box_pack_start(GTK_BOX(container), rightBox, FALSE, FALSE, 3);
+
+ lineBreak = comboChar;
+
+ return container;
}
-*/
Modified: trunk/geany-plugins/pretty-printer/src/PluginEntry.c
===================================================================
--- trunk/geany-plugins/pretty-printer/src/PluginEntry.c 2011-06-26 22:03:46 UTC (rev 2102)
+++ trunk/geany-plugins/pretty-printer/src/PluginEntry.c 2011-07-22 09:57:55 UTC (rev 2103)
@@ -41,8 +41,11 @@
//declaration of the functions
static void xml_format(GtkMenuItem *menuitem, gpointer gdata);
static void kb_run_xml_pretty_print(G_GNUC_UNUSED guint key_id);
+static void config_closed(GtkWidget* configWidget, gint response, gpointer data);
+
void plugin_init(GeanyData *data);
void plugin_cleanup(void);
+GtkWidget* plugin_configure(GtkDialog * dialog);
//========================================== FUNCTIONS ===================================================================
@@ -73,29 +76,25 @@
gtk_widget_destroy(main_menu_item);
}
-#ifdef PLUGIN_XMLPP_GUI
- static void config_closed(GtkWidget* configWidget, gint response, gpointer data);
+GtkWidget* plugin_configure(GtkDialog * dialog)
+{
+ //creates the configuration widget
+ GtkWidget* widget = createPrettyPrinterConfigUI(dialog);
+ g_signal_connect(dialog, "response", G_CALLBACK(config_closed), NULL);
+ return widget;
+}
- GtkWidget* plugin_configure(GtkDialog * dialog)
- {
- //creates the configuration widget
- GtkWidget* widget = createPrettyPrinterConfigUI(dialog);
- g_signal_connect(dialog, "response", G_CALLBACK(config_closed), NULL);
- return widget;
- }
-
//========================================== LISTENERS ===================================================================
- void config_closed(GtkWidget* configWidget, gint response, gpointer gdata)
+void config_closed(GtkWidget* configWidget, gint response, gpointer gdata)
+{
+ //if the user clicked OK or APPLY, then save the settings
+ if (response == GTK_RESPONSE_OK ||
+ response == GTK_RESPONSE_APPLY)
{
- //if the user clicked OK or APPLY, then save the settings
- if (response == GTK_RESPONSE_OK ||
- response == GTK_RESPONSE_APPLY)
- {
- saveSettings();
- }
+ saveSettings();
}
-#endif
+}
static void kb_run_xml_pretty_print(G_GNUC_UNUSED guint key_id)
{
@@ -124,15 +123,18 @@
sci_get_text(sco, length, buffer);
//checks if the data is an XML format
- xmlDoc* xmlDoc = xmlParseDoc((unsigned char*)buffer);
+ xmlDoc* parsedDocument = xmlParseDoc((unsigned char*)buffer);
//this is not a valid xml => exit with an error message
- if(xmlDoc == NULL)
+ if(parsedDocument == NULL)
{
dialogs_show_msgbox(GTK_MESSAGE_ERROR, "Unable to parse the content as XML.");
return;
}
+ //free all
+ xmlFreeDoc(parsedDocument);
+
//process pretty-printing
int result = processXMLPrettyPrinting(&buffer, &length, prettyPrintingOptions);
if (result != PRETTY_PRINTING_SUCCESS)
@@ -151,7 +153,4 @@
//sets the type
GeanyFiletype* fileType = filetypes_index(GEANY_FILETYPES_XML);
document_set_filetype(doc, fileType);
-
- //free all
- xmlFreeDoc(xmlDoc);
}
Modified: trunk/geany-plugins/pretty-printer/src/PluginEntry.h
===================================================================
--- trunk/geany-plugins/pretty-printer/src/PluginEntry.h 2011-06-26 22:03:46 UTC (rev 2102)
+++ trunk/geany-plugins/pretty-printer/src/PluginEntry.h 2011-07-22 09:57:55 UTC (rev 2103)
@@ -19,9 +19,6 @@
#ifndef PLUGIN_ENTRY_H
#define PLUGIN_ENTRY_H
-// This constants will be enabled once the preferences GUI will be finished :)
-//#define PLUGIN_XMLPP_GUI
-
//========================================== INCLUDES ==========================================================
#include <stdlib.h>
Modified: trunk/geany-plugins/pretty-printer/src/PrettyPrinter.c
===================================================================
--- trunk/geany-plugins/pretty-printer/src/PrettyPrinter.c 2011-06-26 22:03:46 UTC (rev 2102)
+++ trunk/geany-plugins/pretty-printer/src/PrettyPrinter.c 2011-07-22 09:57:55 UTC (rev 2103)
@@ -24,7 +24,7 @@
static void putCharInBuffer(char charToAdd); //put a char into the new char buffer
static void putCharsInBuffer(char* charsToAdd); //put the chars into the new char buffer
static void putNextCharsInBuffer(int nbChars); //put the next nbChars of the input buffer into the new buffer
-static int readWhites(); //read the next whites into the input buffer
+static int readWhites(gboolean considerLineBreakAsWhite); //read the next whites into the input buffer
static char readNextChar(); //read the next char into the input buffer;
static char getNextChar(); //returns the next char but do not increase the input buffer index (use readNextChar for that)
static char getPreviousInsertedChar(); //returns the last inserted char into the new buffer
@@ -33,6 +33,7 @@
static gboolean isQuote(char c); //check if the specified char is a quote (simple or double)
static int putNewLine(); //put a new line into the new char buffer with the correct number of whites (indentation)
static gboolean isInlineNodeAllowed(); //check if it is possible to have an inline node
+static gboolean isOnSingleLine(int skip, char stop1, char stop2);//check if the current node data is on one line (for inlining)
static void resetBackwardIndentation(gboolean resetLineBreak); //reset the indentation for the current depth (just reset the index in fact)
//specific parsing functions
@@ -98,7 +99,7 @@
if (xmlPrettyPrinted == NULL) { g_error("Allocation error"); }
//go to the first char
- readWhites();
+ readWhites(TRUE);
//process the pretty-printing
processElements();
@@ -148,17 +149,18 @@
options->newLineChars = "\r\n";
options->indentChar = ' ';
options->indentLength = 2;
- options->oneLineText = TRUE;
+ options->oneLineText = FALSE;
options->inlineText = TRUE;
- options->oneLineComment = TRUE;
+ options->oneLineComment = FALSE;
options->inlineComment = TRUE;
- options->oneLineCdata = TRUE;
+ options->oneLineCdata = FALSE;
options->inlineCdata = TRUE;
options->emptyNodeStripping = TRUE;
options->emptyNodeStrippingSpace = TRUE;
options->forceEmptyNodeSplit = FALSE;
options->trimLeadingWhites = TRUE;
options->trimTrailingWhites = TRUE;
+ options->commentAlign = TRUE;
return options;
}
@@ -227,10 +229,12 @@
return inputBuffer[inputBufferIndex++];
}
-int readWhites()
+int readWhites(gboolean considerLineBreakAsWhite)
{
int counter = 0;
- while(isWhite(inputBuffer[inputBufferIndex]))
+ while(isWhite(inputBuffer[inputBufferIndex]) &&
+ (!isLineBreak(inputBuffer[inputBufferIndex]) ||
+ considerLineBreakAsWhite))
{
++counter;
++inputBufferIndex;
@@ -327,6 +331,48 @@
return FALSE;
}
+gboolean isOnSingleLine(int skip, char stop1, char stop2)
+{
+ int currentIndex = inputBufferIndex+skip; //skip the n first chars (in comment <!--)
+ gboolean isOnSingleLine = TRUE;
+
+ char oldChar = inputBuffer[currentIndex];
+ char currentChar = inputBuffer[currentIndex+1];
+ while(isOnSingleLine && oldChar != stop1 && currentChar != stop2)
+ {
+ isOnSingleLine = !isLineBreak(oldChar);
+
+ ++currentIndex;
+ oldChar = currentChar;
+ currentChar = inputBuffer[currentIndex+1];
+
+ /**
+ * A line break inside the node has been reached. But we should check
+ * if there is something before the end of the node (otherwise, there
+ * are only spaces and it may be wanted to be considered as a single
+ * line). //TODO externalize an option for that ?
+ */
+ if (!isOnSingleLine)
+ {
+ while(oldChar != stop1 && currentChar != stop2)
+ {
+ //okay there is something else => this is not on one line
+ if (!isWhite(oldChar)) return FALSE;
+
+ ++currentIndex;
+ oldChar = currentChar;
+ currentChar = inputBuffer[currentIndex+1];
+ }
+
+ //the end of the node has been reached with only whites. Then
+ //the node can be considered being one single line
+ return TRUE;
+ }
+ }
+
+ return isOnSingleLine;
+}
+
void resetBackwardIndentation(gboolean resetLineBreak)
{
xmlPrettyPrintedIndex -= (currentDepth*options->indentLength);
@@ -355,7 +401,7 @@
while (loop && result == PRETTY_PRINTING_SUCCESS)
{
//strip unused whites
- readWhites();
+ readWhites(TRUE);
char nextChar = getNextChar();
if (nextChar == '\0') { return 0; } //no more data to read
@@ -459,7 +505,7 @@
gboolean loop = TRUE;
while (loop)
{
- readWhites(); //strip the whites
+ readWhites(TRUE); //strip the whites
char next = getNextChar(); //don't read the last char (processed afterwards)
if (next == '/') { loop = FALSE; } /* end of node */
@@ -492,7 +538,7 @@
while(!isWhite(getNextChar())) { putNextCharsInBuffer(1); }
- readWhites();
+ readWhites(TRUE);
processElementAttributes();
//puts the '?' and '>' chars into the new buffer
@@ -537,7 +583,7 @@
lastNodeOpen = TRUE;
//process the attributes
- readWhites();
+ readWhites(TRUE);
processElementAttributes();
//process the end of the tag
@@ -642,6 +688,7 @@
{
gboolean inlineAllowed = FALSE;
if (options->inlineComment) { inlineAllowed = isInlineNodeAllowed(); }
+ if (inlineAllowed && !options->oneLineComment) { inlineAllowed = isOnSingleLine(4, '-', '-'); }
if (inlineAllowed) { resetBackwardIndentation(TRUE); }
putNextCharsInBuffer(4); //add the chars '<!--'
@@ -660,18 +707,45 @@
{
putCharInBuffer(nextChar);
oldChar = nextChar;
+
+ if (!loop && options->commentAlign) //end of comment
+ {
+ //ensures the chars preceding the first '-' are all spaces
+ gboolean rewind = xmlPrettyPrinted[xmlPrettyPrintedIndex-3] == ' ' &&
+ xmlPrettyPrinted[xmlPrettyPrintedIndex-4] == ' ' &&
+ xmlPrettyPrinted[xmlPrettyPrintedIndex-5] == ' ' &&
+ xmlPrettyPrinted[xmlPrettyPrintedIndex-6] == ' ' &&
+ xmlPrettyPrinted[xmlPrettyPrintedIndex-7] == ' ';
+
+ //if all the preceding chars are white, then go for replacement
+ if (rewind)
+ {
+ xmlPrettyPrintedIndex -= 7; //remove indentation spaces
+ putCharsInBuffer("--"); //reset the first chars of '-->'
+ }
+ }
}
- else if (!options->oneLineComment) //oh ! there is a line break
+ else if (!options->oneLineComment && !inlineAllowed) //oh ! there is a line break
{
- readWhites(); //strip the whites and new line
- putNewLine(); //put a new indentation line
+ int read = readWhites(FALSE); //strip the whites and new line
+ if (nextChar == '\r' && read == 0 && getNextChar() == '\n') //handles the \r\n return line
+ {
+ readNextChar();
+ readWhites(FALSE);
+ }
+
+ //if the comments need to be aligned, just add 5 spaces
+ if (options->commentAlign)
+ {
+ putNewLine(); //put a new indentation line
+ putCharsInBuffer(" ");
+ }
+
oldChar = ' '; //and update the last char
-
- //TODO manage relative spacing
}
else //the comments must be inlined
{
- readWhites(); //strip the whites and add a space if needed
+ readWhites(TRUE); //strip the whites and add a space if needed
if (getPreviousInsertedChar() != ' ')
{
putCharInBuffer(' ');
@@ -699,6 +773,7 @@
//checks if inline is allowed
gboolean inlineTextAllowed = FALSE;
if (options->inlineText) { inlineTextAllowed = isInlineNodeAllowed(); }
+ if (inlineTextAllowed && !options->oneLineText) { inlineTextAllowed = isOnSingleLine(0, '<', '/'); }
if (inlineTextAllowed) { resetBackwardIndentation(TRUE); } //remove previous indentation
//the leading whites are automatically stripped. So we re-add it
@@ -730,9 +805,10 @@
char nextChar = readNextChar();
if (isLineBreak(nextChar))
{
- readWhites();
if (options->oneLineText)
{
+ readWhites(TRUE);
+
//as we can put text on one line, remove the line break
//and replace it by a space but only if the previous
//char wasn't a space
@@ -743,6 +819,13 @@
}
else
{
+ int read = readWhites(FALSE);
+ if (nextChar == '\r' && read == 0 && getNextChar() == '\n') //handles the '\r\n'
+ {
+ nextChar = readNextChar();
+ readWhites(FALSE);
+ }
+
//put a new line only if the closing tag is not reached
if (getNextChar() != '<')
{
@@ -796,7 +879,7 @@
}
else if (!options->oneLineCdata)
{
- readWhites(); //strip the whites and new line
+ readWhites(TRUE); //strip the whites and new line
putNewLine(); //put a new indentation line
oldChar = ' '; //and update the last char
@@ -804,7 +887,7 @@
}
else //cdata are inlined
{
- readWhites(); //strip the whites and add a space if necessary
+ readWhites(TRUE); //strip the whites and add a space if necessary
if(getPreviousInsertedChar() != ' ') { putCharInBuffer(' '); }
}
}
@@ -832,7 +915,7 @@
gboolean loop = TRUE;
while(loop)
{
- readWhites();
+ readWhites(TRUE);
putCharInBuffer(' '); //only one space for the attributes
int nextChar = readNextChar();
@@ -892,7 +975,7 @@
result = PRETTY_PRINTING_NOT_SUPPORTED_YET;
}
-void printError(char *msg, ...)
+void printError(char *msg, ...)
{
va_list va;
va_start(va, msg);
@@ -902,7 +985,7 @@
//TODO also do a fprintf on stderr ?
printDebugStatus();
-}
+}
void printDebugStatus()
{
Modified: trunk/geany-plugins/pretty-printer/src/PrettyPrinter.h
===================================================================
--- trunk/geany-plugins/pretty-printer/src/PrettyPrinter.h 2011-06-26 22:03:46 UTC (rev 2102)
+++ trunk/geany-plugins/pretty-printer/src/PrettyPrinter.h 2011-07-22 09:57:55 UTC (rev 2103)
@@ -57,7 +57,8 @@
gboolean forceEmptyNodeSplit; //force an empty node to be splitted : <node /> becomes <node></node> (only if emptyNodeStripping = false)
gboolean trimLeadingWhites; //trim the leading whites in a text node
gboolean trimTrailingWhites; //trim the trailing whites in a text node
-}
+ gboolean commentAlign; //align the comments: add 5 spaces in indentation (only if oneLineComment = false)
+}
PrettyPrintingOptions;
//========================================== FUNCTIONS =========================================================
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Plugins-Commits
mailing list