]> git.lyx.org Git - lyx.git/blob - src/output_docbook.C
Fix description paragraph. (docbook)
[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().find('#') != string::npos) {
238                 counters.step(bstyle->counter);
239         }
240         
241         if (!bstyle->latexparam().empty()) {
242                 id = bstyle->latexparam();
243                 if (id.find('#') != string::npos) {
244                         string el = expandLabel(buf.params().getLyXTextClass(),
245                                                 bstyle, false);
246                         id = subst(id, "#", el);
247                 }
248         }
249
250         //Open outter tag
251         sgml::openTag(buf, os, depth, false, bstyle->latexname(), id);
252         os << '\n';
253
254         // Label around sectioning number:
255         if (!bstyle->labeltag().empty()) {
256                 sgml::openTag(buf, os, depth, false, bstyle->labeltag());
257                 os << expandLabel(buf.params().getLyXTextClass(), bstyle, false);
258                 sgml::closeTag(os, depth, false, bstyle->labeltag());
259         }
260         
261         // Opend inner tag
262         sgml::openTag(buf, os, depth, true, bstyle->innertag());
263
264         par->simpleDocBookOnePar(buf, os, runparams,  outerFont(par - paragraphs.begin(), paragraphs));
265
266         // Close inner tags
267         sgml::closeTag(os, depth, true, bstyle->innertag());
268         os << '\n';
269         
270         ++par;
271         while (par != pend) {
272                 LyXLayout_ptr const & style = par->layout();
273                 ParagraphList::const_iterator send;
274
275                 switch (style->latextype) {
276                 case LATEX_COMMAND: {
277                         send = searchCommand(par, pend);
278                         par = makeCommand(buf, os, runparams, paragraphs, par,send);
279                         break;
280                 }
281                 case LATEX_ENVIRONMENT:
282                 case LATEX_ITEM_ENVIRONMENT: {
283                         send = searchEnvironment(par, pend);
284                         par = makeEnvironment(buf, os, runparams, paragraphs, par,send);
285                         break;
286                 }
287                 case LATEX_PARAGRAPH:
288                         send = searchParagraph(par, pend);
289                         par = makeParagraph(buf, os, runparams, paragraphs, par,send);
290                         break;
291                 default:
292                         break;
293                 }
294         }
295
296         // Close outter tag
297         sgml::closeTag(os, depth, false, bstyle->latexname());
298
299         return pend;
300 }
301
302 } // end anonym namespace
303
304
305 void docbookParagraphs(ParagraphList const & paragraphs,
306                        Buffer const & buf,
307                        ostream & os,
308                        OutputParams const & runparams)
309 {
310         ParagraphList::const_iterator par = paragraphs.begin();
311         ParagraphList::const_iterator pend = paragraphs.end();
312
313         while (par != pend) {
314                 LyXLayout_ptr const & style = par->layout();
315                 ParagraphList::const_iterator send;
316
317                 switch (style->latextype) {
318                 case LATEX_COMMAND: {
319                         send = searchCommand(par, pend);
320                         par = makeCommand(buf, os, runparams, paragraphs, par,send);
321                         break;
322                 }
323                 case LATEX_ENVIRONMENT:
324                 case LATEX_ITEM_ENVIRONMENT: {
325                         send = searchEnvironment(par, pend);
326                         par = makeEnvironment(buf, os, runparams, paragraphs, par,send);
327                         break;
328                 }
329                 case LATEX_PARAGRAPH:
330                         send = searchParagraph(par, pend);
331                         par = makeParagraph(buf, os, runparams, paragraphs, par,send);
332                         break;
333                 default:
334                         break;
335                 }
336         }
337 }