X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Foutput%2Fodt.c;h=c0a386e653d502cc9207616534ac8bd76885f18e;hb=b966a83ffe1ecff6a86342d2faad17a4c1a484e5;hp=fdaa6f902de642efbd7a438a745e67feb21e56f2;hpb=3ffbc278e6bad8e4b83e28b5fda1a29d915e58c1;p=pspp diff --git a/src/output/odt.c b/src/output/odt.c index fdaa6f902d..c0a386e653 100644 --- a/src/output/odt.c +++ b/src/output/odt.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 2009, 2010, 2011 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 @@ -31,6 +31,7 @@ #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" @@ -44,7 +45,6 @@ #include "output/text-item.h" #include "gl/xalloc.h" -#include "gl/error.h" #include "gettext.h" #define _(msgid) gettext (msgid) @@ -91,7 +91,7 @@ create_mimetype (struct zip_writer *zip) fp = create_temp_file (); if (fp == NULL) { - error (0, errno, _("error creating temporary file")); + msg_error (errno, _("error creating temporary file")); return false; } @@ -380,10 +380,36 @@ odt_destroy (struct output_driver *driver) 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) { @@ -457,7 +483,14 @@ 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 */ @@ -516,7 +549,8 @@ odt_submit (struct output_driver *driver, } } -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 = {