treewide: Replace <name>_cnt by n_<name>s and <name>_cap by allocated_<name>.
[pspp] / src / output / html.c
index dcff0af085bcfe4e5feed0e843923c16b68c922a..a2e63f943888169a1e30458f6b7d0b100bc6e102 100644 (file)
@@ -61,7 +61,7 @@ struct html_driver
     char *chart_file_name;
 
     FILE *file;
-    size_t chart_cnt;
+    size_t n_charts;
 
     bool bare;
     bool css;
@@ -180,9 +180,7 @@ html_create (struct file_handle *fh, enum settings_output_devices device_type,
              struct string_map *o)
 {
   struct output_driver *d;
-  struct html_driver *html;
-
-  html = xzalloc (sizeof *html);
+  struct html_driver *html = XZALLOC (struct html_driver);
   d = &html->driver;
   output_driver_init (&html->driver, &html_driver_class, fh_get_file_name (fh),
                       device_type);
@@ -194,7 +192,7 @@ html_create (struct file_handle *fh, enum settings_output_devices device_type,
   html->chart_file_name = parse_chart_file_name (opt (d, o, "charts",
                                                       fh_get_file_name (fh)));
   html->file = NULL;
-  html->chart_cnt = 1;
+  html->n_charts = 1;
   html->bg = parse_color (opt (d, o, "background-color", "#FFFFFFFFFFFF"));
   html->fg = parse_color (opt (d, o, "foreground-color", "#000000000000"));
   html->file = fn_open (html->handle, "w");
@@ -247,7 +245,8 @@ html_destroy (struct output_driver *driver)
 }
 
 static void
-html_submit (struct output_driver *driver, const struct output_item *item)
+html_submit__ (struct output_driver *driver, const struct output_item *item,
+               int level)
 {
   struct html_driver *html = html_driver_cast (driver);
 
@@ -258,7 +257,7 @@ html_submit (struct output_driver *driver, const struct output_item *item)
         {
           char *file_name = xr_draw_png_chart (item->chart,
                                                html->chart_file_name,
-                                               html->chart_cnt++,
+                                               html->n_charts++,
                                                &html->fg, &html->bg);
           if (file_name != NULL)
             {
@@ -270,17 +269,16 @@ html_submit (struct output_driver *driver, const struct output_item *item)
         }
       break;
 
-    case OUTPUT_ITEM_GROUP_OPEN:
-      break;
-
-    case OUTPUT_ITEM_GROUP_CLOSE:
+    case OUTPUT_ITEM_GROUP:
+      for (size_t i = 0; i < item->group.n_children; i++)
+        html_submit__ (driver, item->group.children[i], level + 1);
       break;
 
     case OUTPUT_ITEM_IMAGE:
       if (html->chart_file_name)
         {
           char *file_name = xr_write_png_image (
-            item->image, html->chart_file_name, ++html->chart_cnt);
+            item->image, html->chart_file_name, ++html->n_charts);
           if (file_name != NULL)
             {
               fprintf (html->file, "<img src=\"%s\">", file_name);
@@ -302,9 +300,6 @@ html_submit (struct output_driver *driver, const struct output_item *item)
     case OUTPUT_ITEM_PAGE_BREAK:
       break;
 
-    case OUTPUT_ITEM_PAGE_SETUP:
-      break;
-
     case OUTPUT_ITEM_TABLE:
       html_output_table (html, item);
       break;
@@ -320,8 +315,7 @@ html_submit (struct output_driver *driver, const struct output_item *item)
 
           case TEXT_ITEM_TITLE:
             {
-              int level = MIN (5, output_get_group_level ()) + 1;
-              char tag[3] = { 'H', level + '1', '\0' };
+              char tag[3] = { 'H', MIN (5, level) + '0', '\0' };
               print_title_tag (html->file, tag, s);
             }
             break;
@@ -345,6 +339,12 @@ html_submit (struct output_driver *driver, const struct output_item *item)
     }
 }
 
+static void
+html_submit (struct output_driver *driver, const struct output_item *item)
+{
+  html_submit__ (driver, item, 1);
+}
+
 /* Write TEXT to file F, escaping characters as necessary for HTML.  Spaces are
    replaced by SPACE, which should be " " or "&nbsp;" New-lines are replaced by
    NEWLINE, which might be "<BR>" or "\n" or something else appropriate. */
@@ -585,26 +585,26 @@ html_put_table_cell (struct html_driver *html, const struct pivot_table *pt,
   escape_string (html->file, s, " ", "<br>");
   ds_destroy (&body);
 
-  if (cell->value->n_subscripts)
+  const struct pivot_value_ex *ex = pivot_value_ex (cell->value);
+  if (ex->n_subscripts)
     {
       fputs ("<sub>", html->file);
-      for (size_t i = 0; i < cell->value->n_subscripts; i++)
+      for (size_t i = 0; i < ex->n_subscripts; i++)
         {
           if (i)
             putc (',', html->file);
-          escape_string (html->file, cell->value->subscripts[i],
-                         "&nbsp;", "<br>");
+          escape_string (html->file, ex->subscripts[i], "&nbsp;", "<br>");
         }
       fputs ("</sub>", html->file);
     }
-  if (cell->value->n_footnotes > 0)
+  if (ex->n_footnotes > 0)
     {
       fputs ("<sup>", html->file);
       size_t n_footnotes = 0;
-      for (size_t i = 0; i < cell->value->n_footnotes; i++)
+      for (size_t i = 0; i < ex->n_footnotes; i++)
         {
           const struct pivot_footnote *f
-            = pt->footnotes[cell->value->footnote_indexes[i]];
+            = pt->footnotes[ex->footnote_indexes[i]];
           if (f->show)
             {
               if (n_footnotes++ > 0)
@@ -740,8 +740,8 @@ struct output_driver_factory html_driver_factory =
 
 static const struct output_driver_class html_driver_class =
   {
-    "html",
-    html_destroy,
-    html_submit,
-    NULL,
+    .name = "html",
+    .destroy = html_destroy,
+    .submit = html_submit,
+    .handles_groups = true,
   };