2003-11-05 12:06:20 +00:00
|
|
|
|
/**
|
|
|
|
|
* \file output_plaintext.C
|
|
|
|
|
* This file is part of LyX, the document processor.
|
|
|
|
|
* Licence details can be found in the file COPYING.
|
|
|
|
|
*
|
|
|
|
|
* \author Lars Gullik Bj<EFBFBD>nnes
|
|
|
|
|
*
|
|
|
|
|
* Full author contact details are available in file CREDITS.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#include <config.h>
|
|
|
|
|
|
|
|
|
|
#include "output_plaintext.h"
|
|
|
|
|
|
|
|
|
|
#include "buffer.h"
|
|
|
|
|
#include "bufferparams.h"
|
|
|
|
|
#include "debug.h"
|
|
|
|
|
#include "gettext.h"
|
|
|
|
|
#include "output.h"
|
|
|
|
|
#include "outputparams.h"
|
|
|
|
|
#include "paragraph.h"
|
2006-03-23 20:11:06 +00:00
|
|
|
|
#include "ParagraphList.h"
|
2003-11-05 12:06:20 +00:00
|
|
|
|
#include "ParagraphParameters.h"
|
|
|
|
|
|
|
|
|
|
#include "support/lstrings.h"
|
2005-01-20 21:34:23 +00:00
|
|
|
|
|
2003-11-05 12:06:20 +00:00
|
|
|
|
|
2006-10-21 00:16:43 +00:00
|
|
|
|
namespace lyx {
|
|
|
|
|
|
|
|
|
|
using support::ascii_lowercase;
|
|
|
|
|
using support::compare_ascii_no_case;
|
|
|
|
|
using support::compare_no_case;
|
|
|
|
|
using support::contains;
|
2006-12-04 15:46:57 +00:00
|
|
|
|
using support::FileName;
|
2006-10-21 00:16:43 +00:00
|
|
|
|
|
2003-11-05 12:06:20 +00:00
|
|
|
|
using std::endl;
|
|
|
|
|
using std::ostream;
|
|
|
|
|
using std::pair;
|
|
|
|
|
using std::string;
|
|
|
|
|
|
|
|
|
|
|
2007-01-18 22:29:50 +00:00
|
|
|
|
void writePlaintextFile(Buffer const & buf, FileName const & fname,
|
2006-10-21 00:16:43 +00:00
|
|
|
|
OutputParams const & runparams)
|
2003-11-05 12:06:20 +00:00
|
|
|
|
{
|
2006-10-21 00:16:43 +00:00
|
|
|
|
odocfstream ofs;
|
|
|
|
|
if (!openFileWrite(ofs, fname))
|
2003-11-05 12:06:20 +00:00
|
|
|
|
return;
|
2007-01-18 22:29:50 +00:00
|
|
|
|
writePlaintextFile(buf, ofs, runparams);
|
2003-11-05 12:06:20 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2007-01-18 22:29:50 +00:00
|
|
|
|
void writePlaintextFile(Buffer const & buf, odocstream & os,
|
2004-03-25 09:16:36 +00:00
|
|
|
|
OutputParams const & runparams)
|
2003-11-05 12:06:20 +00:00
|
|
|
|
{
|
2005-07-15 19:10:25 +00:00
|
|
|
|
bool ref_printed = false;
|
2004-05-17 11:28:31 +00:00
|
|
|
|
ParagraphList const par = buf.paragraphs();
|
|
|
|
|
ParagraphList::const_iterator beg = par.begin();
|
|
|
|
|
ParagraphList::const_iterator end = par.end();
|
|
|
|
|
ParagraphList::const_iterator it = beg;
|
2003-11-05 12:06:20 +00:00
|
|
|
|
for (; it != end; ++it) {
|
2007-01-18 22:29:50 +00:00
|
|
|
|
writePlaintextParagraph(buf, *it, os, runparams, ref_printed);
|
2007-01-20 15:35:39 +00:00
|
|
|
|
os << "\n";
|
|
|
|
|
if (runparams.linelen > 0)
|
|
|
|
|
os << "\n";
|
2003-11-05 12:06:20 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace {
|
|
|
|
|
|
2006-10-11 19:40:50 +00:00
|
|
|
|
pair<int, docstring> const addDepth(int depth, int ldepth)
|
2003-11-05 12:06:20 +00:00
|
|
|
|
{
|
|
|
|
|
int d = depth * 2;
|
|
|
|
|
if (ldepth > depth)
|
|
|
|
|
d += (ldepth - depth) * 2;
|
2006-10-11 19:40:50 +00:00
|
|
|
|
return make_pair(d, docstring(d, ' '));
|
2003-11-05 12:06:20 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2007-01-18 22:29:50 +00:00
|
|
|
|
void writePlaintextParagraph(Buffer const & buf,
|
2003-11-05 12:06:20 +00:00
|
|
|
|
Paragraph const & par,
|
2006-10-21 00:16:43 +00:00
|
|
|
|
odocstream & os,
|
2003-11-05 12:06:20 +00:00
|
|
|
|
OutputParams const & runparams,
|
2005-07-15 19:10:25 +00:00
|
|
|
|
bool & ref_printed)
|
2003-11-05 12:06:20 +00:00
|
|
|
|
{
|
|
|
|
|
int ltype = 0;
|
2006-10-21 00:16:43 +00:00
|
|
|
|
depth_type ltype_depth = 0;
|
|
|
|
|
depth_type depth = par.params().depth();
|
2003-11-05 12:06:20 +00:00
|
|
|
|
|
|
|
|
|
// First write the layout
|
|
|
|
|
string const & tmp = par.layout()->name();
|
|
|
|
|
if (compare_no_case(tmp, "itemize") == 0) {
|
|
|
|
|
ltype = 1;
|
|
|
|
|
ltype_depth = depth + 1;
|
|
|
|
|
} else if (compare_ascii_no_case(tmp, "enumerate") == 0) {
|
|
|
|
|
ltype = 2;
|
|
|
|
|
ltype_depth = depth + 1;
|
|
|
|
|
} else if (contains(ascii_lowercase(tmp), "ection")) {
|
|
|
|
|
ltype = 3;
|
|
|
|
|
ltype_depth = depth + 1;
|
|
|
|
|
} else if (contains(ascii_lowercase(tmp), "aragraph")) {
|
|
|
|
|
ltype = 4;
|
|
|
|
|
ltype_depth = depth + 1;
|
|
|
|
|
} else if (compare_ascii_no_case(tmp, "description") == 0) {
|
|
|
|
|
ltype = 5;
|
|
|
|
|
ltype_depth = depth + 1;
|
|
|
|
|
} else if (compare_ascii_no_case(tmp, "abstract") == 0) {
|
|
|
|
|
ltype = 6;
|
|
|
|
|
ltype_depth = 0;
|
|
|
|
|
} else if (compare_ascii_no_case(tmp, "bibliography") == 0) {
|
|
|
|
|
ltype = 7;
|
|
|
|
|
ltype_depth = 0;
|
|
|
|
|
} else {
|
|
|
|
|
ltype = 0;
|
|
|
|
|
ltype_depth = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* maybe some vertical spaces */
|
|
|
|
|
|
|
|
|
|
/* the labelwidthstring used in lists */
|
|
|
|
|
|
|
|
|
|
/* some lines? */
|
|
|
|
|
|
|
|
|
|
/* some pagebreaks? */
|
|
|
|
|
|
|
|
|
|
/* noindent ? */
|
|
|
|
|
|
|
|
|
|
/* what about the alignment */
|
|
|
|
|
|
2007-01-20 14:51:40 +00:00
|
|
|
|
// runparams.linelen == 0 is special and means we don't have paragraph breaks
|
2003-11-05 12:06:20 +00:00
|
|
|
|
|
|
|
|
|
string::size_type currlinelen = 0;
|
|
|
|
|
|
2006-10-11 19:40:50 +00:00
|
|
|
|
os << docstring(depth * 2, ' ');
|
2005-07-15 19:10:25 +00:00
|
|
|
|
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) {
|
2006-10-11 19:40:50 +00:00
|
|
|
|
os << _("Abstract") << "\n\n";
|
2005-07-15 19:10:25 +00:00
|
|
|
|
currlinelen = 0;
|
|
|
|
|
} else {
|
2007-01-21 09:46:15 +00:00
|
|
|
|
docstring const abst = _("Abstract: ");
|
2005-07-15 19:10:25 +00:00
|
|
|
|
os << abst;
|
|
|
|
|
currlinelen += abst.length();
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 7: // Bibliography
|
|
|
|
|
if (!ref_printed) {
|
2003-11-05 12:06:20 +00:00
|
|
|
|
if (runparams.linelen > 0) {
|
2006-10-11 19:40:50 +00:00
|
|
|
|
os << _("References") << "\n\n";
|
2003-11-05 12:06:20 +00:00
|
|
|
|
currlinelen = 0;
|
|
|
|
|
} else {
|
2007-01-21 09:46:15 +00:00
|
|
|
|
docstring const refs = _("References: ");
|
2005-07-15 19:10:25 +00:00
|
|
|
|
os << refs;
|
|
|
|
|
currlinelen += refs.length();
|
2003-11-05 12:06:20 +00:00
|
|
|
|
}
|
2005-07-15 19:10:25 +00:00
|
|
|
|
ref_printed = true;
|
2003-11-05 12:06:20 +00:00
|
|
|
|
}
|
2005-07-15 19:10:25 +00:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default: {
|
2006-10-21 00:16:43 +00:00
|
|
|
|
docstring const label = par.params().labelString();
|
2007-01-20 16:14:39 +00:00
|
|
|
|
if (!label.empty()) {
|
|
|
|
|
os << label << ' ';
|
|
|
|
|
currlinelen += label.length() + 1;
|
|
|
|
|
}
|
2005-07-15 19:10:25 +00:00
|
|
|
|
break;
|
|
|
|
|
}
|
2003-11-05 12:06:20 +00:00
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2007-01-20 16:14:39 +00:00
|
|
|
|
if (currlinelen == 0) {
|
2006-10-11 19:40:50 +00:00
|
|
|
|
pair<int, docstring> p = addDepth(depth, ltype_depth);
|
2003-11-05 12:06:20 +00:00
|
|
|
|
os << p.second;
|
|
|
|
|
currlinelen += p.first;
|
|
|
|
|
}
|
|
|
|
|
|
2006-10-11 19:40:50 +00:00
|
|
|
|
docstring word;
|
2003-11-05 12:06:20 +00:00
|
|
|
|
|
|
|
|
|
for (pos_type i = 0; i < par.size(); ++i) {
|
2007-01-20 16:25:52 +00:00
|
|
|
|
if (par.isDeleted(i)) // deleted characters don't make much sense in plain text output
|
|
|
|
|
continue;
|
|
|
|
|
|
2006-10-21 00:16:43 +00:00
|
|
|
|
char_type c = par.getUChar(buf.params(), i);
|
2003-11-05 12:06:20 +00:00
|
|
|
|
switch (c) {
|
2003-11-28 08:55:12 +00:00
|
|
|
|
case Paragraph::META_INSET: {
|
2007-02-15 16:07:36 +00:00
|
|
|
|
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;
|
|
|
|
|
}
|
2007-01-19 16:17:39 +00:00
|
|
|
|
os << word;
|
|
|
|
|
currlinelen += word.length();
|
|
|
|
|
word.erase();
|
2007-01-20 16:25:52 +00:00
|
|
|
|
|
2004-08-16 00:32:04 +00:00
|
|
|
|
OutputParams rp = runparams;
|
|
|
|
|
rp.depth = par.params().depth();
|
2007-02-15 16:07:36 +00:00
|
|
|
|
int len = par.getInset(i)->plaintext(buf, os, rp);
|
|
|
|
|
if (len >= runparams.linelen)
|
|
|
|
|
currlinelen = len - runparams.linelen;
|
|
|
|
|
else
|
|
|
|
|
currlinelen += len;
|
2003-11-28 08:55:12 +00:00
|
|
|
|
break;
|
2003-11-05 12:06:20 +00:00
|
|
|
|
}
|
|
|
|
|
|
2003-11-28 08:55:12 +00:00
|
|
|
|
case ' ':
|
|
|
|
|
if (runparams.linelen > 0 &&
|
2007-01-20 16:38:58 +00:00
|
|
|
|
currlinelen + word.length() > runparams.linelen) {
|
2006-10-11 19:40:50 +00:00
|
|
|
|
os << '\n';
|
|
|
|
|
pair<int, docstring> p = addDepth(depth, ltype_depth);
|
2003-11-28 08:55:12 +00:00
|
|
|
|
os << p.second;
|
|
|
|
|
currlinelen = p.first;
|
|
|
|
|
}
|
|
|
|
|
os << word << ' ';
|
|
|
|
|
currlinelen += word.length() + 1;
|
|
|
|
|
word.erase();
|
|
|
|
|
break;
|
2003-11-05 12:06:20 +00:00
|
|
|
|
|
2003-11-28 08:55:12 +00:00
|
|
|
|
case '\0':
|
|
|
|
|
lyxerr[Debug::INFO] <<
|
2007-01-18 22:29:50 +00:00
|
|
|
|
"writePlaintextFile: NULL char in structure." << endl;
|
2003-11-28 08:55:12 +00:00
|
|
|
|
break;
|
|
|
|
|
|
2006-10-11 19:40:50 +00:00
|
|
|
|
default:
|
|
|
|
|
word += c;
|
2003-11-05 12:06:20 +00:00
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
2007-01-20 16:38:58 +00:00
|
|
|
|
|
2007-02-17 15:43:11 +00:00
|
|
|
|
// 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;
|
2007-01-20 16:38:58 +00:00
|
|
|
|
}
|
2003-11-05 12:06:20 +00:00
|
|
|
|
}
|
2006-10-21 00:16:43 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} // namespace lyx
|