csv: Change footnote format.
[pspp] / src / output / csv.c
index 6c2f7495c45d494acab3e6165f4389ceb3f0b0b7..4940d3c18cf1a212df3b610214d085b9c349dce2 100644 (file)
@@ -30,6 +30,7 @@
 #include "output/driver-provider.h"
 #include "output/options.h"
 #include "output/message-item.h"
+#include "output/page-eject-item.h"
 #include "output/table-item.h"
 #include "output/table-provider.h"
 
@@ -174,26 +175,49 @@ csv_output_lines (struct csv_driver *csv, const char *text_)
 }
 
 static void
-csv_format_footnotes (const struct footnote **f, size_t n, struct string *s)
+csv_format_footnotes (struct footnote **f, size_t n, struct string *s)
 {
   for (size_t i = 0; i < n; i++)
     ds_put_format (s, "[%s]", f[i]->marker);
 }
 
 static void
-csv_output_table_item_text (struct csv_driver *csv,
-                            const struct table_item_text *text,
-                            const char *leader)
+csv_output_table_cell (struct csv_driver *csv, const struct table_cell *cell,
+                       const char *leader)
 {
-  if (!text)
+  if (!cell)
     return;
 
-  struct string s = DS_EMPTY_INITIALIZER;
-  ds_put_format (&s, "%s: %s", leader, text->content);
-  csv_format_footnotes (text->footnotes, text->n_footnotes, &s);
-  csv_output_field (csv, ds_cstr (&s));
-  ds_destroy (&s);
-  putc ('\n', csv->file);
+  if (!(cell->options & TAB_MARKUP) && !cell->n_footnotes
+      && !cell->n_subscripts && !leader)
+    csv_output_field (csv, cell->text);
+  else
+    {
+      struct string s = DS_EMPTY_INITIALIZER;
+
+      if (leader)
+        ds_put_format (&s, "%s: ", leader);
+
+      if (cell->options & TAB_MARKUP)
+        {
+          char *t = output_get_text_from_markup (cell->text);
+          ds_put_cstr (&s, t);
+          free (t);
+        }
+      else
+        ds_put_cstr (&s, cell->text);
+
+      if (cell->n_subscripts)
+        for (size_t i = 0; i < cell->n_subscripts; i++)
+          ds_put_format (&s, "%c%s",
+                         i ? ',' : '_', cell->subscripts[i]);
+      csv_format_footnotes (cell->footnotes, cell->n_footnotes, &s);
+      csv_output_field (csv, ds_cstr (&s));
+      ds_destroy (&s);
+
+      if (leader)
+        putc ('\n', csv->file);
+    }
 }
 
 static void
@@ -211,12 +235,11 @@ csv_submit (struct output_driver *driver,
       csv_put_separator (csv);
 
       if (csv->titles)
-        csv_output_table_item_text (csv, table_item_get_title (table_item),
-                                    "Table");
+        csv_output_table_cell (csv, table_item_get_title (table_item), "Table");
 
-      for (y = 0; y < table_nr (t); y++)
+      for (y = 0; y < t->n[TABLE_VERT]; y++)
         {
-          for (x = 0; x < table_nc (t); x++)
+          for (x = 0; x < t->n[TABLE_HORZ]; x++)
             {
               struct table_cell cell;
 
@@ -227,44 +250,25 @@ csv_submit (struct output_driver *driver,
 
               if (x != cell.d[TABLE_HORZ][0] || y != cell.d[TABLE_VERT][0])
                 csv_output_field (csv, "");
-              else if (!(cell.options & TAB_MARKUP) && !cell.n_footnotes)
-                csv_output_field (csv, cell.text);
               else
-                {
-                  struct string s = DS_EMPTY_INITIALIZER;
-
-                  if (cell.options & TAB_MARKUP)
-                    {
-                      char *t = output_get_text_from_markup (cell.text);
-                      ds_put_cstr (&s, t);
-                      free (t);
-                    }
-                  else
-                    ds_put_cstr (&s, cell.text);
-
-                  csv_format_footnotes (cell.footnotes, cell.n_footnotes, &s);
-                  csv_output_field (csv, ds_cstr (&s));
-                  ds_destroy (&s);
-                }
+                csv_output_table_cell (csv, &cell, NULL);
             }
           putc ('\n', csv->file);
         }
 
       if (csv->captions)
-        csv_output_table_item_text (csv, table_item_get_caption (table_item),
-                                    "Caption");
+        csv_output_table_cell (csv, table_item_get_caption (table_item),
+                               "Caption");
 
-      const struct footnote **f;
+      struct footnote **f;
       size_t n_footnotes = table_collect_footnotes (table_item, &f);
       if (n_footnotes)
         {
-          fputs ("\nFootnotes:\n", csv->file);
-
           for (size_t i = 0; i < n_footnotes; i++)
             {
-              csv_output_field (csv, f[i]->marker);
-              fputs (csv->separator, csv->file);
-              csv_output_field (csv, f[i]->content);
+              char *s = xasprintf ("Footnote: %s. %s", f[i]->marker, f[i]->content);
+              csv_output_field (csv, s);
+              free (s);
               putc ('\n', csv->file);
             }
 
@@ -282,7 +286,7 @@ csv_submit (struct output_driver *driver,
 
       csv_put_separator (csv);
 
-      if (text_item->markup)
+      if (text_item->style.markup)
         {
           char *plain_text = output_get_text_from_markup (text);
           csv_output_lines (csv, plain_text);
@@ -291,6 +295,11 @@ csv_submit (struct output_driver *driver,
       else
         csv_output_lines (csv, text);
     }
+  else if (is_page_eject_item (output_item))
+    {
+      csv_put_separator (csv);
+      csv_output_lines (csv, "");
+    }
   else if (is_message_item (output_item))
     {
       const struct message_item *message_item = to_message_item (output_item);