]> git.lyx.org Git - lyx.git/blob - src/output_docbook.C
merge two if's that tested the same condition.
[lyx.git] / src / output_docbook.C
1 /**
2  * \file output_docbook.C
3  * This file is part of LyX, the document processor.
4  * Licence details can be found in the file COPYING.
5  *
6  * \author Lars Gullik Bjønnes
7  * \author José Matos
8  *
9  * Full author contact details are available in file CREDITS.
10  */
11
12 #include <config.h>
13
14 #include "output_docbook.h"
15
16 #include "buffer.h"
17 #include "bufferparams.h"
18 #include "counters.h"
19 #include "debug.h"
20 #include "lyxtext.h"
21 #include "paragraph.h"
22 #include "paragraph_funcs.h"
23 #include "ParagraphParameters.h"
24 #include "sgml.h"
25
26 #include "insets/insetcommand.h"
27
28 #include "support/lstrings.h"
29 #include "support/lyxlib.h"
30 #include "support/tostr.h"
31 #include "support/types.h"
32
33 #ifdef HAVE_LOCALE
34 #endif
35
36 using lyx::pos_type;
37 using lyx::support::subst;
38
39 using std::endl;
40 using std::ostream;
41 using std::vector;
42 using std::string;
43
44 namespace {
45
46 ParagraphList::const_iterator searchParagraph(ParagraphList::const_iterator const & par,
47                                               ParagraphList::const_iterator const & pend)
48 {
49         ParagraphList::const_iterator p = par + 1;
50
51         for( ; p != pend && p->layout()->latextype == LATEX_PARAGRAPH; ++p);
52
53         return p;
54 }
55
56
57 ParagraphList::const_iterator searchCommand(ParagraphList::const_iterator const & par,
58                                             ParagraphList::const_iterator const & pend)
59 {
60         LyXLayout_ptr const & bstyle = par->layout();
61         ParagraphList::const_iterator p = par + 1;
62
63         for( ; p != pend; ++p) {
64                 LyXLayout_ptr const & style = p->layout();
65                 if( style->latextype == LATEX_COMMAND && style->commanddepth <= bstyle->commanddepth)
66                         return p;
67         }
68         return pend;
69 }
70
71
72 ParagraphList::const_iterator searchEnvironment(ParagraphList::const_iterator const & par,
73                                                 ParagraphList::const_iterator const & pend)
74 {
75         LyXLayout_ptr const & bstyle = par->layout();
76         ParagraphList::const_iterator p = par + 1;
77         for( ; p != pend; ++p) {
78                 LyXLayout_ptr const & style = p->layout();
79                 if( style->latextype == LATEX_COMMAND)
80                         return p;
81
82                 if( style->latextype == LATEX_PARAGRAPH) {
83                         if (p->params().depth() > par->params().depth())
84                                 continue;
85                         return p;
86                 }
87
88                 if(p->params().depth() < par->params().depth())
89                         return p;
90
91                 if( style->latexname() != bstyle->latexname() and p->params().depth() == par->params().depth() )
92                         return p;
93         }
94         return pend;
95 }
96
97
98 ParagraphList::const_iterator makeParagraph(Buffer const & buf,
99                                             ostream & os,
100                                             OutputParams const & runparams,
101                                             ParagraphList const & paragraphs,
102                                             ParagraphList::const_iterator const & pbegin,
103                                             ParagraphList::const_iterator const & pend) {
104         ParagraphList::const_iterator par = pbegin;
105         const int depth = 0;
106         for(; par != pend; ++par) {
107                 LyXLayout_ptr const & style = par->layout();
108                 string id = par->getDocbookId();
109                 id = id.empty()? "": " id = \"" + id + "\"";
110
111                 sgml::openTag(buf, os, depth, true, style->latexname(), id);
112                 par->simpleDocBookOnePar(buf, os, runparams, outerFont(par - paragraphs.begin(), paragraphs));
113                 sgml::closeTag(os, depth, true, style->latexname());
114                 os << '\n';
115         }
116         return pend;
117 }
118
119
120 ParagraphList::const_iterator makeEnvironment(Buffer const & buf,
121                                               ostream & os,
122                                               OutputParams const & runparams,
123                                               ParagraphList const & paragraphs,
124                                               ParagraphList::const_iterator const & pbegin,
125                                               ParagraphList::const_iterator const & pend) {
126         ParagraphList::const_iterator par = pbegin;
127
128         LyXLayout_ptr const & defaultstyle = buf.params().getLyXTextClass().defaultLayout();
129         const int depth = 0;
130
131         LyXLayout_ptr const & bstyle = par->layout();
132         string item_tag;
133         
134         string id = par->getDocbookId();
135         string env_name = bstyle->latexname();
136         // Opening outter tag
137         sgml::openTag(buf, os, depth, false, env_name, bstyle->latexparam() + id);
138         os << '\n';
139         if (bstyle->latextype == LATEX_ENVIRONMENT and bstyle->innertag() == "CDATA")
140                 os << "<![CDATA[";
141
142         while (par != pend) {
143                 LyXLayout_ptr const & style = par->layout();
144                 string id = "";
145                 ParagraphList::const_iterator send;
146                 string wrapper = "";
147                 pos_type sep = 0;
148
149                 // Opening inner tag
150                 switch (bstyle->latextype) {
151                 case LATEX_ENVIRONMENT:
152                         if (!bstyle->innertag().empty() and bstyle->innertag() != "CDATA") {
153                                 sgml::openTag(buf, os, depth, true, bstyle->innertag());
154                         }
155                         break;
156
157                 case LATEX_ITEM_ENVIRONMENT:
158                         if (!bstyle->labeltag().empty()) {
159                                 sgml::openTag(buf, os, depth, true, bstyle->innertag());
160                                 sgml::openTag(buf, os, depth, true, bstyle->labeltag());
161                                 sep = par->getFirstWord(buf, os, runparams) + 1;
162                                 sgml::closeTag(os, depth, true, bstyle->labeltag());
163                         }
164                         wrapper = defaultstyle->latexname();
165                         sgml::openTag(buf, os, depth, true, bstyle->itemtag());
166                 default:
167                         break;
168                 }
169
170                 switch (style->latextype) {
171                 case LATEX_ENVIRONMENT:
172                 case LATEX_ITEM_ENVIRONMENT: {
173                         if(par->params().depth() == pbegin->params().depth()) {
174                                 sgml::openTag(buf, os, depth, true, wrapper, id);
175                                 par->simpleDocBookOnePar(buf, os, runparams, outerFont(par - paragraphs.begin(), paragraphs), sep);
176                                 sgml::closeTag(os, depth, true, wrapper);
177                                 ++par;
178                         }
179                         else {
180                                 send = searchEnvironment(par, pend);
181                                 par = makeEnvironment(buf, os, runparams, paragraphs, par,send);
182                         }
183                         break;
184                 }
185                 case LATEX_PARAGRAPH:
186                         send = searchParagraph(par, pend);
187                         par = makeParagraph(buf, os, runparams, paragraphs, par,send);
188                         break;
189                 default:
190                         break;
191                 }
192
193                 // Closing inner tag
194                 switch (bstyle->latextype) {
195                 case LATEX_ENVIRONMENT:
196                         if (!bstyle->innertag().empty() and bstyle->innertag() != "CDATA") {
197                                 sgml::closeTag(os, depth, true, bstyle->innertag());
198                                 os << '\n';
199                         }
200                         break;
201                 case LATEX_ITEM_ENVIRONMENT:
202                         sgml::closeTag(os, depth, true, bstyle->itemtag());
203                         if (!bstyle->labeltag().empty())
204                                 sgml::closeTag(os, depth, true, bstyle->innertag());
205                         break;
206                 default:
207                         break;
208                 }
209         }
210
211         if (bstyle->latextype == LATEX_ENVIRONMENT and bstyle->innertag() == "CDATA")
212                 os << "]]>";
213
214         // Closing outter tag
215         sgml::closeTag(os, depth, false, env_name);
216
217         return pend;
218 }
219
220
221 ParagraphList::const_iterator makeCommand(Buffer const & buf,
222                                           ostream & os,
223                                           OutputParams const & runparams,
224                                           ParagraphList const & paragraphs,
225                                           ParagraphList::const_iterator const & pbegin,
226                                           ParagraphList::const_iterator const & pend)
227 {
228         Paragraph::depth_type depth = 0; // paragraph depth
229
230         ParagraphList::const_iterator par = pbegin;
231         Counters & counters = buf.params().getLyXTextClass().counters();
232         LyXLayout_ptr const & bstyle = par->layout();
233         
234         string id = par->getDocbookId();
235         id = id.empty()? "" : " id = \"" + id + "\"";
236
237         if (!bstyle->latexparam().empty()) {
238                 counters.step(bstyle->counter);
239                 id = bstyle->latexparam();
240                 if (id.find('#') != string::npos) {
241                         string el = expandLabel(buf.params().getLyXTextClass(),
242                                                 bstyle, false);
243                         id = subst(id, "#", el);
244                 }
245         }
246
247         //Open outter tag
248         sgml::openTag(buf, os, depth, false, bstyle->latexname(), id);
249         os << '\n';
250
251         // Label around sectioning number:
252         if (!bstyle->labeltag().empty()) {
253                 sgml::openTag(buf, os, depth, false, bstyle->labeltag());
254                 os << expandLabel(buf.params().getLyXTextClass(), bstyle, false);
255                 sgml::closeTag(os, depth, false, bstyle->labeltag());
256         }
257         
258         // Opend inner tag
259         sgml::openTag(buf, os, depth, true, bstyle->innertag());
260
261         par->simpleDocBookOnePar(buf, os, runparams,  outerFont(par - paragraphs.begin(), paragraphs));
262
263         // Close inner tags
264         sgml::closeTag(os, depth, true, bstyle->innertag());
265         os << '\n';
266         
267         ++par;
268         while (par != pend) {
269                 LyXLayout_ptr const & style = par->layout();
270                 ParagraphList::const_iterator send;
271
272                 switch (style->latextype) {
273                 case LATEX_COMMAND: {
274                         send = searchCommand(par, pend);
275                         par = makeCommand(buf, os, runparams, paragraphs, par,send);
276                         break;
277                 }
278                 case LATEX_ENVIRONMENT:
279                 case LATEX_ITEM_ENVIRONMENT: {
280                         send = searchEnvironment(par, pend);
281                         par = makeEnvironment(buf, os, runparams, paragraphs, par,send);
282                         break;
283                 }
284                 case LATEX_PARAGRAPH:
285                         send = searchParagraph(par, pend);
286                         par = makeParagraph(buf, os, runparams, paragraphs, par,send);
287                         break;
288                 default:
289                         break;
290                 }
291         }
292
293         // Close outter tag
294         sgml::closeTag(os, depth, false, bstyle->latexname());
295
296         return pend;
297 }
298
299 } // end anonym namespace
300
301
302 void docbookParagraphs(ParagraphList const & paragraphs,
303                        Buffer const & buf,
304                        ostream & os,
305                        OutputParams const & runparams)
306 {
307         ParagraphList::const_iterator par = paragraphs.begin();
308         ParagraphList::const_iterator pend = paragraphs.end();
309
310         while (par != pend) {
311                 LyXLayout_ptr const & style = par->layout();
312                 ParagraphList::const_iterator send;
313
314                 switch (style->latextype) {
315                 case LATEX_COMMAND: {
316                         send = searchCommand(par, pend);
317                         par = makeCommand(buf, os, runparams, paragraphs, par,send);
318                         break;
319                 }
320                 case LATEX_ENVIRONMENT:
321                 case LATEX_ITEM_ENVIRONMENT: {
322                         send = searchEnvironment(par, pend);
323                         par = makeEnvironment(buf, os, runparams, paragraphs, par,send);
324                         break;
325                 }
326                 case LATEX_PARAGRAPH:
327                         send = searchParagraph(par, pend);
328                         par = makeParagraph(buf, os, runparams, paragraphs, par,send);
329                         break;
330                 default:
331                         break;
332                 }
333         }
334 }