output: Move text_item and group_item usage closer to the SPV model.
[pspp] / src / output / ascii.c
index 1df08c40674dab03cb05b02d5fa6cb85a4847578..2584faffaacf22777388bb4a9170a5c9b3cf037e 100644 (file)
@@ -44,6 +44,7 @@
 #include "output/driver-provider.h"
 #include "output/message-item.h"
 #include "output/options.h"
+#include "output/pivot-table.h"
 #include "output/render.h"
 #include "output/table-item.h"
 #include "output/text-item.h"
@@ -183,8 +184,8 @@ struct ascii_driver
 
 #ifdef HAVE_CAIRO
     /* Colours for charts */
-    struct xr_color fg;
-    struct xr_color bg;
+    struct cell_color fg;
+    struct cell_color bg;
 #endif
 
     int width;                  /* Page width. */
@@ -239,6 +240,19 @@ opt (struct output_driver *d, struct string_map *options, const char *key,
   return driver_option_get (d, options, key, default_value);
 }
 
+/* Return true iff the terminal appears to be an xterm with
+   UTF-8 capabilities */
+static bool
+term_is_utf8_xterm (void)
+{
+  const char *term = getenv ("TERM");
+  const char *xterm_locale = getenv ("XTERM_LOCAL");
+  return (term && xterm_locale
+          && !strcmp (term, "xterm")
+          && (strcasestr (xterm_locale, "utf8")
+              || strcasestr (xterm_locale, "utf-8")));
+}
+
 static struct output_driver *
 ascii_create (struct  file_handle *fh, enum settings_output_devices device_type,
               struct string_map *o)
@@ -266,7 +280,13 @@ ascii_create (struct  file_handle *fh, enum settings_output_devices device_type,
   parse_color (d, o, "background-color", "#FFFFFFFFFFFF", &a->bg);
   parse_color (d, o, "foreground-color", "#000000000000", &a->fg);
 #endif
-  box = parse_enum (opt (d, o, "box", "ascii"),
+
+  const char *default_box = (!strcmp (fh_get_file_name (fh), "-")
+                             && isatty (STDOUT_FILENO)
+                             && (!strcmp (locale_charset (), "UTF-8")
+                                 || term_is_utf8_xterm ())
+                             ? "unicode" : "ascii");
+  box = parse_enum (opt (d, o, "box", default_box),
                     "ascii", BOX_ASCII,
                     "unicode", BOX_UNICODE,
                     NULL_SENTINEL);
@@ -431,16 +451,21 @@ ascii_output_table_item (struct ascii_driver *a,
 }
 
 static void
-ascii_output_text (struct ascii_driver *a, const char *text)
+ascii_output_table_item_unref (struct ascii_driver *a,
+                               struct table_item *table_item)
 {
-  struct table_item *table_item;
-
-  table_item = table_item_create (table_from_string (TABLE_HALIGN_LEFT, text),
-                                  NULL, NULL);
   ascii_output_table_item (a, table_item);
   table_item_unref (table_item);
 }
 
+static void
+ascii_output_text (struct ascii_driver *a, const char *text)
+{
+  struct pivot_table *pt = pivot_table_create_for_text (
+    NULL, pivot_value_new_user_text (text, -1));
+  ascii_output_table_item_unref (a, table_item_create (pt));
+}
+
 static void
 ascii_submit (struct output_driver *driver,
               const struct output_item *output_item)
@@ -467,7 +492,7 @@ ascii_submit (struct output_driver *driver,
           struct text_item *text_item;
 
           text_item = text_item_create_format (
-            TEXT_ITEM_PARAGRAPH, _("See %s for a chart."), file_name);
+            TEXT_ITEM_LOG, _("See %s for a chart."), file_name);
 
           ascii_submit (driver, &text_item->output_item);
           text_item_unref (text_item);
@@ -480,19 +505,9 @@ ascii_submit (struct output_driver *driver,
       const struct text_item *text_item = to_text_item (output_item);
       enum text_item_type type = text_item_get_type (text_item);
 
-      switch (type)
-        {
-        case TEXT_ITEM_PAGE_TITLE:
-        case TEXT_ITEM_BLANK_LINE:
-          break;
-
-        case TEXT_ITEM_EJECT_PAGE:
-          break;
-
-        default:
-          ascii_output_table_item (a, text_item_to_table_item (text_item_ref (text_item)));
-          break;
-        }
+      if (type != TEXT_ITEM_PAGE_TITLE && type != TEXT_ITEM_EJECT_PAGE)
+        ascii_output_table_item_unref (
+          a, text_item_to_table_item (text_item_ref (text_item)));
     }
   else if (is_message_item (output_item))
     {