]> git.lyx.org Git - lyx.git/blob - src/output_docbook.C
- Link against qt-mt333.lib which is what the current qt3 cvs produces
[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/convert.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() && 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 {
105         LyXLayout_ptr const & defaultstyle = buf.params().getLyXTextClass().defaultLayout();
106         for(ParagraphList::const_iterator par = pbegin; par != pend; ++par) {
107                 if (par->layout() == defaultstyle && par->emptyTag()) {
108                         par->simpleDocBookOnePar(buf, os, runparams, outerFont(par - paragraphs.begin(), paragraphs));
109                 } else {
110                         sgml::openTag(buf, os, runparams, *par);
111                         par->simpleDocBookOnePar(buf, os, runparams, outerFont(par - paragraphs.begin(), paragraphs));
112                         sgml::closeTag(os, *par);
113                         os << '\n';
114                 }
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         LyXLayout_ptr const & bstyle = par->layout();
130         string item_tag;
131
132         // Opening outter tag
133         sgml::openTag(buf, os, runparams, *pbegin);
134         os << '\n';
135         if (bstyle->latextype == LATEX_ENVIRONMENT && bstyle->pass_thru)
136                 os << "<![CDATA[";
137
138         while (par != pend) {
139                 LyXLayout_ptr const & style = par->layout();
140                 ParagraphList::const_iterator send;
141                 string id = par->getID(buf, runparams);
142                 string wrapper = "";
143                 pos_type sep = 0;
144
145                 // Opening inner tag
146                 switch (bstyle->latextype) {
147                 case LATEX_ENVIRONMENT:
148                         if (!bstyle->innertag().empty()) {
149                                 sgml::openTag(os, bstyle->innertag(), id);
150                         }
151                         break;
152
153                 case LATEX_ITEM_ENVIRONMENT:
154                         if (!bstyle->labeltag().empty()) {
155                                 sgml::openTag(os, bstyle->innertag(), id);
156                                 sgml::openTag(os, bstyle->labeltag());
157                                 sep = par->getFirstWord(buf, os, runparams) + 1;
158                                 sgml::closeTag(os, bstyle->labeltag());
159                         }
160                         wrapper = defaultstyle->latexname();
161                         sgml::openTag(os, bstyle->itemtag());
162                 default:
163                         break;
164                 }
165
166                 switch (style->latextype) {
167                 case LATEX_ENVIRONMENT:
168                 case LATEX_ITEM_ENVIRONMENT: {
169                         if(par->params().depth() == pbegin->params().depth()) {
170                                 sgml::openTag(os, wrapper);
171                                 par->simpleDocBookOnePar(buf, os, runparams, outerFont(par - paragraphs.begin(), paragraphs), sep);
172                                 sgml::closeTag(os, wrapper);
173                                 ++par;
174                         }
175                         else {
176                                 send = searchEnvironment(par, pend);
177                                 par = makeEnvironment(buf, os, runparams, paragraphs, par,send);
178                         }
179                         break;
180                 }
181                 case LATEX_PARAGRAPH:
182                         send = searchParagraph(par, pend);
183                         par = makeParagraph(buf, os, runparams, paragraphs, par,send);
184                         break;
185                 default:
186                         break;
187                 }
188
189                 // Closing inner tag
190                 switch (bstyle->latextype) {
191                 case LATEX_ENVIRONMENT:
192                         if (!bstyle->innertag().empty()) {
193                                 sgml::closeTag(os, bstyle->innertag());
194                                 os << '\n';
195                         }
196                         break;
197                 case LATEX_ITEM_ENVIRONMENT:
198                         sgml::closeTag(os, bstyle->itemtag());
199                         if (!bstyle->labeltag().empty())
200                                 sgml::closeTag(os, bstyle->innertag());
201                         break;
202                 default:
203                         break;
204                 }
205         }
206
207         if (bstyle->latextype == LATEX_ENVIRONMENT && bstyle->pass_thru)
208                 os << "]]>";
209
210         // Closing outter tag
211         sgml::closeTag(os, *pbegin);
212
213         return pend;
214 }
215
216
217 ParagraphList::const_iterator makeCommand(Buffer const & buf,
218                                           ostream & os,
219                                           OutputParams const & runparams,
220                                           ParagraphList const & paragraphs,
221                                           ParagraphList::const_iterator const & pbegin,
222                                           ParagraphList::const_iterator const & pend)
223 {
224         ParagraphList::const_iterator par = pbegin;
225         LyXLayout_ptr const & bstyle = par->layout();
226
227         //Open outter tag
228         sgml::openTag(buf, os, runparams, *pbegin);
229         os << '\n';
230
231         // Label around sectioning number:
232         if (!bstyle->labeltag().empty()) {
233                 sgml::openTag(os, bstyle->labeltag());
234                 os << expandLabel(buf.params().getLyXTextClass(), bstyle, false);
235                 sgml::closeTag(os, bstyle->labeltag());
236         }
237
238         // Opend inner tag and  close inner tags
239         sgml::openTag(os, bstyle->innertag());
240         par->simpleDocBookOnePar(buf, os, runparams,  outerFont(par - paragraphs.begin(), paragraphs));
241         sgml::closeTag(os, bstyle->innertag());
242         os << '\n';
243
244         ++par;
245         while (par != pend) {
246                 LyXLayout_ptr const & style = par->layout();
247                 ParagraphList::const_iterator send;
248
249                 switch (style->latextype) {
250                 case LATEX_COMMAND: {
251                         send = searchCommand(par, pend);
252                         par = makeCommand(buf, os, runparams, paragraphs, par,send);
253                         break;
254                 }
255                 case LATEX_ENVIRONMENT:
256                 case LATEX_ITEM_ENVIRONMENT: {
257                         send = searchEnvironment(par, pend);
258                         par = makeEnvironment(buf, os, runparams, paragraphs, par,send);
259                         break;
260                 }
261                 case LATEX_PARAGRAPH:
262                         send = searchParagraph(par, pend);
263                         par = makeParagraph(buf, os, runparams, paragraphs, par,send);
264                         break;
265                 default:
266                         break;
267                 }
268         }
269         // Close outter tag
270         sgml::closeTag(os, *pbegin);
271
272         return pend;
273 }
274
275 } // end anonym namespace
276
277
278 void docbookParagraphs(ParagraphList const & paragraphs,
279                        Buffer const & buf,
280                        ostream & os,
281                        OutputParams const & runparams)
282 {
283         ParagraphList::const_iterator par = paragraphs.begin();
284         ParagraphList::const_iterator pend = paragraphs.end();
285
286         while (par != pend) {
287                 LyXLayout_ptr const & style = par->layout();
288                 ParagraphList::const_iterator send;
289
290                 switch (style->latextype) {
291                 case LATEX_COMMAND: {
292                         send = searchCommand(par, pend);
293                         par = makeCommand(buf, os, runparams, paragraphs, par,send);
294                         break;
295                 }
296                 case LATEX_ENVIRONMENT:
297                 case LATEX_ITEM_ENVIRONMENT: {
298                         send = searchEnvironment(par, pend);
299                         par = makeEnvironment(buf, os, runparams, paragraphs, par,send);
300                         break;
301                 }
302                 case LATEX_PARAGRAPH:
303                         send = searchParagraph(par, pend);
304                         par = makeParagraph(buf, os, runparams, paragraphs, par,send);
305                         break;
306                 default:
307                         break;
308                 }
309         }
310 }