]> git.lyx.org Git - lyx.git/blob - src/output_docbook.C
Move paragraph counting to a single place. (SGML/XML)
[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
32 #ifdef HAVE_LOCALE
33 #endif
34
35 using lyx::support::subst;
36
37 using std::endl;
38 using std::ostream;
39 using std::vector;
40 using std::string;
41
42 namespace {
43
44 ParagraphList::const_iterator searchParagraph(ParagraphList::const_iterator const & par,
45                                               ParagraphList::const_iterator const & pend)
46 {
47         ParagraphList::const_iterator p = par + 1;
48
49         for( ; p != pend && p->layout()->latextype == LATEX_PARAGRAPH; ++p);
50
51         return p;
52 }
53
54
55 ParagraphList::const_iterator searchCommand(ParagraphList::const_iterator const & par,
56                                             ParagraphList::const_iterator const & pend)
57 {
58         LyXLayout_ptr const & bstyle = par->layout();
59         ParagraphList::const_iterator p = par + 1;
60
61         for( ; p != pend; ++p) {
62                 LyXLayout_ptr const & style = p->layout();
63                 if( style->latextype == LATEX_COMMAND && style->commanddepth <= bstyle->commanddepth)
64                         return p;
65         }
66         return pend;
67 }
68
69
70 ParagraphList::const_iterator searchEnvironment(ParagraphList::const_iterator const & par,
71                                                 ParagraphList::const_iterator const & pend)
72 {
73         LyXLayout_ptr const & bstyle = par->layout();
74         ParagraphList::const_iterator p = par + 1;
75         for( ; p != pend; ++p) {
76                 LyXLayout_ptr const & style = p->layout();
77                 if( style->latextype == LATEX_COMMAND)
78                         return p;
79
80                 if( style->latextype == LATEX_PARAGRAPH) {
81                         if (p->params().depth() > par->params().depth())
82                                 continue;
83                         return p;
84                 }
85
86                 if(p->params().depth() < par->params().depth())
87                         return p;
88
89                 if( style->latexname() != bstyle->latexname() and p->params().depth() == par->params().depth() )
90                         return p;
91         }
92         return pend;
93 }
94
95
96 ParagraphList::const_iterator makeParagraph(Buffer const & buf,
97                                             ostream & os,
98                                             OutputParams const & runparams,
99                                             ParagraphList const & paragraphs,
100                                             ParagraphList::const_iterator const & pbegin,
101                                             ParagraphList::const_iterator const & pend) {
102         ParagraphList::const_iterator par = pbegin;
103         const int depth = 0;
104         for(; par != pend; ++par) {
105                 LyXLayout_ptr const & style = par->layout();
106                 string id = par->getDocbookId();
107                 id = id.empty()? "": " id = \"" + id + "\"";
108
109                 sgml::openTag(buf, os, depth, true, style->latexname(), id);
110                 par->simpleDocBookOnePar(buf, os, outerFont(par - paragraphs.begin(), paragraphs), runparams, depth);
111         
112                 sgml::closeTag(os, depth, true, style->latexname());
113                 os << '\n';
114         }
115         return pend;
116 }
117
118
119 ParagraphList::const_iterator makeEnvironment(Buffer const & buf,
120                                               ostream & os,
121                                               OutputParams const & runparams,
122                                               ParagraphList const & paragraphs,
123                                               ParagraphList::const_iterator const & pbegin,
124                                               ParagraphList::const_iterator const & pend) {
125         ParagraphList::const_iterator par = pbegin;
126
127         LyXLayout_ptr const & defaultstyle = buf.params().getLyXTextClass().defaultLayout();
128         const int depth = 0;
129
130         LyXLayout_ptr const & bstyle = par->layout();
131         string item_tag;
132         
133         string id = par->getDocbookId();
134         string env_name = bstyle->latexname();
135         // Opening outter tag
136         sgml::openTag(buf, os, depth, false, env_name, bstyle->latexparam() + id);
137         os << '\n';
138         if (bstyle->latextype == LATEX_ENVIRONMENT and bstyle->innertag() == "CDATA")
139                 os << "<![CDATA[";
140
141         while (par != pend) {
142                 LyXLayout_ptr const & style = par->layout();
143                 string id = "";
144                 ParagraphList::const_iterator send;
145                 string wrapper = "";
146
147                 // Opening inner tag
148                 switch (bstyle->latextype) {
149                 case LATEX_ENVIRONMENT:
150                         if (!bstyle->innertag().empty() and bstyle->innertag() != "CDATA") {
151                                 sgml::openTag(buf, os, depth, true, bstyle->innertag());
152                         }
153                         break;
154
155                 case LATEX_ITEM_ENVIRONMENT:
156                         if (!bstyle->labeltag().empty()) {
157                                 sgml::openTag(buf, os, depth, true, bstyle->labeltag());
158                         } else {
159                                 wrapper = defaultstyle->latexname();
160                                 sgml::openTag(buf, os, depth, true, bstyle->itemtag());
161                         }
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(buf, os, depth, true, wrapper, id);
171                                 par->simpleDocBookOnePar(buf, os, outerFont(par - paragraphs.begin(), paragraphs), runparams, depth);
172                                 sgml::closeTag(os, depth, true, 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() and bstyle->innertag() != "CDATA") {
193                                 sgml::closeTag(os, depth, true, bstyle->innertag());
194                                 os << '\n';
195                         }
196                         break;
197                 case LATEX_ITEM_ENVIRONMENT:
198                         sgml::closeTag(os, depth, true, bstyle->itemtag());
199                         break;
200                 default:
201                         break;
202                 }
203         }
204
205         if (bstyle->latextype == LATEX_ENVIRONMENT and bstyle->innertag() == "CDATA")
206                 os << "]]>";
207
208         // Closing outter tag
209         sgml::closeTag(os, depth, false, env_name);
210
211         return pend;
212 }
213
214
215 ParagraphList::const_iterator makeCommand(Buffer const & buf,
216                                           ostream & os,
217                                           OutputParams const & runparams,
218                                           ParagraphList const & paragraphs,
219                                           ParagraphList::const_iterator const & pbegin,
220                                           ParagraphList::const_iterator const & pend)
221 {
222         Paragraph::depth_type depth = 0; // paragraph depth
223
224         ParagraphList::const_iterator par = pbegin;
225         Counters & counters = buf.params().getLyXTextClass().counters();
226         LyXLayout_ptr const & bstyle = par->layout();
227         
228         string id = par->getDocbookId();
229         id = id.empty()? "" : " id = \"" + id + "\"";
230
231         if (bstyle->latexparam().find('#') != string::npos) {
232                 counters.step(bstyle->counter);
233         }
234         
235         if (!bstyle->latexparam().empty()) {
236                 id = bstyle->latexparam();
237                 if (id.find('#') != string::npos) {
238                         string el = expandLabel(buf.params().getLyXTextClass(),
239                                                 bstyle, false);
240                         id = subst(id, "#", el);
241                 }
242         }
243
244         //Open outter tag
245         sgml::openTag(buf, os, depth, false, bstyle->latexname(), id);
246         os << '\n';
247
248         // Label around sectioning number:
249         if (!bstyle->labeltag().empty()) {
250                 sgml::openTag(buf, os, depth, false, bstyle->labeltag());
251                 os << expandLabel(buf.params().getLyXTextClass(), bstyle, false);
252                 sgml::closeTag(os, depth, false, bstyle->labeltag());
253         }
254         
255         // Opend inner tag
256         sgml::openTag(buf, os, depth, true, bstyle->innertag());
257
258         par->simpleDocBookOnePar(buf, os, outerFont(par - paragraphs.begin(), paragraphs),
259                                  runparams, depth);
260
261         // Close inner tags
262         sgml::closeTag(os, depth, true, bstyle->innertag());
263         os << '\n';
264         
265         ++par;
266         while (par != pend) {
267                 LyXLayout_ptr const & style = par->layout();
268                 ParagraphList::const_iterator send;
269
270                 switch (style->latextype) {
271                 case LATEX_COMMAND: {
272                         send = searchCommand(par, pend);
273                         par = makeCommand(buf, os, runparams, paragraphs, par,send);
274                         break;
275                 }
276                 case LATEX_ENVIRONMENT:
277                 case LATEX_ITEM_ENVIRONMENT: {
278                         send = searchEnvironment(par, pend);
279                         par = makeEnvironment(buf, os, runparams, paragraphs, par,send);
280                         break;
281                 }
282                 case LATEX_PARAGRAPH:
283                         send = searchParagraph(par, pend);
284                         par = makeParagraph(buf, os, runparams, paragraphs, par,send);
285                         break;
286                 default:
287                         break;
288                 }
289         }
290
291         // Close outter tag
292         sgml::closeTag(os, depth, false, bstyle->latexname());
293
294         return pend;
295 }
296
297 } // end anonym namespace
298
299
300 void docbookParagraphs(ParagraphList const & paragraphs,
301                        Buffer const & buf,
302                        ostream & os,
303                        OutputParams const & runparams)
304 {
305         ParagraphList::const_iterator par = paragraphs.begin();
306         ParagraphList::const_iterator pend = paragraphs.end();
307
308         while (par != pend) {
309                 LyXLayout_ptr const & style = par->layout();
310                 ParagraphList::const_iterator send;
311
312                 switch (style->latextype) {
313                 case LATEX_COMMAND: {
314                         send = searchCommand(par, pend);
315                         par = makeCommand(buf, os, runparams, paragraphs, par,send);
316                         break;
317                 }
318                 case LATEX_ENVIRONMENT:
319                 case LATEX_ITEM_ENVIRONMENT: {
320                         send = searchEnvironment(par, pend);
321                         par = makeEnvironment(buf, os, runparams, paragraphs, par,send);
322                         break;
323                 }
324                 case LATEX_PARAGRAPH:
325                         send = searchParagraph(par, pend);
326                         par = makeParagraph(buf, os, runparams, paragraphs, par,send);
327                         break;
328                 default:
329                         break;
330                 }
331         }
332 }