X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Foutput_docbook.C;h=f398c8b76fa0bfc02e2ee70bf41b7b83a4b970a0;hb=530749439472bddf13d9f4ee74ee6184ef76e3f9;hp=7caa4b518ccc147e28d34fe979dae5ba4eed68cd;hpb=68b7ef25fb7d2da230d3eb11d6737701abfc2e64;p=lyx.git diff --git a/src/output_docbook.C b/src/output_docbook.C index 7caa4b518c..f398c8b76f 100644 --- a/src/output_docbook.C +++ b/src/output_docbook.C @@ -14,12 +14,13 @@ #include "output_docbook.h" #include "buffer.h" +#include "buffer_funcs.h" #include "bufferparams.h" #include "counters.h" #include "debug.h" -#include "lyxtext.h" #include "paragraph.h" #include "paragraph_funcs.h" +#include "ParagraphList_fwd.h" #include "ParagraphParameters.h" #include "sgml.h" @@ -27,248 +28,285 @@ #include "support/lstrings.h" #include "support/lyxlib.h" -#include "support/tostr.h" - -#include +#include "support/convert.h" +#include "support/types.h" #ifdef HAVE_LOCALE #endif -using lyx::support::atoi; -using lyx::support::split; +using lyx::pos_type; using lyx::support::subst; using std::endl; using std::ostream; -using std::stack; using std::vector; using std::string; +namespace { -void docbookParagraphs(Buffer const & buf, - ParagraphList const & paragraphs, - ostream & os, - OutputParams const & runparams) +ParagraphList::const_iterator searchParagraph(ParagraphList::const_iterator const & par, + ParagraphList::const_iterator const & pend) { - vector environment_stack(10); - vector environment_inner(10); - vector command_stack(10); + ParagraphList::const_iterator p = par + 1; - bool command_flag = false; - Paragraph::depth_type command_depth = 0; - Paragraph::depth_type command_base = 0; - Paragraph::depth_type cmd_depth = 0; - Paragraph::depth_type depth = 0; // paragraph depth + for( ; p != pend && p->layout()->latextype == LATEX_PARAGRAPH; ++p); - string command_name; - - string item_tag; + return p; +} - ParagraphList::iterator par = const_cast(paragraphs).begin(); - ParagraphList::iterator pend = const_cast(paragraphs).end(); - Counters & counters = buf.params().getLyXTextClass().counters(); +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; - for (; par != pend; ++par) { + for( ; p != pend; ++p) { + LyXLayout_ptr const & style = p->layout(); + if( style->latextype == LATEX_COMMAND && style->commanddepth <= bstyle->commanddepth) + return p; + } + return pend; +} - LyXLayout_ptr const & style = par->layout(); - // environment tag closing - for (; depth > par->params().depth(); --depth) { - sgml::closeEnvTags(os, false, environment_inner[depth], - item_tag, command_depth + depth); - sgml::closeTag(os, depth + command_depth, false, environment_stack[depth]); - environment_stack[depth].erase(); - environment_inner[depth].erase(); +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) { + LyXLayout_ptr const & style = p->layout(); + if( style->latextype == LATEX_COMMAND) + return p; + + if( style->latextype == LATEX_PARAGRAPH) { + if (p->params().depth() > par->params().depth()) + continue; + return p; } - if (depth == par->params().depth() - && environment_stack[depth] != style->latexname() - && !environment_stack[depth].empty()) { - sgml::closeEnvTags(os, false, environment_inner[depth], - item_tag, command_depth + depth); - sgml::closeTag(os, depth + command_depth, false, environment_stack[depth]); + if(p->params().depth() < par->params().depth()) + return p; - environment_stack[depth].erase(); - environment_inner[depth].erase(); + if( style->latexname() != bstyle->latexname() && p->params().depth() == par->params().depth() ) + return p; + } + return pend; +} + + +ParagraphList::const_iterator makeParagraph(Buffer const & buf, + ostream & os, + OutputParams const & runparams, + ParagraphList const & paragraphs, + ParagraphList::const_iterator const & pbegin, + 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(par - paragraphs.begin(), paragraphs)); + } else { + sgml::openTag(buf, os, runparams, *par); + par->simpleDocBookOnePar(buf, os, runparams, outerFont(par - paragraphs.begin(), paragraphs)); + sgml::closeTag(os, *par); } + } + return pend; +} - string ls = ""; - bool labelid = false; - // Write opening SGML tags. - switch (style->latextype) { - case LATEX_PARAGRAPH: - if (!style->latexparam().empty()) { - counters.step("para"); - int i = counters.value("para"); - ls = subst(style->latexparam(), "#", tostr(i)); - } - sgml::openTag(os, depth + command_depth, - false, style->latexname(), ls); - break; - case LATEX_COMMAND: - if (depth != 0) - //error(ErrorItem(_("Error"), _("Wrong depth for LatexType Command."), par->id(), 0, par->size())); - ; - - command_name = style->latexname(); - - cmd_depth = style->commanddepth; - - if (command_flag) { - if (cmd_depth < command_base) { - for (Paragraph::depth_type j = command_depth; - j >= command_base; --j) { - sgml::closeTag(os, j, false, command_stack[j]); - os << endl; - } - command_depth = command_base = cmd_depth; - } else if (cmd_depth <= command_depth) { - for (int j = command_depth; - j >= int(cmd_depth); --j) { - sgml::closeTag(os, j, false, command_stack[j]); - os << endl; - } - command_depth = cmd_depth; - } else - command_depth = cmd_depth; - } else { - command_depth = command_base = cmd_depth; - command_flag = true; - } - if (command_stack.size() == command_depth + 1) - command_stack.push_back(string()); - command_stack[command_depth] = command_name; +ParagraphList::const_iterator makeEnvironment(Buffer const & buf, + ostream & os, + OutputParams const & runparams, + ParagraphList const & paragraphs, + ParagraphList::const_iterator const & pbegin, + ParagraphList::const_iterator const & pend) { + ParagraphList::const_iterator par = pbegin; - if (style->latexparam().find('#') != string::npos) { - counters.step(style->counter); - } - // treat label as a special case for - // more WYSIWYM handling. - // This is a hack while paragraphs can't have - // attributes, like id in this case. - if (par->size() && par->isInset(0)) { - InsetBase * inset = par->getInset(0); - if (inset->lyxCode() == InsetOld::LABEL_CODE) { - command_name += " id=\""; - command_name += (static_cast(inset))->getContents(); - command_name += '"'; - labelid = true; - } - } - if (!labelid && !style->latexparam().empty()) { - ls = style->latexparam(); - if (ls.find('#') != string::npos) { - string el = expandLabel(buf.params().getLyXTextClass(), - style, false); - ls = subst(ls, "#", el); - } - } + LyXLayout_ptr const & defaultstyle = buf.params().getLyXTextClass().defaultLayout(); + LyXLayout_ptr const & bstyle = par->layout(); + string item_tag; - sgml::openTag(os, depth + command_depth, false, command_name, ls); + // Opening outter tag + sgml::openTag(buf, os, runparams, *pbegin); + os << '\n'; + if (bstyle->latextype == LATEX_ENVIRONMENT && bstyle->pass_thru) + os << "labeltag().empty()) { - sgml::openTag(os, depth + 1 + command_depth, false, - style->labeltag()); - os << expandLabel(buf.params().getLyXTextClass(), style, false); - sgml::closeTag(os, depth + 1 + command_depth, false, - style->labeltag()); - } + while (par != pend) { + LyXLayout_ptr const & style = par->layout(); + ParagraphList::const_iterator send; + string id = par->getID(buf, runparams); + string wrapper = ""; + pos_type sep = 0; - // Inner tagged header text, e.g. for sectioning: - sgml::openTag(os, depth + 1 + command_depth, false, - style->innertag()); + // Opening inner tag + switch (bstyle->latextype) { + case LATEX_ENVIRONMENT: + if (!bstyle->innertag().empty()) { + sgml::openTag(os, bstyle->innertag(), id); + } break; - case LATEX_ENVIRONMENT: case LATEX_ITEM_ENVIRONMENT: - if (depth < par->params().depth()) { - depth = par->params().depth(); - environment_stack[depth].erase(); + 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()); } + wrapper = defaultstyle->latexname(); + sgml::openTag(os, bstyle->itemtag()); + default: + break; + } - if (environment_stack[depth] != style->latexname()) { - if (environment_stack.size() == depth + 1) { - environment_stack.push_back("!-- --"); - environment_inner.push_back("!-- --"); - } - environment_stack[depth] = style->latexname(); - environment_inner[depth] = "!-- --"; - // outputs <environment_stack[depth] latexparam()> - sgml::openTag(os, depth + command_depth, false, - environment_stack[depth], style->latexparam()); - } else { - sgml::closeEnvTags(os, false, environment_inner[depth], - style->itemtag(), command_depth + depth); + 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(par - paragraphs.begin(), paragraphs), sep); + sgml::closeTag(os, wrapper); + ++par; } - - if (style->latextype == LATEX_ENVIRONMENT) { - if (!style->innertag().empty()) { - if (style->innertag() == "CDATA") - os << "<![CDATA["; - else - sgml::openTag(os, depth + command_depth, false, - style->innertag()); - } - break; + else { + send = searchEnvironment(par, pend); + par = makeEnvironment(buf, os, runparams, paragraphs, par,send); } + break; + } + case LATEX_PARAGRAPH: + send = searchParagraph(par, pend); + par = makeParagraph(buf, os, runparams, paragraphs, par,send); + break; + default: + break; + } - environment_inner[depth] = style->innertag(); - - if (!environment_inner[depth].empty()) - sgml::openTag(os, depth + 1 + command_depth, - false, environment_inner[depth]); + // Closing inner tag + switch (bstyle->latextype) { + case LATEX_ENVIRONMENT: + if (!bstyle->innertag().empty()) { + sgml::closeTag(os, bstyle->innertag()); + os << '\n'; + } + break; + case LATEX_ITEM_ENVIRONMENT: + sgml::closeTag(os, bstyle->itemtag()); + if (!bstyle->labeltag().empty()) + sgml::closeTag(os, bstyle->innertag()); break; default: - sgml::openTag(os, depth + command_depth, - false, style->latexname()); break; } + } + + if (bstyle->latextype == LATEX_ENVIRONMENT && bstyle->pass_thru) + os << "]]>"; + + // Closing outter tag + sgml::closeTag(os, *pbegin); + + return pend; +} - par->simpleDocBookOnePar(buf, os, - outerFont(par - const_cast<ParagraphList&>(paragraphs).begin(), paragraphs), - runparams, depth + 1 + command_depth, labelid); - // write closing SGML tags +ParagraphList::const_iterator makeCommand(Buffer const & buf, + ostream & os, + OutputParams const & runparams, + ParagraphList const & paragraphs, + ParagraphList::const_iterator const & pbegin, + ParagraphList::const_iterator const & pend) +{ + ParagraphList::const_iterator par = pbegin; + LyXLayout_ptr 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()); + os << expandLabel(buf.params().getLyXTextClass(), bstyle, false); + sgml::closeTag(os, bstyle->labeltag()); + } + + // Opend inner tag and close inner tags + sgml::openTag(os, bstyle->innertag()); + par->simpleDocBookOnePar(buf, os, runparams, outerFont(par - paragraphs.begin(), paragraphs)); + sgml::closeTag(os, bstyle->innertag()); + os << '\n'; + + ++par; + while (par != pend) { + LyXLayout_ptr const & style = par->layout(); + ParagraphList::const_iterator send; + switch (style->latextype) { - case LATEX_COMMAND: - sgml::closeTag(os, depth + command_depth, false, - style->innertag()); + case LATEX_COMMAND: { + send = searchCommand(par, pend); + par = makeCommand(buf, os, runparams, paragraphs, par,send); break; + } case LATEX_ENVIRONMENT: - if (!style->innertag().empty()) { - if (style->innertag() == "CDATA") - os << "]]>"; - else - sgml::closeTag(os, depth + command_depth, false, - style->innertag()); - } - break; - case LATEX_ITEM_ENVIRONMENT: - item_tag = style->itemtag(); + case LATEX_ITEM_ENVIRONMENT: { + send = searchEnvironment(par, pend); + par = makeEnvironment(buf, os, runparams, paragraphs, par,send); break; + } case LATEX_PARAGRAPH: - sgml::closeTag(os, depth + command_depth, false, style->latexname()); + send = searchParagraph(par, pend); + par = makeParagraph(buf, os, runparams, paragraphs, par,send); break; default: - sgml::closeTag(os, depth + command_depth, false, style->latexname()); break; } } + // Close outter tag + sgml::closeTag(os, *pbegin); - // Close open tags - for (int d = depth; d >= 0; --d) { - if (!environment_stack[depth].empty()) { - sgml::closeEnvTags(os, false, environment_inner[depth], - item_tag, command_depth + depth); - } - } + return pend; +} + +} // end anonym namespace + + +void docbookParagraphs(ParagraphList const & paragraphs, + Buffer const & buf, + ostream & os, + OutputParams const & runparams) +{ + ParagraphList::const_iterator par = paragraphs.begin(); + ParagraphList::const_iterator pend = paragraphs.end(); + + while (par != pend) { + LyXLayout_ptr const & style = par->layout(); + ParagraphList::const_iterator send; - for (int j = command_depth; j >= 0 ; --j) - if (!command_stack[j].empty()) { - sgml::closeTag(os, j, false, command_stack[j]); - os << endl; + switch (style->latextype) { + case LATEX_COMMAND: { + send = searchCommand(par, pend); + par = makeCommand(buf, os, runparams, paragraphs, par,send); + break; + } + case LATEX_ENVIRONMENT: + case LATEX_ITEM_ENVIRONMENT: { + send = searchEnvironment(par, pend); + par = makeEnvironment(buf, os, runparams, paragraphs, par,send); + break; } + case LATEX_PARAGRAPH: + send = searchParagraph(par, pend); + par = makeParagraph(buf, os, runparams, paragraphs, par,send); + break; + default: + break; + } + } }