X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Foutput_plaintext.C;h=ae70ac44d14fae4d71e5ec022be9c72b044c6ad0;hb=0da3d53269a49c66b24615d24e20e441dcf7c07e;hp=2327206b9f072a294e96c07cd245104aeec9bda2;hpb=9b3398d56cc45cc722e6d48bff3209371ee21366;p=lyx.git diff --git a/src/output_plaintext.C b/src/output_plaintext.C index 2327206b9f..ae70ac44d1 100644 --- a/src/output_plaintext.C +++ b/src/output_plaintext.C @@ -23,35 +23,33 @@ #include "ParagraphParameters.h" #include "support/lstrings.h" -#include "support/unicode.h" -#include -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, +void writePlaintextFile(Buffer const & buf, odocstream & os, OutputParams const & runparams) { bool ref_printed = false; @@ -60,34 +58,36 @@ void writeFileAscii(Buffer const & buf, ostream & os, ParagraphList::const_iterator end = par.end(); ParagraphList::const_iterator it = beg; for (; it != end; ++it) { - asciiParagraph(buf, *it, os, runparams, ref_printed); + writePlaintextParagraph(buf, *it, os, runparams, ref_printed); + os << "\n"; + if (runparams.linelen > 0) + os << "\n"; } - os << "\n"; } namespace { -pair const addDepth(int depth, int ldepth) +pair 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 & ref_printed) { int ltype = 0; - Paragraph::depth_type ltype_depth = 0; - 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(); @@ -129,14 +129,11 @@ 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 (runparams.linelen > 0) - os << "\n\n"; - - os << string(depth * 2, ' '); + os << docstring(depth * 2, ' '); currlinelen += depth * 2; //-- @@ -155,7 +152,7 @@ void asciiParagraph(Buffer const & buf, os << _("Abstract") << "\n\n"; currlinelen = 0; } else { - string const abst = _("Abstract: "); + docstring const abst = _("Abstract: "); os << abst; currlinelen += abst.length(); } @@ -167,7 +164,7 @@ void asciiParagraph(Buffer const & buf, os << _("References") << "\n\n"; currlinelen = 0; } else { - string const refs = _("References: "); + docstring const refs = _("References: "); os << refs; currlinelen += refs.length(); } @@ -176,36 +173,37 @@ void asciiParagraph(Buffer const & buf, break; default: { - string const label = par.params().labelString(); - os << label << ' '; - currlinelen += label.length() + 1; + docstring const label = par.params().labelString(); + if (!label.empty()) { + os << label << ' '; + currlinelen += label.length() + 1; + } break; } } - if (!currlinelen) { - pair p = addDepth(depth, ltype_depth); + if (currlinelen == 0) { + pair 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) { - lyx::char_type 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: { InsetBase const * inset = par.getInset(i); - if (runparams.linelen > 0) { - os << word; - currlinelen += word.length(); - word.erase(); - } + + os << word; + currlinelen += word.length(); + word.erase(); + OutputParams rp = runparams; rp.depth = par.params().depth(); if (inset->plaintext(buf, os, rp)) { @@ -217,9 +215,9 @@ void asciiParagraph(Buffer const & buf, case ' ': if (runparams.linelen > 0 && - currlinelen + word.length() > runparams.linelen - 10) { - os << "\n"; - pair p = addDepth(depth, ltype_depth); + currlinelen + word.length() > runparams.linelen) { + os << '\n'; + pair p = addDepth(depth, ltype_depth); os << p.second; currlinelen = p.first; } @@ -230,23 +228,24 @@ void asciiParagraph(Buffer const & buf, case '\0': lyxerr[Debug::INFO] << - "writeAsciiFile: NULL char in structure." << endl; + "writePlaintextFile: NULL char in structure." << endl; break; - default: { - std::vector const tmp = ucs4_to_utf8(c); - word.append(tmp.begin(), tmp.end()); - if (runparams.linelen > 0 && - currlinelen + word.length() > runparams.linelen) - { - os << "\n"; - pair p = addDepth(depth, ltype_depth); - os << p.second; - currlinelen = p.first; - } + default: + word += c; break; } - } + } + + if (runparams.linelen > 0 && + currlinelen + word.length() > runparams.linelen) { + os << '\n'; + pair p = addDepth(depth, ltype_depth); + os << p.second; + currlinelen = p.first; } os << word; } + + +} // namespace lyx