]> git.lyx.org Git - lyx.git/blobdiff - src/output_docbook.C
Really fix start_of_appendix output
[lyx.git] / src / output_docbook.C
index 047b6a0300497bc7bcb37931a4ac344c42bf5d3a..f398c8b76fa0bfc02e2ee70bf41b7b83a4b970a0 100644 (file)
 #include "output_docbook.h"
 
 #include "buffer.h"
+#include "buffer_funcs.h"
 #include "bufferparams.h"
+#include "counters.h"
+#include "debug.h"
 #include "paragraph.h"
 #include "paragraph_funcs.h"
+#include "ParagraphList_fwd.h"
 #include "ParagraphParameters.h"
 #include "sgml.h"
 
 
 #include "support/lstrings.h"
 #include "support/lyxlib.h"
-
-#include <stack>
+#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<string> environment_stack(10);
-       vector<string> environment_inner(10);
-       vector<string> 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;
+       return p;
+}
 
-       ParagraphList::iterator par = const_cast<ParagraphList&>(paragraphs).begin();
-       ParagraphList::iterator pend = const_cast<ParagraphList&>(paragraphs).end();
 
-       for (; par != pend; ++par) {
-               string inner_tag;
-               int desc_on = 0; // description mode
+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( ; 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) {
-                       if (!environment_inner[depth].empty()) 
-                       sgml::closeEnvTags(os, false, environment_inner[depth], 
-                                       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], 
-                                       command_depth + depth);
-                       sgml::closeTag(os, depth + command_depth, false, environment_stack[depth]);
+               if(p->params().depth() < par->params().depth())
+                       return p;
+
+               if( style->latexname() != bstyle->latexname() && p->params().depth() == par->params().depth() )
+                       return p;
+       }
+       return pend;
+}
+
 
-                       environment_stack[depth].erase();
-                       environment_inner[depth].erase();
+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;
+}
 
-               // Write opening SGML tags.
-               string item_name;
-               switch (style->latextype) {
-               case LATEX_PARAGRAPH:
-                       sgml::openTag(os, depth + command_depth,
-                                   false, style->latexname());
-                       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;
-                       inner_tag = style->innertag();
-                       
-                       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;
-
-                       // 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->isInset(0)) {
-                               InsetOld * inset = par->getInset(0);
-                               InsetOld::Code lyx_code = inset->lyxCode();
-                               if (lyx_code == InsetOld::LABEL_CODE) {
-                                       command_name += " id=\"";
-                                       command_name += (static_cast<InsetCommand *>(inset))->getContents();
-                                       command_name += '"';
-                                       desc_on = 3;
-                               }
-                       }
 
-                       sgml::openTag(os, depth + command_depth, false, command_name);
-                       // Inner tagged header text, e.g. <title> for sectioning:
-                       sgml::openTag(os, depth + 1 + command_depth, false, inner_tag);
-                       break;
+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;
 
+       LyXLayout_ptr const & defaultstyle = buf.params().getLyXTextClass().defaultLayout();
+       LyXLayout_ptr const & bstyle = par->layout();
+       string item_tag;
+
+       // Opening outter tag
+       sgml::openTag(buf, os, runparams, *pbegin);
+       os << '\n';
+       if (bstyle->latextype == LATEX_ENVIRONMENT && bstyle->pass_thru)
+               os << "<![CDATA[";
+
+       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;
+
+               // Opening inner tag
+               switch (bstyle->latextype) {
                case LATEX_ENVIRONMENT:
-               case LATEX_ITEM_ENVIRONMENT:
-                       if (depth < par->params().depth()) {
-                               depth = par->params().depth();
-                               environment_stack[depth].erase();
+                       if (!bstyle->innertag().empty()) {
+                               sgml::openTag(os, bstyle->innertag(), id);
                        }
+                       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] = "!-- --";
-                               sgml::openTag(os, depth + command_depth, false, environment_stack[depth]);
-                       } else {
-                                       sgml::closeEnvTags(os, false, environment_inner[depth], 
-                                               command_depth + depth);
+               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());
                        }
+                       wrapper = defaultstyle->latexname();
+                       sgml::openTag(os, bstyle->itemtag());
+               default:
+                       break;
+               }
 
-                       if (style->latextype == LATEX_ENVIRONMENT) {
-                               if (!style->latexparam().empty()) {
-                                       if (style->latexparam() == "CDATA")
-                                               os << "<![CDATA[";
-                                       else
-                                               sgml::openTag(os, depth + command_depth, false, style->latexparam());
-                               }
-                               break;
+               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;
                        }
+                       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;
+               }
 
-                       desc_on = (style->labeltype == LABEL_MANUAL);
-
-                       environment_inner[depth] = desc_on ? "varlistentry" : "listitem";
-                       sgml::openTag(os, depth + 1 + command_depth,
-                                   false, environment_inner[depth]);
-
-                       item_name = desc_on ? "term" : "para";
-                       sgml::openTag(os, depth + 1 + command_depth,
-                                   false, item_name);
+               // 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;
+}
+
+
+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->simpleDocBookOnePar(buf, os, outerFont(par, paragraphs), desc_on,
-                                        runparams, depth + 1 + command_depth);
+       ++par;
+       while (par != pend) {
+               LyXLayout_ptr const & style = par->layout();
+               ParagraphList::const_iterator send;
 
-               string end_tag;
-               // write closing SGML tags
                switch (style->latextype) {
-               case LATEX_COMMAND:
-                       sgml::closeTag(os, depth + command_depth, false, inner_tag);
+               case LATEX_COMMAND: {
+                       send = searchCommand(par, pend);
+                       par = makeCommand(buf, os, runparams, paragraphs, par,send);
                        break;
+               }
                case LATEX_ENVIRONMENT:
-                       if (!style->latexparam().empty()) {
-                               if (style->latexparam() == "CDATA")
-                                       os << "]]>";
-                               else
-                                       sgml::closeTag(os, depth + command_depth, false, style->latexparam());
-                       }
-                       break;
-               case LATEX_ITEM_ENVIRONMENT:
-                       if (desc_on == 1) break;
-                       end_tag = "para";
-                       sgml::closeTag(os, depth + 1 + command_depth, false, end_tag);
+               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);
+
+       return pend;
+}
+
+} // end anonym namespace
 
-       // Close open tags
-       for (int d = depth; d >= 0; --d) {
-               if (!environment_stack[depth].empty()) {
-                               sgml::closeEnvTags(os, false, environment_inner[depth], 
-                                       command_depth + depth);
-               }
-       }
 
-       for (int j = command_depth; j >= 0 ; --j)
-               if (!command_stack[j].empty()) {
-                       sgml::closeTag(os, j, false, command_stack[j]);
-                       os << endl;
+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;
+
+               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;
+               }
+       }
 }
-