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"
31 #include "support/types.h"
37 using lyx::support::subst;
46 ParagraphList::const_iterator searchParagraph(ParagraphList::const_iterator const & par,
47 ParagraphList::const_iterator const & pend)
49 ParagraphList::const_iterator p = par + 1;
51 for( ; p != pend && p->layout()->latextype == LATEX_PARAGRAPH; ++p);
57 ParagraphList::const_iterator searchCommand(ParagraphList::const_iterator const & par,
58 ParagraphList::const_iterator const & pend)
60 LyXLayout_ptr const & bstyle = par->layout();
61 ParagraphList::const_iterator p = par + 1;
63 for( ; p != pend; ++p) {
64 LyXLayout_ptr const & style = p->layout();
65 if( style->latextype == LATEX_COMMAND && style->commanddepth <= bstyle->commanddepth)
72 ParagraphList::const_iterator searchEnvironment(ParagraphList::const_iterator const & par,
73 ParagraphList::const_iterator const & pend)
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)
82 if( style->latextype == LATEX_PARAGRAPH) {
83 if (p->params().depth() > par->params().depth())
88 if(p->params().depth() < par->params().depth())
91 if( style->latexname() != bstyle->latexname() and p->params().depth() == par->params().depth() )
98 ParagraphList::const_iterator makeParagraph(Buffer const & buf,
100 OutputParams const & runparams,
101 ParagraphList const & paragraphs,
102 ParagraphList::const_iterator const & pbegin,
103 ParagraphList::const_iterator const & pend)
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));
110 sgml::openTag(buf, os, *par);
111 par->simpleDocBookOnePar(buf, os, runparams, outerFont(par - paragraphs.begin(), paragraphs));
112 sgml::closeTag(os, *par);
120 ParagraphList::const_iterator makeEnvironment(Buffer const & buf,
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;
128 LyXLayout_ptr const & defaultstyle = buf.params().getLyXTextClass().defaultLayout();
129 LyXLayout_ptr const & bstyle = par->layout();
132 // Opening outter tag
133 sgml::openTag(buf, os, *pbegin);
135 if (bstyle->latextype == LATEX_ENVIRONMENT and bstyle->innertag() == "CDATA")
138 while (par != pend) {
139 LyXLayout_ptr const & style = par->layout();
140 ParagraphList::const_iterator send;
141 string id = par->getID();
146 switch (bstyle->latextype) {
147 case LATEX_ENVIRONMENT:
148 if (!bstyle->innertag().empty() and bstyle->innertag() != "CDATA") {
149 sgml::openTag(os, bstyle->innertag(), id);
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());
160 wrapper = defaultstyle->latexname();
161 sgml::openTag(os, 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(os, wrapper);
171 par->simpleDocBookOnePar(buf, os, runparams, outerFont(par - paragraphs.begin(), paragraphs), sep);
172 sgml::closeTag(os, 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, bstyle->innertag());
197 case LATEX_ITEM_ENVIRONMENT:
198 sgml::closeTag(os, bstyle->itemtag());
199 if (!bstyle->labeltag().empty())
200 sgml::closeTag(os, bstyle->innertag());
207 if (bstyle->latextype == LATEX_ENVIRONMENT and bstyle->innertag() == "CDATA")
210 // Closing outter tag
211 sgml::closeTag(os, *pbegin);
217 ParagraphList::const_iterator makeCommand(Buffer const & buf,
219 OutputParams const & runparams,
220 ParagraphList const & paragraphs,
221 ParagraphList::const_iterator const & pbegin,
222 ParagraphList::const_iterator const & pend)
224 ParagraphList::const_iterator par = pbegin;
225 LyXLayout_ptr const & bstyle = par->layout();
228 sgml::openTag(buf, os, *pbegin);
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());
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());
245 while (par != pend) {
246 LyXLayout_ptr const & style = par->layout();
247 ParagraphList::const_iterator send;
249 switch (style->latextype) {
250 case LATEX_COMMAND: {
251 send = searchCommand(par, pend);
252 par = makeCommand(buf, os, runparams, paragraphs, par,send);
255 case LATEX_ENVIRONMENT:
256 case LATEX_ITEM_ENVIRONMENT: {
257 send = searchEnvironment(par, pend);
258 par = makeEnvironment(buf, os, runparams, paragraphs, par,send);
261 case LATEX_PARAGRAPH:
262 send = searchParagraph(par, pend);
263 par = makeParagraph(buf, os, runparams, paragraphs, par,send);
270 sgml::closeTag(os, *pbegin);
275 } // end anonym namespace
278 void docbookParagraphs(ParagraphList const & paragraphs,
281 OutputParams const & runparams)
283 ParagraphList::const_iterator par = paragraphs.begin();
284 ParagraphList::const_iterator pend = paragraphs.end();
286 while (par != pend) {
287 LyXLayout_ptr const & style = par->layout();
288 ParagraphList::const_iterator send;
290 switch (style->latextype) {
291 case LATEX_COMMAND: {
292 send = searchCommand(par, pend);
293 par = makeCommand(buf, os, runparams, paragraphs, par,send);
296 case LATEX_ENVIRONMENT:
297 case LATEX_ITEM_ENVIRONMENT: {
298 send = searchEnvironment(par, pend);
299 par = makeEnvironment(buf, os, runparams, paragraphs, par,send);
302 case LATEX_PARAGRAPH:
303 send = searchParagraph(par, pend);
304 par = makeParagraph(buf, os, runparams, paragraphs, par,send);