/* PSPP - a program for statistical analysis.
- Copyright (C) 1997-9, 2000, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
+ Copyright (C) 1997-9, 2000, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc.
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
#include "output/table-item.h"
#include "output/text-item.h"
-#include "error.h"
#include "xalloc.h"
#include "gettext.h"
struct html_driver
{
struct output_driver driver;
-
+#ifdef HAVE_CAIRO
+ struct xr_color fg;
+ struct xr_color bg;
+#endif
char *file_name;
char *chart_file_name;
static const struct output_driver_class html_driver_class;
-static void html_output_table (struct html_driver *, struct table_item *);
+static void html_output_table (struct html_driver *, const struct table *,
+ const char *caption);
static void escape_string (FILE *file,
const char *text, size_t length,
const char *space);
file_name));
html->file = NULL;
html->chart_cnt = 1;
-
+#ifdef HAVE_CAIRO
+ parse_color (d, o, "background-color", "#FFFFFFFFFFFF", &html->bg);
+ parse_color (d, o, "foreground-color", "#000000000000", &html->fg);
+#endif
html->file = fn_open (html->file_name, "w");
if (html->file == NULL)
{
- error (0, errno, _("error opening output file `%s'"), html->file_name);
+ msg_error (errno, _("error opening output file `%s'"), html->file_name);
goto error;
}
if (is_table_item (output_item))
{
struct table_item *table_item = to_table_item (output_item);
- html_output_table (html, table_item);
+ html_output_table (html, table_item_get_table (table_item),
+ table_item_get_caption (table_item));
}
#ifdef HAVE_CAIRO
else if (is_chart_item (output_item) && html->chart_file_name != NULL)
char *file_name;
file_name = xr_draw_png_chart (chart_item, html->chart_file_name,
- html->chart_cnt++);
+ html->chart_cnt++,
+ &html->fg,
+ &html->bg
+ );
if (file_name != NULL)
{
const char *title = chart_item_get_title (chart_item);
}
static void
-html_output_table (struct html_driver *html, struct table_item *item)
+html_output_table (struct html_driver *html,
+ const struct table *t, const char *caption)
{
- const struct table *t = table_item_get_table (item);
- const char *caption;
int x, y;
- fputs ("<TABLE>\n", html->file);
+ fputs ("<TABLE><TBODY VALIGN=\"TOP\">\n", html->file);
- caption = table_item_get_caption (item);
if (caption != NULL)
{
fputs (" <CAPTION>", html->file);
fputs (" <TR>\n", html->file);
for (x = 0; x < table_nc (t); x++)
{
+ const struct cell_contents *c;
struct table_cell cell;
const char *tag;
bool is_header;
int alignment, colspan, rowspan;
int top, left, right, bottom, n_borders;
- const char *s;
table_get_cell (t, x, y, &cell);
if (x != cell.d[TABLE_HORZ][0] || y != cell.d[TABLE_VERT][0])
tag = is_header ? "TH" : "TD";
fprintf (html->file, " <%s", tag);
- alignment = cell.options & TAB_ALIGNMENT;
+ alignment = (cell.n_contents > 0
+ ? cell.contents[0].options & TAB_ALIGNMENT
+ : TAB_LEFT);
if (alignment != TAB_LEFT)
fprintf (html->file, " ALIGN=\"%s\"",
alignment == TAB_RIGHT ? "RIGHT" : "CENTER");
if (top > TAL_GAP)
put_border (html->file, n_borders++, top, "top");
- if (y == table_nr (t) - 1)
+ if (y + rowspan == table_nr (t))
{
- bottom = table_get_rule (t, TABLE_VERT, x, y + 1);
+ bottom = table_get_rule (t, TABLE_VERT, x, y + rowspan);
if (bottom > TAL_GAP)
put_border (html->file, n_borders++, bottom, "bottom");
}
if (left > TAL_GAP)
put_border (html->file, n_borders++, left, "left");
- if (x == table_nc (t) - 1)
+ if (x + colspan == table_nc (t))
{
- right = table_get_rule (t, TABLE_HORZ, x + 1, y);
+ right = table_get_rule (t, TABLE_HORZ, x + colspan, y);
if (right > TAL_GAP)
put_border (html->file, n_borders++, right, "right");
}
putc ('>', html->file);
/* Output cell contents. */
- s = cell.contents;
- if (cell.options & TAB_EMPH)
- fputs ("<EM>", html->file);
- if (cell.options & TAB_FIX)
- {
- fputs ("<TT>", html->file);
- escape_string (html->file, s, strlen (s), " ");
- fputs ("</TT>", html->file);
- }
- else
+ for (c = cell.contents; c < &cell.contents[cell.n_contents]; c++)
{
- s += strspn (s, CC_SPACES);
- escape_string (html->file, s, strlen (s), " ");
+ if (c->text)
+ {
+ const char *s = c->text;
+
+ if (c->options & TAB_EMPH)
+ fputs ("<EM>", html->file);
+ if (c->options & TAB_FIX)
+ {
+ fputs ("<TT>", html->file);
+ escape_string (html->file, s, strlen (s), " ");
+ fputs ("</TT>", html->file);
+ }
+ else
+ {
+ s += strspn (s, CC_SPACES);
+ escape_string (html->file, s, strlen (s), " ");
+ }
+ if (c->options & TAB_EMPH)
+ fputs ("</EM>", html->file);
+ }
+ else
+ html_output_table (html, c->table, NULL);
}
- if (cell.options & TAB_EMPH)
- fputs ("</EM>", html->file);
/* Output </TH> or </TD>. */
fprintf (html->file, "</%s>\n", tag);
fputs (" </TR>\n", html->file);
}
- fputs ("</TABLE>\n\n", html->file);
+ fputs ("</TBODY></TABLE>\n\n", html->file);
}
struct output_driver_factory html_driver_factory =