X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Foutput%2Fhtml.c;h=e8416756cb910f7c23a44081809b43c65dbcca92;hb=345fd1347379bc41ac11b4a0401f70698d22d6f8;hp=3f9c177bc5480bbf25f1f7c3dbc009a0d2c9cdab;hpb=0b344a9c8cf1300fabdaba1c2e59bfd4dd670db2;p=pspp diff --git a/src/output/html.c b/src/output/html.c index 3f9c177bc5..e8416756cb 100644 --- a/src/output/html.c +++ b/src/output/html.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 1997-9, 2000, 2009 Free Software Foundation, Inc. + Copyright (C) 1997-9, 2000, 2009, 2010, 2011, 2012 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 @@ -23,21 +23,22 @@ #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "error.h" +#include "data/file-name.h" +#include "libpspp/assertion.h" +#include "libpspp/cast.h" +#include "libpspp/compiler.h" +#include "libpspp/message.h" +#include "libpspp/version.h" +#include "output/cairo.h" +#include "output/chart-item.h" +#include "output/driver-provider.h" +#include "output/message-item.h" +#include "output/options.h" +#include "output/output-item-provider.h" +#include "output/table-provider.h" +#include "output/table-item.h" +#include "output/text-item.h" + #include "xalloc.h" #include "gettext.h" @@ -46,17 +47,22 @@ 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; + char *command_name; FILE *file; size_t chart_cnt; - bool in_syntax; + bool css; + bool borders; }; -const struct output_driver_class html_class; +static const struct output_driver_class html_driver_class; static void html_output_table (struct html_driver *, struct table_item *); static void escape_string (FILE *file, @@ -68,7 +74,7 @@ static void print_title_tag (FILE *file, const char *name, static struct html_driver * html_driver_cast (struct output_driver *driver) { - assert (driver->class == &html_class); + assert (driver->class == &html_driver_class); return UP_CAST (driver, struct html_driver, driver); } @@ -80,7 +86,7 @@ opt (struct output_driver *d, struct string_map *options, const char *key, } static struct output_driver * -html_create (const char *name, enum output_device_type device_type, +html_create (const char *file_name, enum settings_output_devices device_type, struct string_map *o) { struct output_driver *d; @@ -88,17 +94,24 @@ html_create (const char *name, enum output_device_type device_type, html = xzalloc (sizeof *html); d = &html->driver; - output_driver_init (&html->driver, &html_class, name, device_type); - html->file_name = parse_string (opt (d, o, "output-file", "pspp.html")); - html->chart_file_name = parse_chart_file_name (opt (d, o, "chart-files", - "pspp-#.png")); + output_driver_init (&html->driver, &html_driver_class, file_name, + device_type); + html->css = parse_boolean (opt (d, o, "css", "true")); + html->borders = parse_boolean (opt (d, o, "borders", "true")); + + html->file_name = xstrdup (file_name); + html->chart_file_name = parse_chart_file_name (opt (d, o, "charts", + 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, _("opening HTML output file: %s"), html->file_name); + msg_error (errno, _("error opening output file `%s'"), html->file_name); goto error; } @@ -108,62 +121,66 @@ html_create (const char *name, enum output_device_type device_type, fputs ("\n", html->file); print_title_tag (html->file, "TITLE", _("PSPP Output")); fprintf (html->file, "\n", version); - fputs ("\n", - html->file); fputs ("\n", html->file); - fputs ("\n", - html->file); + "CONTENT=\"text/html; charset=utf-8\">\n", html->file); + + if ( html->css) + { + fputs ("\n", + html->file); + fputs ("\n", + html->file); + } fputs ("\n", html->file); fputs ("file); fputs (" LINK=\"#1f00ff\" ALINK=\"#ff0000\" VLINK=\"#9900dd\">\n", html->file); @@ -195,11 +212,6 @@ html_destroy (struct output_driver *driver) if (html->file != NULL) { - if (html->in_syntax) - { - fprintf (html->file, "\n"); - html->in_syntax = false; - } fprintf (html->file, "\n" "\n" @@ -208,46 +220,43 @@ html_destroy (struct output_driver *driver) } free (html->chart_file_name); free (html->file_name); + free (html->command_name); free (html); } -static bool -is_syntax_item (const struct output_item *item) -{ - return (is_text_item (item) - && text_item_get_type (to_text_item (item)) == TEXT_ITEM_SYNTAX); -} - static void html_submit (struct output_driver *driver, const struct output_item *output_item) { struct html_driver *html = html_driver_cast (driver); - if (html->in_syntax && !is_syntax_item (output_item)) - { - fprintf (html->file, "\n"); - html->in_syntax = false; - } + output_driver_track_current_command (output_item, &html->command_name); if (is_table_item (output_item)) { struct table_item *table_item = to_table_item (output_item); html_output_table (html, table_item); } +#ifdef HAVE_CAIRO else if (is_chart_item (output_item) && html->chart_file_name != NULL) { struct chart_item *chart_item = to_chart_item (output_item); 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) { - fprintf (html->file, "", file_name); + const char *title = chart_item_get_title (chart_item); + fprintf (html->file, "\"Chart:", + file_name, title ? title : _("No description")); free (file_name); } } +#endif /* HAVE_CAIRO */ else if (is_text_item (output_item)) { struct text_item *text_item = to_text_item (output_item); @@ -279,14 +288,9 @@ html_submit (struct output_driver *driver, break; case TEXT_ITEM_SYNTAX: - if (!html->in_syntax) - { - fprintf (html->file, "
");
-              html->in_syntax = true;
-            }
-          else
-            putc ('\n', html->file);
+          fprintf (html->file, "
");
           escape_string (html->file, s, strlen (s), " ");
+          fprintf (html->file, "
\n"); break; case TEXT_ITEM_PARAGRAPH: @@ -311,6 +315,14 @@ html_submit (struct output_driver *driver, break; } } + else if (is_message_item (output_item)) + { + const struct message_item *message_item = to_message_item (output_item); + const struct msg *msg = message_item_get_msg (message_item); + char *s = msg_to_string (msg, html->command_name); + print_title_tag (html->file, "P", s); + free (s); + } } /* Write LENGTH characters in TEXT to file F, escaping characters @@ -400,44 +412,47 @@ html_output_table (struct html_driver *html, struct table_item *item) alignment = cell.options & TAB_ALIGNMENT; if (alignment != TAB_LEFT) - fprintf (html->file, " ALIGN=%s", + fprintf (html->file, " ALIGN=\"%s\"", alignment == TAB_RIGHT ? "RIGHT" : "CENTER"); colspan = table_cell_colspan (&cell); if (colspan > 1) - fprintf (html->file, " COLSPAN=%d", colspan); + fprintf (html->file, " COLSPAN=\"%d\"", colspan); rowspan = table_cell_rowspan (&cell); if (rowspan > 1) - fprintf (html->file, " ROWSPAN=%d", rowspan); + fprintf (html->file, " ROWSPAN=\"%d\"", rowspan); - /* Cell borders. */ - n_borders = 0; + if (html->borders) + { + /* Cell borders. */ + n_borders = 0; - top = table_get_rule (t, TABLE_VERT, x, y); - if (top > TAL_GAP) - put_border (html->file, n_borders++, top, "top"); - - if (y == table_nr (t) - 1) - { - bottom = table_get_rule (t, TABLE_VERT, x, y + 1); - if (bottom > TAL_GAP) - put_border (html->file, n_borders++, bottom, "bottom"); - } - - left = table_get_rule (t, TABLE_HORZ, x, y); - if (left > TAL_GAP) - put_border (html->file, n_borders++, left, "left"); - - if (x == table_nc (t) - 1) - { - right = table_get_rule (t, TABLE_HORZ, x + 1, y); - if (right > TAL_GAP) - put_border (html->file, n_borders++, right, "right"); - } - - if (n_borders > 0) - fputs ("\"", html->file); + top = table_get_rule (t, TABLE_VERT, x, y); + if (top > TAL_GAP) + put_border (html->file, n_borders++, top, "top"); + + if (y == table_nr (t) - 1) + { + bottom = table_get_rule (t, TABLE_VERT, x, y + 1); + if (bottom > TAL_GAP) + put_border (html->file, n_borders++, bottom, "bottom"); + } + + left = table_get_rule (t, TABLE_HORZ, x, y); + if (left > TAL_GAP) + put_border (html->file, n_borders++, left, "left"); + + if (x == table_nc (t) - 1) + { + right = table_get_rule (t, TABLE_HORZ, x + 1, y); + if (right > TAL_GAP) + put_border (html->file, n_borders++, right, "right"); + } + + if (n_borders > 0) + fputs ("\"", html->file); + } putc ('>', html->file); @@ -470,10 +485,12 @@ html_output_table (struct html_driver *html, struct table_item *item) fputs ("\n\n", html->file); } -const struct output_driver_class html_class = +struct output_driver_factory html_driver_factory = + { "html", "pspp.html", html_create }; + +static const struct output_driver_class html_driver_class = { "html", - html_create, html_destroy, html_submit, NULL,