X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Foutput_docbook.cpp;h=45af41bece27ff56baef5ef6ca1d504c92e112ce;hb=a6b07608d8e9de24383d3ebaec20b6b265ed9314;hp=f413f2831b790bffdd0f532c4fadc0a095d2593a;hpb=b18bfcf3cc3a6dc91d607f28b269344db6ce3106;p=features.git diff --git a/src/output_docbook.cpp b/src/output_docbook.cpp index f413f2831b..45af41bece 100644 --- a/src/output_docbook.cpp +++ b/src/output_docbook.cpp @@ -17,20 +17,22 @@ #include "buffer_funcs.h" #include "BufferParams.h" #include "Counters.h" +#include "Font.h" #include "Layout.h" #include "OutputParams.h" #include "Paragraph.h" #include "ParagraphList.h" #include "ParagraphParameters.h" -#include "sgml.h" +#include "xml.h" #include "Text.h" #include "TextClass.h" #include "support/lassert.h" #include "support/debug.h" #include "support/lstrings.h" +#include "support/lyxalgo.h" -#include +#include using namespace std; using namespace lyx::support; @@ -39,9 +41,48 @@ namespace lyx { namespace { +std::string const fontToDocBookTag(xml::FontTypes type) { + switch (type) { + case xml::FontTypes::FT_EMPH: + case xml::FontTypes::FT_BOLD: + return "emphasis"; + case xml::FontTypes::FT_NOUN: + return "person"; + case xml::FontTypes::FT_UBAR: + case xml::FontTypes::FT_WAVE: + case xml::FontTypes::FT_DBAR: + case xml::FontTypes::FT_SOUT: + case xml::FontTypes::FT_XOUT: + case xml::FontTypes::FT_ITALIC: + case xml::FontTypes::FT_UPRIGHT: + case xml::FontTypes::FT_SLANTED: + case xml::FontTypes::FT_SMALLCAPS: + case xml::FontTypes::FT_ROMAN: + case xml::FontTypes::FT_SANS: + return "emphasis"; + case xml::FontTypes::FT_TYPE: + return "code"; + case xml::FontTypes::FT_SIZE_TINY: + case xml::FontTypes::FT_SIZE_SCRIPT: + case xml::FontTypes::FT_SIZE_FOOTNOTE: + case xml::FontTypes::FT_SIZE_SMALL: + case xml::FontTypes::FT_SIZE_NORMAL: + case xml::FontTypes::FT_SIZE_LARGE: + case xml::FontTypes::FT_SIZE_LARGER: + case xml::FontTypes::FT_SIZE_LARGEST: + case xml::FontTypes::FT_SIZE_HUGE: + case xml::FontTypes::FT_SIZE_HUGER: + case xml::FontTypes::FT_SIZE_INCREASE: + case xml::FontTypes::FT_SIZE_DECREASE: + return "emphasis"; + default: + return ""; + } +} + ParagraphList::const_iterator searchParagraph( ParagraphList::const_iterator p, - ParagraphList::const_iterator const & pend) + ParagraphList::const_iterator const & pend) { for (++p; p != pend && p->layout().latextype == LATEX_PARAGRAPH; ++p) ; @@ -51,8 +92,8 @@ ParagraphList::const_iterator searchParagraph( ParagraphList::const_iterator searchCommand( - ParagraphList::const_iterator p, - ParagraphList::const_iterator const & pend) + ParagraphList::const_iterator p, + ParagraphList::const_iterator const & pend) { Layout const & bstyle = p->layout(); @@ -67,8 +108,8 @@ ParagraphList::const_iterator searchCommand( ParagraphList::const_iterator searchEnvironment( - ParagraphList::const_iterator p, - ParagraphList::const_iterator const & pend) + ParagraphList::const_iterator p, + ParagraphList::const_iterator const & pend) { Layout const & bstyle = p->layout(); size_t const depth = p->params().depth(); @@ -94,48 +135,51 @@ ParagraphList::const_iterator searchEnvironment( } -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) +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) { ParagraphList const & paragraphs = text.paragraphs(); for (ParagraphList::const_iterator par = pbegin; par != pend; ++par) { if (par != pbegin) os << '\n'; - if (buf.params().documentClass().isDefaultLayout(par->layout()) - && par->emptyTag()) { - par->simpleDocBookOnePar(buf, os, runparams, + 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, + xml::openTag(buf, os, runparams, *par); + par->simpleDocBookOnePar(buf, os, runparams, text.outerFont(distance(paragraphs.begin(), par))); - sgml::closeTag(os, *par); + xml::closeTag(os, *par); } } return 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_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 const & defaultstyle = buf.params().documentClass().defaultLayout(); Layout const & bstyle = par->layout(); - string item_tag; // Opening outter tag - sgml::openTag(buf, os, runparams, *pbegin); + xml::openTag(buf, os, runparams, *pbegin); os << '\n'; if (bstyle.latextype == LATEX_ENVIRONMENT && bstyle.pass_thru) os << "firstWordDocBook(os, runparams) + 1; - sgml::closeTag(os, bstyle.labeltag()); + xml::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()); + xml::openTag(os, bstyle.itemtag()); } break; default: @@ -178,10 +222,10 @@ ParagraphList::const_iterator makeEnvironment(Buffer const & buf, case LATEX_ENVIRONMENT: case LATEX_ITEM_ENVIRONMENT: { if (par->params().depth() == pbegin->params().depth()) { - sgml::openTag(os, wrapper); + xml::openTag(os, wrapper); par->simpleDocBookOnePar(buf, os, runparams, text.outerFont(distance(paragraphs.begin(), par)), sep); - sgml::closeTag(os, wrapper); + xml::closeTag(os, wrapper); ++par; } else { @@ -207,7 +251,7 @@ ParagraphList::const_iterator makeEnvironment(Buffer const & buf, switch (bstyle.latextype) { case LATEX_ENVIRONMENT: if (!bstyle.innertag().empty()) { - sgml::closeTag(os, bstyle.innertag()); + xml::closeTag(os, bstyle.innertag()); os << '\n'; } break; @@ -221,10 +265,10 @@ 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()); + xml::closeTag(os, bstyle.itemtag()); } if (!bstyle.labeltag().empty()) - sgml::closeTag(os, bstyle.innertag()); + xml::closeTag(os, bstyle.innertag()); break; default: break; @@ -234,41 +278,42 @@ ParagraphList::const_iterator makeEnvironment(Buffer const & buf, if (bstyle.latextype == LATEX_ENVIRONMENT && bstyle.pass_thru) os << "]]>"; - // Closing outter tag - sgml::closeTag(os, *pbegin); + // Closing outer tag + xml::closeTag(os, *pbegin); return 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_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 const & bstyle = par->layout(); //Open outter tag - sgml::openTag(buf, os, runparams, *pbegin); + xml::openTag(buf, os, runparams, *pbegin); os << '\n'; // Label around sectioning number: if (!bstyle.labeltag().empty()) { - sgml::openTag(os, bstyle.labeltag()); + xml::openTag(os, bstyle.labeltag()); // We don't care about appendix in DOCBOOK. os << par->expandDocBookLabel(bstyle, buf.params()); - sgml::closeTag(os, bstyle.labeltag()); + xml::closeTag(os, bstyle.labeltag()); } // Opend inner tag and close inner tags - sgml::openTag(os, bstyle.innertag()); + xml::openTag(os, bstyle.innertag()); par->simpleDocBookOnePar(buf, os, runparams, text.outerFont(distance(paragraphs.begin(), par))); - sgml::closeTag(os, bstyle.innertag()); + xml::closeTag(os, bstyle.innertag()); os << '\n'; ++par; @@ -292,17 +337,21 @@ ParagraphList::const_iterator makeCommand(Buffer const & buf, send = searchParagraph(par, pend); 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; } } // Close outter tag - sgml::closeTag(os, *pbegin); + xml::closeTag(os, *pbegin); return pend; } -} // end anonym namespace +} // namespace void docbookParagraphs(Text const & text, @@ -310,15 +359,17 @@ void docbookParagraphs(Text const & text, 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(); - LASSERT(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 = paragraphs.iterator_at(runparams.par_begin); + pend = paragraphs.iterator_at(runparams.par_end); // runparams will be passed to nested paragraphs, so // we have to reset the range parameters. const_cast(runparams).par_begin = 0; @@ -333,20 +384,24 @@ void docbookParagraphs(Text const & text, switch (style.latextype) { case LATEX_COMMAND: { send = searchCommand(par, pend); - par = makeCommand(buf, os, runparams, text, 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, text, par,send); + par = makeEnvironment(buf, os, runparams, text, par, send); break; } case LATEX_PARAGRAPH: send = searchParagraph(par, pend); - par = makeParagraph(buf, os, runparams, text, 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