From b561da06cecf48556e94b4e033bd749eeba3bef7 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Thu, 29 Nov 2018 21:26:35 -0800 Subject: [PATCH] text-item: Merge "title" and "subtitle" items into a new "page title". This better matches SPSS behavior. --- src/language/utilities/title.c | 33 +++++++++-------------- src/output/ascii.c | 3 +-- src/output/cairo.c | 10 +------ src/output/csv.c | 31 ++------------------- src/output/driver.c | 36 +++++++++++++++++++++++++ src/output/driver.h | 3 +++ src/output/html.c | 7 +---- src/output/text-item.h | 3 +-- tests/language/data-io/data-reader.at | 2 -- tests/language/dictionary/split-file.at | 4 +-- tests/language/stats/descriptives.at | 4 +-- tests/language/xforms/count.at | 2 -- 12 files changed, 59 insertions(+), 79 deletions(-) diff --git a/src/language/utilities/title.c b/src/language/utilities/title.c index cc5314c4e3..686774463e 100644 --- a/src/language/utilities/title.c +++ b/src/language/utilities/title.c @@ -27,42 +27,33 @@ #include "libpspp/message.h" #include "libpspp/start-date.h" #include "libpspp/version.h" -#include "output/text-item.h" +#include "output/driver.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) -static int parse_title (struct lexer *, enum text_item_type); -static void set_title (const char *title, enum text_item_type); - -int -cmd_title (struct lexer *lexer, struct dataset *ds UNUSED) -{ - return parse_title (lexer, TEXT_ITEM_TITLE); -} - -int -cmd_subtitle (struct lexer *lexer, struct dataset *ds UNUSED) -{ - return parse_title (lexer, TEXT_ITEM_SUBTITLE); -} - static int -parse_title (struct lexer *lexer, enum text_item_type type) +parse_title (struct lexer *lexer, void (*set_title) (const char *)) { if (!lex_force_string (lexer)) return CMD_FAILURE; - set_title (lex_tokcstr (lexer), type); + set_title (lex_tokcstr (lexer)); lex_get (lexer); return CMD_SUCCESS; } -static void -set_title (const char *title, enum text_item_type type) +int +cmd_title (struct lexer *lexer, struct dataset *ds UNUSED) +{ + return parse_title (lexer, output_set_title); +} + +int +cmd_subtitle (struct lexer *lexer, struct dataset *ds UNUSED) { - text_item_submit (text_item_create (type, title)); + return parse_title (lexer, output_set_subtitle); } /* Performs the FILE LABEL command. */ diff --git a/src/output/ascii.c b/src/output/ascii.c index d4032483da..46ab98a95c 100644 --- a/src/output/ascii.c +++ b/src/output/ascii.c @@ -484,8 +484,7 @@ ascii_submit (struct output_driver *driver, switch (type) { - case TEXT_ITEM_TITLE: - case TEXT_ITEM_SUBTITLE: + case TEXT_ITEM_PAGE_TITLE: case TEXT_ITEM_COMMAND_OPEN: case TEXT_ITEM_COMMAND_CLOSE: break; diff --git a/src/output/cairo.c b/src/output/cairo.c index 2e749e22a4..4debc93d8e 100644 --- a/src/output/cairo.c +++ b/src/output/cairo.c @@ -1662,18 +1662,10 @@ static struct xr_render_fsm * xr_render_text (struct xr_driver *xr, const struct text_item *text_item) { enum text_item_type type = text_item_get_type (text_item); - const char *text = text_item_get_text (text_item); switch (type) { - case TEXT_ITEM_TITLE: - free (xr->title); - xr->title = xstrdup (text); - break; - - case TEXT_ITEM_SUBTITLE: - free (xr->subtitle); - xr->subtitle = xstrdup (text); + case TEXT_ITEM_PAGE_TITLE: break; case TEXT_ITEM_COMMAND_CLOSE: diff --git a/src/output/csv.c b/src/output/csv.c index 763d191372..c5d418293e 100644 --- a/src/output/csv.c +++ b/src/output/csv.c @@ -150,20 +150,6 @@ csv_output_field (struct csv_driver *csv, const char *field) fputs (field, csv->file); } -static void PRINTF_FORMAT (2, 3) -csv_output_field_format (struct csv_driver *csv, const char *format, ...) -{ - va_list args; - char *s; - - va_start (args, format); - s = xvasprintf (format, args); - va_end (args); - - csv_output_field (csv, s); - free (s); -} - static void csv_format_footnotes (const struct footnote **f, size_t n, struct string *s) { @@ -283,24 +269,11 @@ csv_submit (struct output_driver *driver, const char *text = text_item_get_text (text_item); if (type == TEXT_ITEM_COMMAND_OPEN || type == TEXT_ITEM_COMMAND_CLOSE - || type == TEXT_ITEM_SYNTAX) + || type == TEXT_ITEM_SYNTAX || type == TEXT_ITEM_PAGE_TITLE) return; csv_put_separator (csv); - switch (type) - { - case TEXT_ITEM_TITLE: - csv_output_field_format (csv, "Title: %s", text); - break; - - case TEXT_ITEM_SUBTITLE: - csv_output_field_format (csv, "Subtitle: %s", text); - break; - - default: - csv_output_field (csv, text); - break; - } + csv_output_field (csv, text); putc ('\n', csv->file); } else if (is_message_item (output_item)) diff --git a/src/output/driver.c b/src/output/driver.c index f2d581cfe4..b073306333 100644 --- a/src/output/driver.c +++ b/src/output/driver.c @@ -50,6 +50,7 @@ struct output_engine struct llx_list drivers; /* Contains "struct output_driver"s. */ struct string deferred_syntax; /* TEXT_ITEM_SYNTAX being accumulated. */ char *command_name; /* Name of command being processed. */ + char *title, *subtitle; /* Components of page title. */ }; static const struct output_driver_factory *factories[]; @@ -78,6 +79,8 @@ output_engine_push (void) llx_init (&e->drivers); ds_init_empty (&e->deferred_syntax); e->command_name = NULL; + e->title = NULL; + e->subtitle = NULL; } void @@ -94,6 +97,8 @@ output_engine_pop (void) } ds_destroy (&e->deferred_syntax); free (e->command_name); + free (e->title); + free (e->subtitle); } void @@ -225,6 +230,37 @@ output_flush (void) d->class->flush (d); } } + +static void +output_set_title__ (struct output_engine *e, char **dst, const char *src) +{ + free (*dst); + *dst = src ? xstrdup (src) : NULL; + + char *page_title + = (e->title && e->subtitle ? xasprintf ("%s\n%s", e->title, e->subtitle) + : e->title ? xstrdup (e->title) + : e->subtitle ? xstrdup (e->subtitle) + : xzalloc (1)); + text_item_submit (text_item_create_nocopy (TEXT_ITEM_PAGE_TITLE, + page_title)); +} + +void +output_set_title (const char *title) +{ + struct output_engine *e = engine_stack_top (); + + output_set_title__ (e, &e->title, title); +} + +void +output_set_subtitle (const char *subtitle) +{ + struct output_engine *e = engine_stack_top (); + + output_set_title__ (e, &e->subtitle, subtitle); +} void output_driver_init (struct output_driver *driver, diff --git a/src/output/driver.h b/src/output/driver.h index 53dfde8b84..5849a06ac1 100644 --- a/src/output/driver.h +++ b/src/output/driver.h @@ -31,6 +31,9 @@ void output_engine_pop (void); void output_submit (struct output_item *); void output_flush (void); +void output_set_title (const char *); +void output_set_subtitle (const char *); + void output_driver_parse_option (const char *option, struct string_map *options); struct output_driver *output_driver_create (struct string_map *options); diff --git a/src/output/html.c b/src/output/html.c index 0b61486bd6..d75b131909 100644 --- a/src/output/html.c +++ b/src/output/html.c @@ -261,12 +261,7 @@ html_submit (struct output_driver *driver, switch (text_item_get_type (text_item)) { - case TEXT_ITEM_TITLE: - print_title_tag (html->file, "H1", s); - break; - - case TEXT_ITEM_SUBTITLE: - print_title_tag (html->file, "H2", s); + case TEXT_ITEM_PAGE_TITLE: break; case TEXT_ITEM_COMMAND_OPEN: diff --git a/src/output/text-item.h b/src/output/text-item.h index 3cfeb28b73..e09d06badc 100644 --- a/src/output/text-item.h +++ b/src/output/text-item.h @@ -39,8 +39,7 @@ enum text_item_type TEXT_ITEM_COMMAND_CLOSE, /* Command completed. */ /* Headings. */ - TEXT_ITEM_TITLE, /* TITLE command. */ - TEXT_ITEM_SUBTITLE, /* SUBTITLE command. */ + TEXT_ITEM_PAGE_TITLE, /* TITLE and SUBTITLE commands. */ TEXT_ITEM_SUBHEAD, /* Heading within a command's output.*/ /* Syntax. */ diff --git a/tests/language/data-io/data-reader.at b/tests/language/data-io/data-reader.at index 4ca00a6aa7..83d316aee3 100644 --- a/tests/language/data-io/data-reader.at +++ b/tests/language/data-io/data-reader.at @@ -33,8 +33,6 @@ BEGIN DATA. END DATA. ]) AT_CHECK([pspp -O format=csv begin-data.sps], [0], [dnl -Title: Test BEGIN DATA ... END DATA - Table: Reading 1 record from INLINE. Variable,Record,Columns,Format a,1,1- 1,F1.0 diff --git a/tests/language/dictionary/split-file.at b/tests/language/dictionary/split-file.at index 9538e714d8..2dc9a2e506 100644 --- a/tests/language/dictionary/split-file.at +++ b/tests/language/dictionary/split-file.at @@ -41,8 +41,6 @@ list. ]) AT_CHECK([pspp -o pspp.csv split-file.sps]) AT_CHECK([cat pspp.csv], [0], [dnl -Title: Test SPLIT FILE utility - Variable,Value,Label X,1, @@ -135,4 +133,4 @@ finish. AT_CHECK([pspp -O format=csv split-file.sps], [0],[ignore]) -AT_CLEANUP \ No newline at end of file +AT_CLEANUP diff --git a/tests/language/stats/descriptives.at b/tests/language/stats/descriptives.at index bc3bbb66d1..508f954e12 100644 --- a/tests/language/stats/descriptives.at +++ b/tests/language/stats/descriptives.at @@ -36,9 +36,7 @@ end data. descript all/stat=all/format=serial. ]) -AT_CHECK([pspp -O format=csv descriptives.sps], [0], - [Title: Test DESCRIPTIVES procedure - +AT_CHECK([pspp -O format=csv descriptives.sps], [0], [dnl Table: Reading 1 record from INLINE. Variable,Record,Columns,Format V0,1,1- 1,F1.0 diff --git a/tests/language/xforms/count.at b/tests/language/xforms/count.at index d6a1f67d5b..88d842d564 100644 --- a/tests/language/xforms/count.at +++ b/tests/language/xforms/count.at @@ -73,8 +73,6 @@ COUNT c=v1 to v2('2',' 4','1'). LIST. ]) AT_CHECK([pspp -O format=csv count.sps], [0], [dnl -Title: Test COUNT transformation - Table: Reading 1 record from INLINE. Variable,Record,Columns,Format v1,1,1- 2,A2 -- 2.30.2