X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Foutput_docbook.C;h=2778dde86e67a77fc57fe57bb959ead634675c51;hb=e5a46922e916a06ad1b958d5895cc3cfb4f13d2c;hp=1e2862cbf0c29e79a3ec38bf663ca9f83f0c4cec;hpb=71f3af2a4eade059bc141a35ec80777aba9e6f8e;p=lyx.git diff --git a/src/output_docbook.C b/src/output_docbook.C index 1e2862cbf0..2778dde86e 100644 --- a/src/output_docbook.C +++ b/src/output_docbook.C @@ -14,12 +14,14 @@ #include "output_docbook.h" #include "buffer.h" +#include "buffer_funcs.h" #include "bufferparams.h" +#include "outputparams.h" #include "counters.h" #include "debug.h" -#include "lyxtext.h" #include "paragraph.h" #include "paragraph_funcs.h" +#include "ParagraphList.h" #include "ParagraphParameters.h" #include "sgml.h" @@ -27,12 +29,13 @@ #include "support/lstrings.h" #include "support/lyxlib.h" -#include "support/tostr.h" +#include "support/convert.h" +#include "support/types.h" -#ifdef HAVE_LOCALE -#endif -using lyx::support::subst; +namespace lyx { + +using support::subst; using std::endl; using std::ostream; @@ -41,52 +44,58 @@ using std::string; namespace { -ParagraphList::const_iterator searchParagraph(ParagraphList::const_iterator const & par, - ParagraphList::const_iterator const & pend) +ParagraphList::const_iterator searchParagraph( + ParagraphList::const_iterator const & par, + ParagraphList::const_iterator const & pend) { - ParagraphList::const_iterator p = par + 1; + ParagraphList::const_iterator p = boost::next(par); - for( ; p != pend && p->layout()->latextype == LATEX_PARAGRAPH; ++p); + for (; p != pend && p->layout()->latextype == LATEX_PARAGRAPH; ++p) + ; return p; } -ParagraphList::const_iterator searchCommand(ParagraphList::const_iterator const & par, - ParagraphList::const_iterator const & pend) +ParagraphList::const_iterator searchCommand( + ParagraphList::const_iterator const & par, + ParagraphList::const_iterator const & pend) { LyXLayout_ptr const & bstyle = par->layout(); - ParagraphList::const_iterator p = par + 1; + ParagraphList::const_iterator p = boost::next(par); - for( ; p != pend; ++p) { + for ( ; p != pend; ++p) { LyXLayout_ptr const & style = p->layout(); - if( style->latextype == LATEX_COMMAND && style->commanddepth <= bstyle->commanddepth) + if (style->latextype == LATEX_COMMAND + && style->commanddepth <= bstyle->commanddepth) return p; } return pend; } -ParagraphList::const_iterator searchEnvironment(ParagraphList::const_iterator const & par, - ParagraphList::const_iterator const & pend) +ParagraphList::const_iterator searchEnvironment( + ParagraphList::const_iterator const & par, + ParagraphList::const_iterator const & pend) { LyXLayout_ptr const & bstyle = par->layout(); - ParagraphList::const_iterator p = par + 1; - for( ; p != pend; ++p) { + ParagraphList::const_iterator p = boost::next(par); + for (; p != pend; ++p) { LyXLayout_ptr const & style = p->layout(); - if( style->latextype == LATEX_COMMAND) + if (style->latextype == LATEX_COMMAND) return p; - if( style->latextype == LATEX_PARAGRAPH) { + if (style->latextype == LATEX_PARAGRAPH) { if (p->params().depth() > par->params().depth()) continue; return p; } - if(p->params().depth() < par->params().depth()) + if (p->params().depth() < par->params().depth()) return p; - if( style->latexname() != bstyle->latexname() and p->params().depth() == par->params().depth() ) + if (style->latexname() != bstyle->latexname() + && p->params().depth() == par->params().depth() ) return p; } return pend; @@ -94,30 +103,31 @@ ParagraphList::const_iterator searchEnvironment(ParagraphList::const_iterator co ParagraphList::const_iterator makeParagraph(Buffer const & buf, - ostream & os, + odocstream & os, OutputParams const & runparams, ParagraphList const & paragraphs, ParagraphList::const_iterator const & pbegin, - ParagraphList::const_iterator const & pend) { - ParagraphList::const_iterator par = pbegin; - const int depth = 0; - for(; par != pend; ++par) { - LyXLayout_ptr const & style = par->layout(); - string id = par->getDocbookId(); - id = id.empty()? "": " id = \"" + id + "\""; - - sgml::openTag(buf, os, depth, true, style->latexname(), id); - par->simpleDocBookOnePar(buf, os, outerFont(par - paragraphs.begin(), paragraphs), runparams, depth); - - sgml::closeTag(os, depth, true, style->latexname()); - os << '\n'; + ParagraphList::const_iterator const & pend) +{ + LyXLayout_ptr const & defaultstyle = + buf.params().getLyXTextClass().defaultLayout(); + 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)); + } else { + sgml::openTag(buf, os, runparams, *par); + par->simpleDocBookOnePar(buf, os, runparams, outerFont(std::distance(paragraphs.begin(), par), paragraphs)); + sgml::closeTag(os, *par); + } } return pend; } ParagraphList::const_iterator makeEnvironment(Buffer const & buf, - ostream & os, + odocstream & os, OutputParams const & runparams, ParagraphList const & paragraphs, ParagraphList::const_iterator const & pbegin, @@ -125,40 +135,45 @@ ParagraphList::const_iterator makeEnvironment(Buffer const & buf, ParagraphList::const_iterator par = pbegin; LyXLayout_ptr const & defaultstyle = buf.params().getLyXTextClass().defaultLayout(); - const int depth = 0; - LyXLayout_ptr const & bstyle = par->layout(); string item_tag; - - string id = par->getDocbookId(); - string env_name = bstyle->latexname(); + // Opening outter tag - sgml::openTag(buf, os, depth, false, env_name, bstyle->latexparam() + id); + sgml::openTag(buf, os, runparams, *pbegin); os << '\n'; - if (bstyle->latextype == LATEX_ENVIRONMENT and bstyle->innertag() == "CDATA") + if (bstyle->latextype == LATEX_ENVIRONMENT && bstyle->pass_thru) os << "layout(); - string id = ""; ParagraphList::const_iterator send; + string id = par->getID(buf, runparams); string wrapper = ""; + pos_type sep = 0; // Opening inner tag switch (bstyle->latextype) { case LATEX_ENVIRONMENT: - if (!bstyle->innertag().empty() and bstyle->innertag() != "CDATA") { - sgml::openTag(buf, os, depth, true, bstyle->innertag()); + if (!bstyle->innertag().empty()) { + sgml::openTag(os, bstyle->innertag(), id); } break; case LATEX_ITEM_ENVIRONMENT: if (!bstyle->labeltag().empty()) { - sgml::openTag(buf, os, depth, true, bstyle->labeltag()); - } else { - wrapper = defaultstyle->latexname(); - sgml::openTag(buf, os, depth, true, bstyle->itemtag()); + sgml::openTag(os, bstyle->innertag(), id); + sgml::openTag(os, bstyle->labeltag()); + sep = par->getFirstWord(buf, os, runparams) + 1; + sgml::closeTag(os, bstyle->labeltag()); + } + 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()); } + break; default: break; } @@ -166,10 +181,10 @@ ParagraphList::const_iterator makeEnvironment(Buffer const & buf, switch (style->latextype) { case LATEX_ENVIRONMENT: case LATEX_ITEM_ENVIRONMENT: { - if(par->params().depth() == pbegin->params().depth()) { - sgml::openTag(buf, os, depth, true, wrapper, id); - par->simpleDocBookOnePar(buf, os, outerFont(par - paragraphs.begin(), paragraphs), runparams, depth); - sgml::closeTag(os, depth, true, wrapper); + if (par->params().depth() == pbegin->params().depth()) { + sgml::openTag(os, wrapper); + par->simpleDocBookOnePar(buf, os, runparams, outerFont(std::distance(paragraphs.begin(), par), paragraphs), sep); + sgml::closeTag(os, wrapper); ++par; } else { @@ -189,79 +204,69 @@ ParagraphList::const_iterator makeEnvironment(Buffer const & buf, // Closing inner tag switch (bstyle->latextype) { case LATEX_ENVIRONMENT: - if (!bstyle->innertag().empty() and bstyle->innertag() != "CDATA") { - sgml::closeTag(os, depth, true, bstyle->innertag()); + if (!bstyle->innertag().empty()) { + sgml::closeTag(os, bstyle->innertag()); os << '\n'; } break; case LATEX_ITEM_ENVIRONMENT: - sgml::closeTag(os, depth, true, bstyle->itemtag()); + // If a sub list (embedded list) appears next, then + // there is no need to close the current tag. + // par should have already been incremented to the next + // element. So we can compare the depth of the next + // element with pbegin. + // We need to be careful, that we don't dereference par + // 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()); + } + if (!bstyle->labeltag().empty()) + sgml::closeTag(os, bstyle->innertag()); break; default: break; } } - if (bstyle->latextype == LATEX_ENVIRONMENT and bstyle->innertag() == "CDATA") + if (bstyle->latextype == LATEX_ENVIRONMENT && bstyle->pass_thru) os << "]]>"; // Closing outter tag - sgml::closeTag(os, depth, false, env_name); + sgml::closeTag(os, *pbegin); return pend; } ParagraphList::const_iterator makeCommand(Buffer const & buf, - ostream & os, + odocstream & os, OutputParams const & runparams, ParagraphList const & paragraphs, ParagraphList::const_iterator const & pbegin, ParagraphList::const_iterator const & pend) { - Paragraph::depth_type depth = 0; // paragraph depth - ParagraphList::const_iterator par = pbegin; - Counters & counters = buf.params().getLyXTextClass().counters(); LyXLayout_ptr const & bstyle = par->layout(); - - string id = par->getDocbookId(); - id = id.empty()? "" : " id = \"" + id + "\""; - - if (bstyle->latexparam().find('#') != string::npos) { - counters.step(bstyle->counter); - } - - if (!bstyle->latexparam().empty()) { - id = bstyle->latexparam(); - if (id.find('#') != string::npos) { - string el = expandLabel(buf.params().getLyXTextClass(), - bstyle, false); - id = subst(id, "#", el); - } - } //Open outter tag - sgml::openTag(buf, os, depth, false, bstyle->latexname(), id); + sgml::openTag(buf, os, runparams, *pbegin); os << '\n'; // Label around sectioning number: if (!bstyle->labeltag().empty()) { - sgml::openTag(buf, os, depth, false, bstyle->labeltag()); - os << expandLabel(buf.params().getLyXTextClass(), bstyle, false); - sgml::closeTag(os, depth, false, bstyle->labeltag()); + 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()); } - - // Opend inner tag - sgml::openTag(buf, os, depth, true, bstyle->innertag()); - - par->simpleDocBookOnePar(buf, os, outerFont(par - paragraphs.begin(), paragraphs), - runparams, depth); - // Close inner tags - sgml::closeTag(os, depth, true, bstyle->innertag()); + // 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()); os << '\n'; - + ++par; while (par != pend) { LyXLayout_ptr const & style = par->layout(); @@ -287,9 +292,8 @@ ParagraphList::const_iterator makeCommand(Buffer const & buf, break; } } - // Close outter tag - sgml::closeTag(os, depth, false, bstyle->latexname()); + sgml::closeTag(os, *pbegin); return pend; } @@ -299,14 +303,26 @@ ParagraphList::const_iterator makeCommand(Buffer const & buf, void docbookParagraphs(ParagraphList const & paragraphs, Buffer const & buf, - ostream & os, + odocstream & os, OutputParams const & runparams) { 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); + // 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) { LyXLayout_ptr const & style = par->layout(); + ParagraphList::const_iterator lastpar = par; ParagraphList::const_iterator send; switch (style->latextype) { @@ -328,5 +344,11 @@ void docbookParagraphs(ParagraphList const & paragraphs, default: break; } + // makeEnvironment may process more than one paragraphs and bypass pend + if (std::distance(lastpar, par) >= std::distance(lastpar, pend)) + break; } } + + +} // namespace lyx