]> git.lyx.org Git - lyx.git/blobdiff - src/output_plaintext.C
fix typo in commit 16925
[lyx.git] / src / output_plaintext.C
index 835ef66d80bfa995b96abbed166e61c6f89205f0..ae70ac44d14fae4d71e5ec022be9c72b044c6ad0 100644 (file)
 #include "output.h"
 #include "outputparams.h"
 #include "paragraph.h"
+#include "ParagraphList.h"
 #include "ParagraphParameters.h"
 
-#include "support/gzstream.h"
 #include "support/lstrings.h"
 
-#ifdef HAVE_LOCALE
-#endif
 
-using lyx::support::ascii_lowercase;
-using lyx::support::compare_ascii_no_case;
-using lyx::support::compare_no_case;
-using lyx::support::contains;
+namespace lyx {
+
+using support::ascii_lowercase;
+using support::compare_ascii_no_case;
+using support::compare_no_case;
+using support::contains;
+using support::FileName;
 
-using lyx::pos_type;
 using std::endl;
 using std::ostream;
-using std::ofstream;
 using std::pair;
 using std::string;
 
 
-void writeFileAscii(Buffer const & buf,
-                   string const & fname,
-                   OutputParams const & runparams)
+void writePlaintextFile(Buffer const & buf, FileName const & fname,
+       OutputParams const & runparams)
 {
-       ofstream ofs;
-       if (!::openFileWrite(ofs, fname))
+       odocfstream ofs;
+       if (!openFileWrite(ofs, fname))
                return;
-       writeFileAscii(buf, ofs, runparams);
+       writePlaintextFile(buf, ofs, runparams);
 }
 
 
-void writeFileAscii(Buffer const & buf,
-                   ostream & os,
-                   OutputParams const & runparams)
+void writePlaintextFile(Buffer const & buf, odocstream & os,
+       OutputParams const & runparams)
 {
-       Buffer & tmp = const_cast<Buffer &>(buf);
-       ParagraphList par = const_cast<ParagraphList&>(tmp.paragraphs());
-       ParagraphList::iterator beg = par.begin();
-       ParagraphList::iterator end = par.end();
-       ParagraphList::iterator it = beg;
+       bool ref_printed = false;
+       ParagraphList const par = buf.paragraphs();
+       ParagraphList::const_iterator beg = par.begin();
+       ParagraphList::const_iterator end = par.end();
+       ParagraphList::const_iterator it = beg;
        for (; it != end; ++it) {
-               asciiParagraph(buf, *it, os, runparams, it == beg);
+               writePlaintextParagraph(buf, *it, os, runparams, ref_printed);
+               os << "\n";
+               if (runparams.linelen > 0)
+                       os << "\n";
        }
-       os << "\n";
 }
 
 
 namespace {
 
-pair<int, string> const addDepth(int depth, int ldepth)
+pair<int, docstring> const addDepth(int depth, int ldepth)
 {
        int d = depth * 2;
        if (ldepth > depth)
                d += (ldepth - depth) * 2;
-       return make_pair(d, string(d, ' '));
+       return make_pair(d, docstring(d, ' '));
 }
 
 }
 
 
-void asciiParagraph(Buffer const & buf,
+void writePlaintextParagraph(Buffer const & buf,
                    Paragraph const & par,
-                   ostream & os,
+                   odocstream & os,
                    OutputParams const & runparams,
-                   bool noparbreak)
+                   bool & ref_printed)
 {
        int ltype = 0;
-       Paragraph::depth_type ltype_depth = 0;
-       bool ref_printed = false;
-       Paragraph::depth_type depth = par.params().depth();
+       depth_type ltype_depth = 0;
+       depth_type depth = par.params().depth();
 
        // First write the layout
        string const & tmp = par.layout()->name();
@@ -131,130 +129,123 @@ void asciiParagraph(Buffer const & buf,
 
        /* what about the alignment */
 
-       // runparams.linelen <= 0 is special and means we don't have paragraph breaks
+       // runparams.linelen == 0 is special and means we don't have paragraph breaks
 
        string::size_type currlinelen = 0;
 
-       if (!noparbreak) {
-               if (runparams.linelen > 0)
-                       os << "\n\n";
-
-               os << string(depth * 2, ' ');
-               currlinelen += depth * 2;
-
-               //--
-               // we should probably change to the paragraph language in the
-               // gettext here (if possible) so that strings are outputted in
-               // the correct language! (20012712 Jug)
-               //--
-               switch (ltype) {
-               case 0: // Standard
-               case 4: // (Sub)Paragraph
-               case 5: // Description
-                       break;
-               case 6: // Abstract
+       os << docstring(depth * 2, ' ');
+       currlinelen += depth * 2;
+
+       //--
+       // we should probably change to the paragraph language in the
+       // gettext here (if possible) so that strings are output in
+       // the correct language! (20012712 Jug)
+       //--
+       switch (ltype) {
+       case 0: // Standard
+       case 4: // (Sub)Paragraph
+       case 5: // Description
+               break;
+
+       case 6: // Abstract
+               if (runparams.linelen > 0) {
+                       os << _("Abstract") << "\n\n";
+                       currlinelen = 0;
+               } else {
+                       docstring const abst = _("Abstract: ");
+                       os << abst;
+                       currlinelen += abst.length();
+               }
+               break;
+
+       case 7: // Bibliography
+               if (!ref_printed) {
                        if (runparams.linelen > 0) {
-                               os << _("Abstract") << "\n\n";
+                               os << _("References") << "\n\n";
                                currlinelen = 0;
                        } else {
-                               string const abst = _("Abstract: ");
-                               os << abst;
-                               currlinelen += abst.length();
-                       }
-                       break;
-               case 7: // Bibliography
-                       if (!ref_printed) {
-                               if (runparams.linelen > 0) {
-                                       os << _("References") << "\n\n";
-                                       currlinelen = 0;
-                               } else {
-                                       string const refs = _("References: ");
-                                       os << refs;
-                                       currlinelen += refs.length();
-                               }
-
-                               ref_printed = true;
+                               docstring const refs = _("References: ");
+                               os << refs;
+                               currlinelen += refs.length();
                        }
-                       break;
-               default:
-               {
-                       string const parlab = par.params().labelString();
-                       os << parlab << ' ';
-                       currlinelen += parlab.length() + 1;
+                       ref_printed = true;
                }
                break;
 
+       default: {
+               docstring const label = par.params().labelString();
+               if (!label.empty()) {
+                       os << label << ' ';
+                       currlinelen += label.length() + 1;
                }
+               break;
        }
 
-       if (!currlinelen) {
-               pair<int, string> p = addDepth(depth, ltype_depth);
+       }
+
+       if (currlinelen == 0) {
+               pair<int, docstring> p = addDepth(depth, ltype_depth);
                os << p.second;
                currlinelen += p.first;
        }
 
-       // this is to change the linebreak to do it by word a bit more
-       // intelligent hopefully! (only in the case where we have a
-       // max runparams.linelength!) (Jug)
-
-       string word;
+       docstring word;
 
        for (pos_type i = 0; i < par.size(); ++i) {
-               char c = par.getUChar(buf.params(), i);
+               if (par.isDeleted(i)) // deleted characters don't make much sense in plain text output
+                       continue;
+
+               char_type c = par.getUChar(buf.params(), i);
                switch (c) {
-               case Paragraph::META_INSET:
-               {
-                       InsetOld const * inset = par.getInset(i);
-                       if (inset) {
-                               if (runparams.linelen > 0) {
-                                       os << word;
-                                       currlinelen += word.length();
-                                       word.erase();
-                               }
-                               if (inset->plaintext(buf, os, runparams)) {
-                                       // to be sure it breaks paragraph
-                                       currlinelen += runparams.linelen;
-                               }
+               case Paragraph::META_INSET: {
+                       InsetBase const * inset = par.getInset(i);
+
+                       os << word;
+                       currlinelen += word.length();
+                       word.erase();
+
+                       OutputParams rp = runparams;
+                       rp.depth = par.params().depth();
+                       if (inset->plaintext(buf, os, rp)) {
+                               // to be sure it breaks paragraph
+                               currlinelen += runparams.linelen;
                        }
+                       break;
                }
-               break;
-
-               default:
-                       if (c == ' ') {
-                               if (runparams.linelen > 0 &&
-                                   currlinelen + word.length() > runparams.linelen - 10) {
-                                       os << "\n";
-                                       pair<int, string> p = addDepth(depth, ltype_depth);
-                                       os << p.second;
-                                       currlinelen = p.first;
-                               }
-
-                               os << word << ' ';
-                               currlinelen += word.length() + 1;
-                               word.erase();
 
-                       } else {
-                               if (c != '\0') {
-                                       word += c;
-                               } else {
-                                       lyxerr[Debug::INFO] <<
-                                               "writeAsciiFile: NULL char in structure." << endl;
-                               }
-                               if ((runparams.linelen > 0) &&
-                                       (currlinelen + word.length()) > runparams.linelen)
-                               {
-                                       os << "\n";
-
-                                       pair<int, string> p =
-                                               addDepth(depth, ltype_depth);
-                                       os << p.second;
-                                       currlinelen = p.first;
-                               }
+               case ' ':
+                       if (runparams.linelen > 0 &&
+                           currlinelen + word.length() > runparams.linelen) {
+                               os << '\n';
+                               pair<int, docstring> p = addDepth(depth, ltype_depth);
+                               os << p.second;
+                               currlinelen = p.first;
                        }
+                       os << word << ' ';
+                       currlinelen += word.length() + 1;
+                       word.erase();
+                       break;
+
+               case '\0':
+                       lyxerr[Debug::INFO] <<
+                               "writePlaintextFile: NULL char in structure." << endl;
+                       break;
+
+               default:
+                       word += c;
                        break;
                }
        }
+
+       if (runparams.linelen > 0 &&
+           currlinelen + word.length() > runparams.linelen) {
+               os << '\n';
+               pair<int, docstring> p = addDepth(depth, ltype_depth);
+               os << p.second;
+               currlinelen = p.first;
+       }
        os << word;
 }
 
 
+} // namespace lyx