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