2 * \file output_plaintext.cpp
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"
21 #include "OutputParams.h"
22 #include "Paragraph.h"
23 #include "ParagraphList.h"
24 #include "ParagraphParameters.h"
26 #include "support/lstrings.h"
31 using support::ascii_lowercase
;
32 using support::compare_ascii_no_case
;
33 using support::contains
;
34 using support::FileName
;
42 void writePlaintextFile(Buffer
const & buf
, FileName
const & fname
,
43 OutputParams
const & runparams
)
46 if (!openFileWrite(ofs
, fname
))
48 writePlaintextFile(buf
, ofs
, runparams
);
52 void writePlaintextFile(Buffer
const & buf
, odocstream
& os
,
53 OutputParams
const & runparams
)
55 bool ref_printed
= false;
56 ParagraphList
const par
= buf
.paragraphs();
57 ParagraphList::const_iterator beg
= par
.begin();
58 ParagraphList::const_iterator end
= par
.end();
59 ParagraphList::const_iterator it
= beg
;
60 for (; it
!= end
; ++it
) {
61 writePlaintextParagraph(buf
, *it
, os
, runparams
, ref_printed
);
63 if (runparams
.linelen
> 0)
71 pair
<int, docstring
> const addDepth(int depth
, int ldepth
)
75 d
+= (ldepth
- depth
) * 2;
76 return make_pair(d
, docstring(d
, ' '));
82 void writePlaintextParagraph(Buffer
const & buf
,
83 Paragraph
const & par
,
85 OutputParams
const & runparams
,
89 depth_type ltype_depth
= 0;
90 depth_type depth
= par
.params().depth();
92 // First write the layout
93 string
const tmp
= to_utf8(par
.layout()->name());
94 if (compare_ascii_no_case(tmp
, "itemize") == 0) {
96 ltype_depth
= depth
+ 1;
97 } else if (compare_ascii_no_case(tmp
, "enumerate") == 0) {
99 ltype_depth
= depth
+ 1;
100 } else if (contains(ascii_lowercase(tmp
), "ection")) {
102 ltype_depth
= depth
+ 1;
103 } else if (contains(ascii_lowercase(tmp
), "aragraph")) {
105 ltype_depth
= depth
+ 1;
106 } else if (compare_ascii_no_case(tmp
, "description") == 0) {
108 ltype_depth
= depth
+ 1;
109 } else if (compare_ascii_no_case(tmp
, "abstract") == 0) {
112 } else if (compare_ascii_no_case(tmp
, "bibliography") == 0) {
120 /* the labelwidthstring used in lists */
124 /* what about the alignment */
126 // runparams.linelen == 0 is special and means we don't have paragraph breaks
128 string::size_type currlinelen
= 0;
130 os
<< docstring(depth
* 2, ' ');
131 currlinelen
+= depth
* 2;
134 // we should probably change to the paragraph language in the
135 // gettext here (if possible) so that strings are output in
136 // the correct language! (20012712 Jug)
140 case 4: // (Sub)Paragraph
141 case 5: // Description
145 if (runparams
.linelen
> 0) {
146 os
<< buf
.B_("Abstract") << "\n\n";
149 docstring
const abst
= buf
.B_("Abstract: ");
151 currlinelen
+= abst
.length();
155 case 7: // Bibliography
157 if (runparams
.linelen
> 0) {
158 os
<< buf
.B_("References") << "\n\n";
161 docstring
const refs
= buf
.B_("References: ");
163 currlinelen
+= refs
.length();
170 docstring
const label
= par
.params().labelString();
171 if (!label
.empty()) {
173 currlinelen
+= label
.length() + 1;
180 if (currlinelen
== 0) {
181 pair
<int, docstring
> p
= addDepth(depth
, ltype_depth
);
183 currlinelen
+= p
.first
;
188 for (pos_type i
= 0; i
< par
.size(); ++i
) {
189 // deleted characters don't make much sense in plain text output
190 if (par
.isDeleted(i
))
193 char_type c
= par
.getUChar(buf
.params(), i
);
195 if (c
== Paragraph::META_INSET
|| c
== ' ') {
196 if (runparams
.linelen
> 0 &&
197 currlinelen
+ word
.length() > runparams
.linelen
) {
199 pair
<int, docstring
> p
= addDepth(depth
, ltype_depth
);
201 currlinelen
= p
.first
;
204 currlinelen
+= word
.length();
209 case Paragraph::META_INSET
: {
210 OutputParams rp
= runparams
;
211 rp
.depth
= par
.params().depth();
212 int len
= par
.getInset(i
)->plaintext(buf
, os
, rp
);
213 if (len
>= Inset::PLAINTEXT_NEWLINE
)
214 currlinelen
= len
- Inset::PLAINTEXT_NEWLINE
;
226 LYXERR(Debug::INFO
) <<
227 "writePlaintextFile: NULL char in structure." << endl
;
236 // currlinelen may be greater than runparams.linelen!
237 // => check whether word is empty and do nothing in this case
239 if (runparams
.linelen
> 0 &&
240 currlinelen
+ word
.length() > runparams
.linelen
) {
242 pair
<int, docstring
> p
= addDepth(depth
, ltype_depth
);
244 currlinelen
= p
.first
;