X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=src%2Foutput%2Fodt.c;h=c0a386e653d502cc9207616534ac8bd76885f18e;hb=eb067c749f97b505d74f5b89573ff287078b833c;hp=a02506c1e9eeacbae9528aa663e55044e8194055;hpb=fa1fffd5c789d9c7875fc3bdf556eaf017cf524e;p=pspp diff --git a/src/output/odt.c b/src/output/odt.c index a02506c1e9..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, 2012 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; } @@ -385,6 +385,31 @@ odt_destroy (struct output_driver *driver) 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) { @@ -458,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 */