Skip to content

Commit

Permalink
Merge pull request #82 from frlan/Tableconvert_more_generic_rework
Browse files Browse the repository at this point in the history
Tableconvert more generic rework
  • Loading branch information
frlan committed Feb 1, 2013
2 parents 02387e7 + 904b07a commit e4e3875
Show file tree
Hide file tree
Showing 4 changed files with 138 additions and 118 deletions.
226 changes: 108 additions & 118 deletions tableconvert/src/tableconvert.c
@@ -1,7 +1,7 @@
/*
* tableconvert.c
*
* Copyright 2011-2012 Frank Lanitz <frank(at)frank(dot)uvena(dot)de>
* Copyright 2011-2013 Frank Lanitz <frank(at)frank(dot)uvena(dot)de>
*
* 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
Expand Down Expand Up @@ -41,150 +41,135 @@ enum
COUNT_KB
};

typedef struct {
const gchar *start;
const gchar *header_start;
const gchar *header_stop;
const gchar *body_start;
const gchar *body_end;
const gchar *columnsplit;
const gchar *linestart;
const gchar *lineend;
const gchar *linesplit;
const gchar *end;
} TableConvertRule;

enum {
TC_LATEX = 0,
TC_HTML,
TC_SQL
};

static GtkWidget *main_menu_item = NULL;
TableConvertRule tablerules[] = {
/* LaTeX */
{
"\\begin{table}[h]\n\\begin{tabular}{}\n",
"",
"",
"",
"",
" & ",
"\t",
"\\\\",
"\n",
"\\end{tabular}\n\\end{table}"
},
/* HTML */
{
"<table>\n",
"<thead>\n",
"</thead>\n",
"<tbody>\n",
"\n</tbody>",
"</td>\n\t<td>",
"<tr>\n\t<td>",
"</td>\n</tr>",
"\n",
"\n</table>"
},
/* SQL */
{
"",
"",
"",
"",
"",
",",
"\t(",
")",
",\n",
";"
}
};


static GString* convert_to_table_html(gchar **rows, gboolean header)
static GtkWidget *main_menu_item = NULL;

static gchar* convert_to_table_worker(gchar **rows, gboolean header,
const TableConvertRule *rule)
{
guint i;
guint j;
GString *replacement_str = NULL;

g_return_val_if_fail(rows != NULL, NULL);

/* Adding header to replacement */
replacement_str = g_string_new("<table>\n");
/* Adding start of table to replacement */
replacement_str = g_string_new(rule->start);

/* Adding <thead> if requested */
/* Adding special header if requested
* e.g. <thead> */
if (header == TRUE)
{
g_string_append(replacement_str, "<thead>\n");
g_string_append(replacement_str, rule->header_start);
}

/* Iteration onto rows and building up lines of table for
* replacement */
for (i = 0; rows[i] != NULL ; i++)
for (i = 0; rows[i] != NULL; i++)
{
gchar **columns = NULL;
columns = g_strsplit_set(rows[i], "\t", -1);

/* Adding <tbody> after first line if header and body
* is requested */
if (i == 1 &&
header == TRUE)
{
g_string_append(replacement_str, "<tbody>\n");
}

g_string_append(replacement_str, "\t<tr>\n");
for (j = 0; columns[j] != NULL; j++)
{
g_string_append(replacement_str, "\t\t<td>");
g_string_append(replacement_str, columns[j]);
g_string_append(replacement_str, "</td>\n");
}

g_string_append(replacement_str, "\t</tr>\n");

/* Adding closing </thead> after first row if header
* is requested */
if (i == 0 &&
header == TRUE)
{
g_string_append(replacement_str, "</thead>\n");
g_string_append(replacement_str, rule->header_stop);
/* We are assuming, that if someone inserts a head,
* only in this case we will insert some special body.
* Might needs to be discussed further */
g_string_append(replacement_str, rule->body_start);
}
g_free(columns);
}

/* Adding the footer of table */
/* Closing </tbody> if requested */
if (header == TRUE)
{
g_string_append(replacement_str, "</tbody>\n");
}

g_string_append(replacement_str, "</table>\n");
return replacement_str;
}

static GString* convert_to_table_latex(gchar** rows, gboolean header)
{
guint i;
guint j;
GString *replacement_str = NULL;

g_return_val_if_fail(rows != NULL, NULL);

/* Adding header to replacement */
replacement_str = g_string_new("\\begin{table}[h]\n\\begin{tabular}{}\n");

/* Iteration onto rows and building up lines of table for
* replacement */
for (i = 0; rows[i] != NULL ; i++)
{
gchar **columns = NULL;
columns = g_strsplit_set(rows[i], "\t", -1);
g_string_append(replacement_str, rule->linestart);

for (j = 0; columns[j] != NULL; j++)
{
if (j > 0)
{
g_string_append(replacement_str, " & ");
g_string_append(replacement_str, rule->columnsplit);
}
g_string_append(replacement_str, columns[j]);
}

g_string_append(replacement_str, "\\\\\n");

g_free(columns);
}
/* Adding the footer of table */

g_string_append(replacement_str, "\\end{tabular}\n\\end{table}");
return replacement_str;
}

