X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Foutput_docbook.cpp;h=6ed409c5dda04c69eafadcf2e0f3131bd2fa4abe;hb=79cf3f5ec1088e7de988e889247ec300d42fb70b;hp=0aa20adac0d0c9719e199d72c1a4ac58044fb4c7;hpb=0bf9ac02a8988b2747c15520780cbf4343dd6a45;p=lyx.git diff --git a/src/output_docbook.cpp b/src/output_docbook.cpp index 0aa20adac0..6ed409c5dd 100644 --- a/src/output_docbook.cpp +++ b/src/output_docbook.cpp @@ -3,8 +3,8 @@ * This file is part of LyX, the document processor. * Licence details can be found in the file COPYING. * - * \author Lars Gullik Bjønnes - * \author José Matos + * \author Lars Gullik Bjønnes + * \author José Matos * * Full author contact details are available in file CREDITS. */ @@ -16,41 +16,36 @@ #include "Buffer.h" #include "buffer_funcs.h" #include "BufferParams.h" -#include "OutputParams.h" #include "Counters.h" -#include "debug.h" +#include "Font.h" +#include "Layout.h" +#include "OutputParams.h" #include "Paragraph.h" -#include "paragraph_funcs.h" #include "ParagraphList.h" #include "ParagraphParameters.h" #include "sgml.h" +#include "Text.h" +#include "TextClass.h" -#include "insets/InsetCommand.h" - +#include "support/lassert.h" +#include "support/debug.h" #include "support/lstrings.h" -#include "support/lyxlib.h" -#include "support/convert.h" -#include "support/types.h" +#include "support/lyxalgo.h" +#include -namespace lyx { +using namespace std; +using namespace lyx::support; -using support::subst; - -using std::endl; -using std::ostream; -using std::vector; -using std::string; +namespace lyx { namespace { ParagraphList::const_iterator searchParagraph( - ParagraphList::const_iterator const & par, - ParagraphList::const_iterator const & pend) + ParagraphList::const_iterator p, + ParagraphList::const_iterator const & pend) { - ParagraphList::const_iterator p = boost::next(par); - - for (; p != pend && p->layout()->latextype == LATEX_PARAGRAPH; ++p) + for (++p; p != pend && p->layout().latextype == LATEX_PARAGRAPH; ++p) ; return p; @@ -58,16 +53,15 @@ ParagraphList::const_iterator searchParagraph( ParagraphList::const_iterator searchCommand( - ParagraphList::const_iterator const & par, - ParagraphList::const_iterator const & pend) + ParagraphList::const_iterator p, + ParagraphList::const_iterator const & pend) { - Layout_ptr const & bstyle = par->layout(); - ParagraphList::const_iterator p = boost::next(par); + Layout const & bstyle = p->layout(); - for ( ; p != pend; ++p) { - Layout_ptr const & style = p->layout(); - if (style->latextype == LATEX_COMMAND - && style->commanddepth <= bstyle->commanddepth) + for (++p; p != pend; ++p) { + Layout const & style = p->layout(); + if (style.latextype == LATEX_COMMAND + && style.commanddepth <= bstyle.commanddepth) return p; } return pend; @@ -75,50 +69,55 @@ ParagraphList::const_iterator searchCommand( ParagraphList::const_iterator searchEnvironment( - ParagraphList::const_iterator const & par, - ParagraphList::const_iterator const & pend) + ParagraphList::const_iterator p, + ParagraphList::const_iterator const & pend) { - Layout_ptr const & bstyle = par->layout(); - ParagraphList::const_iterator p = boost::next(par); - for (; p != pend; ++p) { - Layout_ptr const & style = p->layout(); - if (style->latextype == LATEX_COMMAND) + Layout const & bstyle = p->layout(); + size_t const depth = p->params().depth(); + for (++p; p != pend; ++p) { + Layout const & style = p->layout(); + if (style.latextype == LATEX_COMMAND) return p; - if (style->latextype == LATEX_PARAGRAPH) { - if (p->params().depth() > par->params().depth()) + if (style.latextype == LATEX_PARAGRAPH) { + if (p->params().depth() > depth) continue; return p; } - if (p->params().depth() < par->params().depth()) + if (p->params().depth() < depth) return p; - if (style->latexname() != bstyle->latexname() - && p->params().depth() == par->params().depth() ) + if (style.latexname() != bstyle.latexname() + && p->params().depth() == depth) return p; } return pend; } -ParagraphList::const_iterator makeParagraph(Buffer const & buf, - odocstream & os, - OutputParams const & runparams, - ParagraphList const & paragraphs, - ParagraphList::const_iterator const & pbegin, - ParagraphList::const_iterator const & pend) +ParagraphList::const_iterator makeParagraph( + Buffer const & buf, + odocstream & os, + OutputParams const & runparams, + Text const & text, + ParagraphList::const_iterator const & pbegin, + ParagraphList::const_iterator const & pend) { - Layout_ptr const & defaultstyle = - buf.params().getLyXTextClass().defaultLayout(); + ParagraphList const & paragraphs = text.paragraphs(); for (ParagraphList::const_iterator par = pbegin; par != pend; ++par) { if (par != pbegin) os << '\n'; - if (par->layout() == defaultstyle && par->emptyTag()) { - par->simpleDocBookOnePar(buf, os, runparams, outerFont(std::distance(paragraphs.begin(), par), paragraphs)); + bool const default_or_plain = + (buf.params().documentClass().isDefaultLayout(par->layout()) + || buf.params().documentClass().isPlainLayout(par->layout())); + if (default_or_plain && par->emptyTag()) { + par->simpleDocBookOnePar(buf, os, runparams, + text.outerFont(distance(paragraphs.begin(), par))); } else { sgml::openTag(buf, os, runparams, *par); - par->simpleDocBookOnePar(buf, os, runparams, outerFont(std::distance(paragraphs.begin(), par), paragraphs)); + par->simpleDocBookOnePar(buf, os, runparams, + text.outerFont(distance(paragraphs.begin(), par))); sgml::closeTag(os, *par); } } @@ -126,86 +125,94 @@ ParagraphList::const_iterator makeParagraph(Buffer const & buf, } -ParagraphList::const_iterator makeEnvironment(Buffer const & buf, - odocstream & os, - OutputParams const & runparams, - ParagraphList const & paragraphs, - ParagraphList::const_iterator const & pbegin, - ParagraphList::const_iterator const & pend) { +ParagraphList::const_iterator makeEnvironment( + Buffer const & buf, + odocstream & os, + OutputParams const & runparams, + Text const & text, + ParagraphList::const_iterator const & pbegin, + ParagraphList::const_iterator const & pend) +{ + ParagraphList const & paragraphs = text.paragraphs(); ParagraphList::const_iterator par = pbegin; - Layout_ptr const & defaultstyle = buf.params().getLyXTextClass().defaultLayout(); - Layout_ptr const & bstyle = par->layout(); - string item_tag; + Layout const & defaultstyle = buf.params().documentClass().defaultLayout(); + Layout const & bstyle = par->layout(); // Opening outter tag sgml::openTag(buf, os, runparams, *pbegin); os << '\n'; - if (bstyle->latextype == LATEX_ENVIRONMENT && bstyle->pass_thru) + if (bstyle.latextype == LATEX_ENVIRONMENT && bstyle.pass_thru) os << "layout(); + Layout const & style = par->layout(); ParagraphList::const_iterator send; string id = par->getID(buf, runparams); string wrapper = ""; pos_type sep = 0; // Opening inner tag - switch (bstyle->latextype) { + switch (bstyle.latextype) { case LATEX_ENVIRONMENT: - if (!bstyle->innertag().empty()) { - sgml::openTag(os, bstyle->innertag(), id); + if (!bstyle.innertag().empty()) { + sgml::openTag(os, bstyle.innertag(), id); } break; case LATEX_ITEM_ENVIRONMENT: - if (!bstyle->labeltag().empty()) { - sgml::openTag(os, bstyle->innertag(), id); - sgml::openTag(os, bstyle->labeltag()); - sep = par->getFirstWord(buf, os, runparams) + 1; - sgml::closeTag(os, bstyle->labeltag()); + if (!bstyle.labeltag().empty()) { + sgml::openTag(os, bstyle.innertag(), id); + sgml::openTag(os, bstyle.labeltag()); + sep = par->firstWordDocBook(os, runparams) + 1; + sgml::closeTag(os, bstyle.labeltag()); } - wrapper = defaultstyle->latexname(); + wrapper = defaultstyle.latexname(); // If a sub list (embedded list) appears next with a // different depth, then there is no need to open // another tag at the current depth. if(par->params().depth() == pbegin->params().depth()) { - sgml::openTag(os, bstyle->itemtag()); + sgml::openTag(os, bstyle.itemtag()); } break; default: break; } - switch (style->latextype) { + switch (style.latextype) { case LATEX_ENVIRONMENT: case LATEX_ITEM_ENVIRONMENT: { if (par->params().depth() == pbegin->params().depth()) { sgml::openTag(os, wrapper); - par->simpleDocBookOnePar(buf, os, runparams, outerFont(std::distance(paragraphs.begin(), par), paragraphs), sep); + par->simpleDocBookOnePar(buf, os, runparams, + text.outerFont(distance(paragraphs.begin(), par)), sep); sgml::closeTag(os, wrapper); ++par; } else { send = searchEnvironment(par, pend); - par = makeEnvironment(buf, os, runparams, paragraphs, par,send); + par = makeEnvironment(buf, os, runparams, text, par,send); } break; } case LATEX_PARAGRAPH: send = searchParagraph(par, pend); - par = makeParagraph(buf, os, runparams, paragraphs, par,send); + par = makeParagraph(buf, os, runparams, text, par,send); break; - default: + case LATEX_LIST_ENVIRONMENT: + case LATEX_BIB_ENVIRONMENT: + case LATEX_COMMAND: + // FIXME This means that we are just skipping any paragraph that + // isn't implemented above, and this includes lists. + ++par; break; } // Closing inner tag - switch (bstyle->latextype) { + switch (bstyle.latextype) { case LATEX_ENVIRONMENT: - if (!bstyle->innertag().empty()) { - sgml::closeTag(os, bstyle->innertag()); + if (!bstyle.innertag().empty()) { + sgml::closeTag(os, bstyle.innertag()); os << '\n'; } break; @@ -219,76 +226,83 @@ ParagraphList::const_iterator makeEnvironment(Buffer const & buf, // when par == pend but at the same time that the // current tag is closed. if((par != pend && par->params().depth() == pbegin->params().depth()) || par == pend) { - sgml::closeTag(os, bstyle->itemtag()); + sgml::closeTag(os, bstyle.itemtag()); } - if (!bstyle->labeltag().empty()) - sgml::closeTag(os, bstyle->innertag()); + if (!bstyle.labeltag().empty()) + sgml::closeTag(os, bstyle.innertag()); break; default: break; } } - if (bstyle->latextype == LATEX_ENVIRONMENT && bstyle->pass_thru) + if (bstyle.latextype == LATEX_ENVIRONMENT && bstyle.pass_thru) os << "]]>"; - // Closing outter tag + // Closing outer tag sgml::closeTag(os, *pbegin); return pend; } -ParagraphList::const_iterator makeCommand(Buffer const & buf, - odocstream & os, - OutputParams const & runparams, - ParagraphList const & paragraphs, - ParagraphList::const_iterator const & pbegin, - ParagraphList::const_iterator const & pend) +ParagraphList::const_iterator makeCommand( + Buffer const & buf, + odocstream & os, + OutputParams const & runparams, + Text const & text, + ParagraphList::const_iterator const & pbegin, + ParagraphList::const_iterator const & pend) { + ParagraphList const & paragraphs = text.paragraphs(); ParagraphList::const_iterator par = pbegin; - Layout_ptr const & bstyle = par->layout(); + Layout const & bstyle = par->layout(); //Open outter tag sgml::openTag(buf, os, runparams, *pbegin); os << '\n'; // Label around sectioning number: - if (!bstyle->labeltag().empty()) { - sgml::openTag(os, bstyle->labeltag()); + if (!bstyle.labeltag().empty()) { + sgml::openTag(os, bstyle.labeltag()); // We don't care about appendix in DOCBOOK. - os << par->expandLabel(bstyle, buf.params(), false); - sgml::closeTag(os, bstyle->labeltag()); + os << par->expandDocBookLabel(bstyle, buf.params()); + sgml::closeTag(os, bstyle.labeltag()); } // Opend inner tag and close inner tags - sgml::openTag(os, bstyle->innertag()); - par->simpleDocBookOnePar(buf, os, runparams, outerFont(std::distance(paragraphs.begin(), par), paragraphs)); - sgml::closeTag(os, bstyle->innertag()); + sgml::openTag(os, bstyle.innertag()); + par->simpleDocBookOnePar(buf, os, runparams, + text.outerFont(distance(paragraphs.begin(), par))); + sgml::closeTag(os, bstyle.innertag()); os << '\n'; ++par; while (par != pend) { - Layout_ptr const & style = par->layout(); + Layout const & style = par->layout(); ParagraphList::const_iterator send; - switch (style->latextype) { + switch (style.latextype) { case LATEX_COMMAND: { send = searchCommand(par, pend); - par = makeCommand(buf, os, runparams, paragraphs, par,send); + par = makeCommand(buf, os, runparams, text, par,send); break; } case LATEX_ENVIRONMENT: case LATEX_ITEM_ENVIRONMENT: { send = searchEnvironment(par, pend); - par = makeEnvironment(buf, os, runparams, paragraphs, par,send); + par = makeEnvironment(buf, os, runparams, text, par,send); break; } case LATEX_PARAGRAPH: send = searchParagraph(par, pend); - par = makeParagraph(buf, os, runparams, paragraphs, par,send); + par = makeParagraph(buf, os, runparams, text, par,send); break; - default: + case LATEX_BIB_ENVIRONMENT: + case LATEX_LIST_ENVIRONMENT: + // FIXME This means that we are just skipping any paragraph that + // isn't implemented above. + ++par; break; } } @@ -298,54 +312,61 @@ ParagraphList::const_iterator makeCommand(Buffer const & buf, return pend; } -} // end anonym namespace +} // namespace -void docbookParagraphs(ParagraphList const & paragraphs, +void docbookParagraphs(Text const & text, Buffer const & buf, odocstream & os, OutputParams const & runparams) { + LASSERT(runparams.par_begin <= runparams.par_end, + { os << "\n"; return; }); + + ParagraphList const & paragraphs = text.paragraphs(); ParagraphList::const_iterator par = paragraphs.begin(); ParagraphList::const_iterator pend = paragraphs.end(); - BOOST_ASSERT(runparams.par_begin <= runparams.par_end); // if only part of the paragraphs will be outputed if (runparams.par_begin != runparams.par_end) { - par = boost::next(paragraphs.begin(), runparams.par_begin); - pend = boost::next(paragraphs.begin(), runparams.par_end); + par = lyx::next(paragraphs.begin(), runparams.par_begin); + pend = lyx::next(paragraphs.begin(), runparams.par_end); // runparams will be passed to nested paragraphs, so // we have to reset the range parameters. const_cast(runparams).par_begin = 0; const_cast(runparams).par_end = 0; } - + while (par != pend) { - Layout_ptr const & style = par->layout(); + Layout const & style = par->layout(); ParagraphList::const_iterator lastpar = par; ParagraphList::const_iterator send; - switch (style->latextype) { + switch (style.latextype) { case LATEX_COMMAND: { send = searchCommand(par, pend); - par = makeCommand(buf, os, runparams, paragraphs, par,send); + par = makeCommand(buf, os, runparams, text, par, send); break; } case LATEX_ENVIRONMENT: case LATEX_ITEM_ENVIRONMENT: { send = searchEnvironment(par, pend); - par = makeEnvironment(buf, os, runparams, paragraphs, par,send); + par = makeEnvironment(buf, os, runparams, text, par, send); break; } case LATEX_PARAGRAPH: send = searchParagraph(par, pend); - par = makeParagraph(buf, os, runparams, paragraphs, par,send); + par = makeParagraph(buf, os, runparams, text, par, send); break; - default: + case LATEX_BIB_ENVIRONMENT: + case LATEX_LIST_ENVIRONMENT: + // FIXME This means that we are just skipping any paragraph that + // isn't implemented above. + ++par; break; } // makeEnvironment may process more than one paragraphs and bypass pend - if (std::distance(lastpar, par) >= std::distance(lastpar, pend)) + if (distance(lastpar, par) >= distance(lastpar, pend)) break; } }