/* PSPP - a program for statistical analysis.
- Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+ Copyright (C) 2009, 2010, 2011, 2012, 2014 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
#include "libpspp/assertion.h"
#include "libpspp/cast.h"
+#include "libpspp/message.h"
#include "libpspp/str.h"
#include "libpspp/temp-file.h"
#include "libpspp/version.h"
#include "output/text-item.h"
#include "gl/xalloc.h"
-#include "gl/error.h"
#include "gettext.h"
#define _(msgid) gettext (msgid)
fp = create_temp_file ();
if (fp == NULL)
{
- error (0, errno, _("error creating temporary file"));
+ msg_error (errno, _("error creating temporary file"));
return false;
}
zip_writer_close (odt->zip);
}
+ free (odt->file_name);
free (odt->command_name);
free (odt);
}
+static void
+write_xml_with_line_breaks (xmlTextWriterPtr writer, char *line)
+{
+ char *newline;
+ char *p;
+
+ for (p = line; *p; p = newline + 1)
+ {
+ newline = strchr (p, '\n');
+
+ if (!newline)
+ {
+ xmlTextWriterWriteString (writer, _xml(p));
+ return;
+ }
+
+ if (newline > p && newline[-1] == '\r')
+ newline[-1] = '\0';
+ else
+ *newline = '\0';
+ xmlTextWriterWriteString (writer, _xml(p));
+ xmlTextWriterWriteElement (writer, _xml("text:line-break"), _xml(""));
+ }
+}
+
static void
odt_submit_table (struct odt_driver *odt, struct table_item *item)
{
else
xmlTextWriterWriteAttribute (odt->content_wtr, _xml("text:style-name"), _xml("Table_20_Contents"));
- xmlTextWriterWriteString (odt->content_wtr, _xml(cell.contents));
+ if (strchr (cell.contents, '\n'))
+ {
+ char *line = xstrdup (cell.contents);
+ write_xml_with_line_breaks (odt->content_wtr, line);
+ free (line);
+ }
+ else
+ xmlTextWriterWriteString (odt->content_wtr, _xml(cell.contents));
xmlTextWriterEndElement (odt->content_wtr); /* text:p */
xmlTextWriterEndElement (odt->content_wtr); /* table:table-cell */
odt_submit_table (odt, to_table_item (output_item));
else if (is_text_item (output_item))
{
- /* XXX apply different styles based on text_item's type. */
- odt_output_text (odt, text_item_get_text (to_text_item (output_item)));
+ struct text_item *text_item = to_text_item (output_item);
+
+ if (text_item_get_type (text_item) != TEXT_ITEM_COMMAND_CLOSE)
+ odt_output_text (odt, text_item_get_text (text_item));
}
else if (is_message_item (output_item))
{
}
}
-struct output_driver_factory odt_driver_factory = { "odt", odt_create };
+struct output_driver_factory odt_driver_factory =
+ { "odt", "pspp.odf", odt_create };
static const struct output_driver_class odt_driver_class =
{