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.
6 * \author Lars Gullik Bjønnes
9 * Full author contact details are available in file CREDITS.
14 #include "output_docbook.h"
17 #include "bufferparams.h"
21 #include "paragraph.h"
22 #include "paragraph_funcs.h"
23 #include "ParagraphParameters.h"
26 #include "insets/insetcommand.h"
28 #include "support/lstrings.h"
29 #include "support/lyxlib.h"
30 #include "support/tostr.h"
35 using lyx::support::subst;
44 ParagraphList::const_iterator searchParagraph(ParagraphList::const_iterator const & par,
45 ParagraphList::const_iterator const & pend)
47 ParagraphList::const_iterator p = par + 1;
49 for( ; p != pend && p->layout()->latextype == LATEX_PARAGRAPH; ++p);
55 ParagraphList::const_iterator searchCommand(ParagraphList::const_iterator const & par,
56 ParagraphList::const_iterator const & pend)
58 LyXLayout_ptr const & bstyle = par->layout();
59 ParagraphList::const_iterator p = par + 1;
61 for( ; p != pend; ++p) {
62 LyXLayout_ptr const & style = p->layout();
63 if( style->latextype == LATEX_COMMAND && style->commanddepth <= bstyle->commanddepth)
70 ParagraphList::const_iterator searchEnvironment(ParagraphList::const_iterator const & par,
71 ParagraphList::const_iterator const & pend)
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)
80 if( style->latextype == LATEX_PARAGRAPH) {
81 if (p->params().depth() > par->params().depth())
86 if(p->params().depth() < par->params().depth())
89 if( style->latexname() != bstyle->latexname() and p->params().depth() == par->params().depth() )
96 ParagraphList::const_iterator makeParagraph(Buffer const & buf,
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;
104 for(; par != pend; ++par) {
105 LyXLayout_ptr const & style = par->layout();
106 string id = par->getDocbookId();
107 id = id.empty()? "": " id = \"" + id + "\"";
109 sgml::openTag(buf, os, depth, true, style->latexname(), id);
110 par->simpleDocBookOnePar(buf, os, outerFont(par - paragraphs.begin(), paragraphs), runparams, depth);
112 sgml::closeTag(os, depth, true, style->latexname());
119 ParagraphList::const_iterator makeEnvironment(Buffer const & buf,
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;
127 LyXLayout_ptr const & defaultstyle = buf.params().getLyXTextClass().defaultLayout();
130 LyXLayout_ptr const & bstyle = par->layout();
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);
138 if (bstyle->latextype == LATEX_ENVIRONMENT and bstyle->innertag() == "CDATA")
141 while (par != pend) {
142 LyXLayout_ptr const & style = par->layout();
144 ParagraphList::const_iterator send;
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());
155 case LATEX_ITEM_ENVIRONMENT:
156 if (!bstyle->labeltag().empty()) {
157 sgml::openTag(buf, os, depth, true, bstyle->labeltag());
159 wrapper = defaultstyle->latexname();
160 sgml::openTag(buf, os, depth, true, bstyle->itemtag());
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);
176 send = searchEnvironment(par, pend);
177 par = makeEnvironment(buf, os, runparams, paragraphs, par,send);
181 case LATEX_PARAGRAPH:
182 send = searchParagraph(par, pend);
183 par = makeParagraph(buf, os, runparams, paragraphs, par,send);
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());
197 case LATEX_ITEM_ENVIRONMENT:
198 sgml::closeTag(os, depth, true, bstyle->itemtag());
205 if (bstyle->latextype == LATEX_ENVIRONMENT and bstyle->innertag() == "CDATA")
208 // Closing outter tag
209 sgml::closeTag(os, depth, false, env_name);
215 ParagraphList::const_iterator makeCommand(Buffer const & buf,
217 OutputParams const & runparams,
218 ParagraphList const & paragraphs,
219 ParagraphList::const_iterator const & pbegin,
220 ParagraphList::const_iterator const & pend)
222 Paragraph::depth_type depth = 0; // paragraph depth
224 ParagraphList::const_iterator par = pbegin;
225 Counters & counters = buf.params().getLyXTextClass().counters();
226 LyXLayout_ptr const & bstyle = par->layout();
228 string id = par->getDocbookId();
229 id = id.empty()? "" : " id = \"" + id + "\"";
231 if (bstyle->latexparam().find('#') != string::npos) {
232 counters.step(bstyle->counter);
235 if (!bstyle->latexparam().empty()) {
236 id = bstyle->latexparam();
237 if (id.find('#') != string::npos) {
238 string el = expandLabel(buf.params().getLyXTextClass(),
240 id = subst(id, "#", el);
245 sgml::openTag(buf, os, depth, false, bstyle->latexname(), id);
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());
256 sgml::openTag(buf, os, depth, true, bstyle->innertag());
258 par->simpleDocBookOnePar(buf, os, outerFont(par - paragraphs.begin(), paragraphs),
262 sgml::closeTag(os, depth, true, bstyle->innertag());
266 while (par != pend) {
267 LyXLayout_ptr const & style = par->layout();
268 ParagraphList::const_iterator send;
270 switch (style->latextype) {
271 case LATEX_COMMAND: {
272 send = searchCommand(par, pend);
273 par = makeCommand(buf, os, runparams, paragraphs, par,send);
276 case LATEX_ENVIRONMENT:
277 case LATEX_ITEM_ENVIRONMENT: {
278 send = searchEnvironment(par, pend);
279 par = makeEnvironment(buf, os, runparams, paragraphs, par,send);
282 case LATEX_PARAGRAPH:
283 send = searchParagraph(par, pend);
284 par = makeParagraph(buf, os, runparams, paragraphs, par,send);
292 sgml::closeTag(os, depth, false, bstyle->latexname());
297 } // end anonym namespace
300 void docbookParagraphs(ParagraphList const & paragraphs,
303 OutputParams const & runparams)
305 ParagraphList::const_iterator par = paragraphs.begin();
306 ParagraphList::const_iterator pend = paragraphs.end();
308 while (par != pend) {
309 LyXLayout_ptr const & style = par->layout();
310 ParagraphList::const_iterator send;
312 switch (style->latextype) {
313 case LATEX_COMMAND: {
314 send = searchCommand(par, pend);
315 par = makeCommand(buf, os, runparams, paragraphs, par,send);
318 case LATEX_ENVIRONMENT:
319 case LATEX_ITEM_ENVIRONMENT: {
320 send = searchEnvironment(par, pend);
321 par = makeEnvironment(buf, os, runparams, paragraphs, par,send);
324 case LATEX_PARAGRAPH:
325 send = searchParagraph(par, pend);
326 par = makeParagraph(buf, os, runparams, paragraphs, par,send);