2 * \file output_plaintext.C
3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
6 * \author Lars Gullik Bjønnes
8 * Full author contact details are available in file CREDITS.
13 #include "output_plaintext.h"
16 #include "bufferparams.h"
20 #include "outputparams.h"
21 #include "paragraph.h"
22 #include "ParagraphList.h"
23 #include "ParagraphParameters.h"
25 #include "support/lstrings.h"
30 using support::ascii_lowercase;
31 using support::compare_ascii_no_case;
32 using support::compare_no_case;
33 using support::contains;
41 void writeFileAscii(Buffer const & buf, string const & fname,
42 OutputParams const & runparams)
45 if (!openFileWrite(ofs, fname))
47 writeFileAscii(buf, ofs, runparams);
51 void writeFileAscii(Buffer const & buf, odocstream & os,
52 OutputParams const & runparams)
54 bool ref_printed = false;
55 ParagraphList const par = buf.paragraphs();
56 ParagraphList::const_iterator beg = par.begin();
57 ParagraphList::const_iterator end = par.end();
58 ParagraphList::const_iterator it = beg;
59 for (; it != end; ++it) {
60 asciiParagraph(buf, *it, os, runparams, ref_printed);
68 pair<int, docstring> const addDepth(int depth, int ldepth)
72 d += (ldepth - depth) * 2;
73 return make_pair(d, docstring(d, ' '));
79 void asciiParagraph(Buffer const & buf,
80 Paragraph const & par,
82 OutputParams const & runparams,
86 depth_type ltype_depth = 0;
87 depth_type depth = par.params().depth();
89 // First write the layout
90 string const & tmp = par.layout()->name();
91 if (compare_no_case(tmp, "itemize") == 0) {
93 ltype_depth = depth + 1;
94 } else if (compare_ascii_no_case(tmp, "enumerate") == 0) {
96 ltype_depth = depth + 1;
97 } else if (contains(ascii_lowercase(tmp), "ection")) {
99 ltype_depth = depth + 1;
100 } else if (contains(ascii_lowercase(tmp), "aragraph")) {
102 ltype_depth = depth + 1;
103 } else if (compare_ascii_no_case(tmp, "description") == 0) {
105 ltype_depth = depth + 1;
106 } else if (compare_ascii_no_case(tmp, "abstract") == 0) {
109 } else if (compare_ascii_no_case(tmp, "bibliography") == 0) {
117 /* maybe some vertical spaces */
119 /* the labelwidthstring used in lists */
123 /* some pagebreaks? */
127 /* what about the alignment */
129 // runparams.linelen <= 0 is special and means we don't have paragraph breaks
131 string::size_type currlinelen = 0;
133 if (runparams.linelen > 0)
136 os << docstring(depth * 2, ' ');
137 currlinelen += depth * 2;
140 // we should probably change to the paragraph language in the
141 // gettext here (if possible) so that strings are output in
142 // the correct language! (20012712 Jug)
146 case 4: // (Sub)Paragraph
147 case 5: // Description
151 if (runparams.linelen > 0) {
152 os << _("Abstract") << "\n\n";
155 docstring const abst = _("Abstract: ");
157 currlinelen += abst.length();
161 case 7: // Bibliography
163 if (runparams.linelen > 0) {
164 os << _("References") << "\n\n";
167 docstring const refs = _("References: ");
169 currlinelen += refs.length();
176 docstring const label = par.params().labelString();
178 currlinelen += label.length() + 1;
185 pair<int, docstring> p = addDepth(depth, ltype_depth);
187 currlinelen += p.first;
190 // this is to change the linebreak to do it by word a bit more
191 // intelligent hopefully! (only in the case where we have a
192 // max runparams.linelength!) (Jug)
196 for (pos_type i = 0; i < par.size(); ++i) {
197 char_type c = par.getUChar(buf.params(), i);
199 case Paragraph::META_INSET: {
200 InsetBase const * inset = par.getInset(i);
201 if (runparams.linelen > 0) {
203 currlinelen += word.length();
206 OutputParams rp = runparams;
207 rp.depth = par.params().depth();
208 if (inset->plaintext(buf, os, rp)) {
209 // to be sure it breaks paragraph
210 currlinelen += runparams.linelen;
216 if (runparams.linelen > 0 &&
217 currlinelen + word.length() > runparams.linelen - 10) {
219 pair<int, docstring> p = addDepth(depth, ltype_depth);
221 currlinelen = p.first;
224 currlinelen += word.length() + 1;
229 lyxerr[Debug::INFO] <<
230 "writeAsciiFile: NULL char in structure." << endl;
235 if (runparams.linelen > 0 &&
236 currlinelen + word.length() > runparams.linelen)
239 pair<int, docstring> p = addDepth(depth, ltype_depth);
241 currlinelen = p.first;