#include "output.h"
#include "outputparams.h"
#include "paragraph.h"
-#include "ParagraphList_fwd.h"
+#include "ParagraphList.h"
#include "ParagraphParameters.h"
-#include "support/gzstream.h"
#include "support/lstrings.h"
-using lyx::support::ascii_lowercase;
-using lyx::support::compare_ascii_no_case;
-using lyx::support::compare_no_case;
-using lyx::support::contains;
-using lyx::pos_type;
+namespace lyx {
+
+using support::ascii_lowercase;
+using support::compare_ascii_no_case;
+using support::contains;
+using support::FileName;
+
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;
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;
- static 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();
- if (compare_no_case(tmp, "itemize") == 0) {
+ if (compare_ascii_no_case(tmp, "itemize") == 0) {
ltype = 1;
ltype_depth = depth + 1;
} else if (compare_ascii_no_case(tmp, "enumerate") == 0) {
ltype_depth = 0;
}
- /* maybe some vertical spaces */
-
/* the labelwidthstring used in lists */
- /* some lines? */
-
- /* some pagebreaks? */
-
/* noindent ? */
/* 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 output in
- // the correct language! (20012712 Jug)
- //--
- switch (ltype) {
- case 0: // Standard
- case 4: // (Sub)Paragraph
- case 5: // Description
- break;
+ 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 6: // Abstract
+ 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();
+ docstring const refs = _("References: ");
+ os << refs;
+ currlinelen += refs.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;
- }
- break;
+ ref_printed = true;
+ }
+ break;
- default: {
- string const label = par.params().labelString();
+ default: {
+ docstring const label = par.params().labelString();
+ if (!label.empty()) {
os << label << ' ';
currlinelen += label.length() + 1;
- break;
}
+ 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);
- switch (c) {
- case Paragraph::META_INSET: {
- InsetBase const * inset = par.getInset(i);
- 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;
- }
- break;
- }
+ // deleted characters don't make much sense in plain text output
+ if (par.isDeleted(i))
+ continue;
- case ' ':
+ char_type c = par.getUChar(buf.params(), i);
+
+ if (c == Paragraph::META_INSET || c == ' ') {
if (runparams.linelen > 0 &&
- currlinelen + word.length() > runparams.linelen - 10) {
- os << "\n";
- pair<int, string> p = addDepth(depth, ltype_depth);
+ 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;
+ os << word;
+ currlinelen += word.length();
word.erase();
+ }
+
+ switch (c) {
+ case Paragraph::META_INSET: {
+ OutputParams rp = runparams;
+ rp.depth = par.params().depth();
+ int len = par.getInset(i)->plaintext(buf, os, rp);
+ if (len >= InsetBase::PLAINTEXT_NEWLINE)
+ currlinelen = len - InsetBase::PLAINTEXT_NEWLINE;
+ else
+ currlinelen += len;
+ break;
+ }
+
+ case ' ':
+ os << ' ';
+ currlinelen++;
break;
case '\0':
- lyxerr[Debug::INFO] <<
- "writeAsciiFile: NULL char in structure." << endl;
+ LYXERR(Debug::INFO) <<
+ "writePlaintextFile: NULL char in structure." << endl;
break;
default:
word += c;
- 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;
- }
break;
}
}
- os << word;
+
+ // currlinelen may be greater than runparams.linelen!
+ // => check whether word is empty and do nothing in this case
+ if (!word.empty()) {
+ 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