static GString* convert_to_table_sql(gchar** rows)
{
guint i;
guint j;
GString *replacement_str = NULL;

g_return_val_if_fail(rows != NULL, NULL);

/* Adding start */
replacement_str = g_string_new("");

/* Iteration onto rows and building up lines for replacement */
for (i = 0; rows[i] != NULL ; i++)
{
gchar **columns = NULL;

g_string_append(replacement_str, "\t('");
columns = g_strsplit_set(rows[i], "\t", -1);

for (j = 0; columns[j] != NULL; j++)
{
if (j > 0)
{
g_string_append(replacement_str, "','");
}
g_string_append(replacement_str, columns[j]);
}
g_string_append(replacement_str, rule->lineend);

if (rows[i+1] != NULL)
{
g_string_append(replacement_str, "'),\n");
}
else
{
g_string_append(replacement_str, "')\n");
g_string_append(replacement_str, rule->linesplit);
}
g_strfreev(columns);
}

g_free(columns);
if (header == TRUE)
{
g_string_append(replacement_str, rule->body_end);
}
return replacement_str;

/* Adding the footer of table */
g_string_append(replacement_str, rule->end);

return g_string_free(replacement_str, FALSE);
}

static void convert_to_table(gboolean header)
Expand All @@ -198,7 +183,6 @@ static void convert_to_table(gboolean header)
{
gchar *selection = NULL;
gchar **rows = NULL;
GString *replacement_str = NULL;
gchar *replacement = NULL;

/* Actually grabbing selection and splitting it into single
Expand All @@ -214,57 +198,63 @@ static void convert_to_table(gboolean header)
{
case GEANY_FILETYPES_NONE:
{
g_free(rows);
g_free(replacement);
g_strfreev(rows);
return;
}
case GEANY_FILETYPES_HTML:
{
replacement_str = convert_to_table_html(rows, header);
replacement = convert_to_table_worker(rows,
header,
&tablerules[TC_HTML]);
break;
}
case GEANY_FILETYPES_LATEX:
{
replacement_str = convert_to_table_latex(rows, header);
replacement = convert_to_table_worker(rows,
header,
&tablerules[TC_LATEX]);
break;
}
case GEANY_FILETYPES_SQL:
{
replacement_str = convert_to_table_sql(rows);
replacement = convert_to_table_worker(rows,
header,
&tablerules[TC_SQL]);
break;
}
default:
{
replacement_str = NULL;
/* We just don't do anything */
}
} /* filetype switch */
}
else
{
/* OK. Something went not as expected.
* We did have a selection but cannot parse it into rows.
* Aborting */
* We did have a selection but cannot parse it into rows.
* Aborting */
g_warning(_("Something went wrong on parsing selection. Aborting"));
return;
}

/* The replacement should have been prepared at this point. Let's go
* on and put it into document and replace selection with it. */
if (replacement_str != NULL)
* on and put it into document and replace selection with it. */
if (replacement != NULL)
{
replacement = g_string_free(replacement_str, FALSE);
sci_replace_sel(doc->editor->sci, replacement);
}
g_free(rows);
g_strfreev(rows);
g_free(replacement);
}
/* in case of there was no selection we are just doing nothing */
return;
}


static void kb_convert_to_table(G_GNUC_UNUSED guint key_id)
{
g_return_if_fail(document_get_current() != NULL);

convert_to_table(TRUE);
}

Expand Down Expand Up @@ -292,7 +282,7 @@ void plugin_init(GeanyData *data)
gtk_container_add(GTK_CONTAINER(geany->main_widgets->tools_menu), main_menu_item);
ui_widget_set_tooltip_text(main_menu_item,
_("Converts current marked list to a table."));
g_signal_connect(G_OBJECT(main_menu_item), "activate", G_CALLBACK(convert_to_table), NULL);
g_signal_connect(G_OBJECT(main_menu_item), "activate", G_CALLBACK(cb_table_convert), NULL);
gtk_widget_show_all(main_menu_item);
ui_add_document_sensitive(main_menu_item);
}
Expand Down
10 changes: 10 additions & 0 deletions tableconvert/testfiles/test.html
@@ -0,0 +1,10 @@
aaaa bbbbb ccccc ddddd fffff
aaaa bbbbb ccccc ddddd fffff
aaaa bbbbb ccccc ddddd fffff
aaaa bbbbb ccccc ddddd fffff
aaaa bbbbb ccccc ddddd fffff
aaaa bbbbb ccccc ddddd fffff
aaaa bbbbb ccccc ddddd fffff
aaaa bbbbb ccccc ddddd fffff
aaaa bbbbb ccccc ddddd fffff
aaaa bbbbb ccccc ddddd fffff
10 changes: 10 additions & 0 deletions tableconvert/testfiles/test.sql
@@ -0,0 +1,10 @@
aaaa bbbbb ccccc ddddd fffff
aaaa bbbbb ccccc ddddd fffff
aaaa bbbbb ccccc ddddd fffff
aaaa bbbbb ccccc ddddd fffff
aaaa bbbbb ccccc ddddd fffff
aaaa bbbbb ccccc ddddd fffff
aaaa bbbbb ccccc ddddd fffff
aaaa bbbbb ccccc ddddd fffff
aaaa bbbbb ccccc ddddd fffff
aaaa bbbbb ccccc ddddd fffff
10 changes: 10 additions & 0 deletions tableconvert/testfiles/test.tex
@@ -0,0 +1,10 @@
aaaa bbbbb ccccc ddddd fffff
aaaa bbbbb ccccc ddddd fffff
aaaa bbbbb ccccc ddddd fffff
aaaa bbbbb ccccc ddddd fffff
aaaa bbbbb ccccc ddddd fffff
aaaa bbbbb ccccc ddddd fffff
aaaa bbbbb ccccc ddddd fffff
aaaa bbbbb ccccc ddddd fffff
aaaa bbbbb ccccc ddddd fffff
aaaa bbbbb ccccc ddddd fffff

0 comments on commit e4e3875

Please sign in to comment.