]> git.lyx.org Git - lyx.git/blobdiff - src/output_docbook.C
fix reading the author field.
[lyx.git] / src / output_docbook.C
index 047b6a0300497bc7bcb37931a4ac344c42bf5d3a..de47d99b0f6d32ad4d133cccaabac94ab59b24ba 100644 (file)
@@ -15,6 +15,9 @@
 
 #include "buffer.h"
 #include "bufferparams.h"
+#include "counters.h"
+#include "debug.h"
+#include "lyxtext.h"
 #include "paragraph.h"
 #include "paragraph_funcs.h"
 #include "ParagraphParameters.h"
@@ -24,6 +27,7 @@
 
 #include "support/lstrings.h"
 #include "support/lyxlib.h"
+#include "support/tostr.h"
 
 #include <stack>
 
@@ -32,6 +36,7 @@
 
 using lyx::support::atoi;
 using lyx::support::split;
+using lyx::support::subst;
 
 using std::endl;
 using std::ostream;
@@ -57,20 +62,21 @@ void docbookParagraphs(Buffer const & buf,
 
        string command_name;
 
-       ParagraphList::iterator par = const_cast<ParagraphList&>(paragraphs).begin();
-       ParagraphList::iterator pend = const_cast<ParagraphList&>(paragraphs).end();
+       string item_tag;
+
+       ParagraphList::const_iterator par = paragraphs.begin();
+       ParagraphList::const_iterator pend = paragraphs.end();
+
+       Counters & counters = buf.params().getLyXTextClass().counters();
 
        for (; par != pend; ++par) {
-               string inner_tag;
-               int desc_on = 0; // description mode
 
                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::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();
@@ -79,32 +85,40 @@ void docbookParagraphs(Buffer const & buf,
                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::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();
                }
 
+               string ls = par->getDocbookId();
+               if (!ls.empty())
+                       ls = " id = \"" + ls + "\"";
+
                // Write opening SGML tags.
-               string item_name;
                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());
+                                   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;
-                       inner_tag = style->innertag();
-                       
+
                        if (command_flag) {
                                if (cmd_depth < command_base) {
                                        for (Paragraph::depth_type j = command_depth;
@@ -130,24 +144,33 @@ void docbookParagraphs(Buffer const & buf,
                                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;
+                       if (style->latexparam().find('#') != string::npos) {
+                               counters.step(style->counter);
+                       }
+
+                       if (!style->latexparam().empty()) {
+                               ls = style->latexparam();
+                               if (ls.find('#') != string::npos) {
+                                       string el = expandLabel(buf.params().getLyXTextClass(),
+                                               style, false);
+                                       ls = subst(ls, "#", el);
                                }
                        }
 
-                       sgml::openTag(os, depth + command_depth, false, command_name);
+                       sgml::openTag(os, depth + command_depth, false, command_name, ls);
+
+                       // Label around sectioning number:
+                       if (!style->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());
+                       }
+
                        // Inner tagged header text, e.g. <title> for sectioning:
-                       sgml::openTag(os, depth + 1 + command_depth, false, inner_tag);
+                       sgml::openTag(os, depth + 1 + command_depth, false,
+                               style->innertag());
                        break;
 
                case LATEX_ENVIRONMENT:
@@ -164,59 +187,58 @@ void docbookParagraphs(Buffer const & buf,
                                }
                                environment_stack[depth] = style->latexname();
                                environment_inner[depth] = "!-- --";
-                               sgml::openTag(os, depth + command_depth, false, environment_stack[depth]);
+                               // outputs <environment_stack[depth] latexparam()>
+                               sgml::openTag(os, depth + command_depth, false,
+                                               environment_stack[depth], style->latexparam() + ls);
                        } else {
-                                       sgml::closeEnvTags(os, false, environment_inner[depth], 
-                                               command_depth + depth);
+                               sgml::closeEnvTags(os, false, environment_inner[depth],
+                                       style->itemtag(), command_depth + depth);
                        }
 
                        if (style->latextype == LATEX_ENVIRONMENT) {
-                               if (!style->latexparam().empty()) {
-                                       if (style->latexparam() == "CDATA")
+                               if (!style->innertag().empty()) {
+                                       if (style->innertag() == "CDATA")
                                                os << "<![CDATA[";
                                        else
-                                               sgml::openTag(os, depth + command_depth, false, style->latexparam());
+                                               sgml::openTag(os, depth + command_depth, false,
+                                                       style->innertag());
                                }
                                break;
                        }
 
-                       desc_on = (style->labeltype == LABEL_MANUAL);
+                       environment_inner[depth] = style->innertag();
 
-                       environment_inner[depth] = desc_on ? "varlistentry" : "listitem";
-                       sgml::openTag(os, depth + 1 + command_depth,
+                       if (!environment_inner[depth].empty())
+                               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);
                        break;
                default:
                        sgml::openTag(os, depth + command_depth,
-                                   false, style->latexname());
+                                   false, style->latexname(), ls);
                        break;
                }
 
-               par->simpleDocBookOnePar(buf, os, outerFont(par, paragraphs), desc_on,
-                                        runparams, depth + 1 + command_depth);
+               par->simpleDocBookOnePar(buf, os,
+                       outerFont(par - paragraphs.begin(), paragraphs),
+                       runparams, depth + 1 + command_depth);
 
-               string end_tag;
                // write closing SGML tags
                switch (style->latextype) {
                case LATEX_COMMAND:
-                       sgml::closeTag(os, depth + command_depth, false, inner_tag);
+                       sgml::closeTag(os, depth + command_depth, false,
+                               style->innertag());
                        break;
                case LATEX_ENVIRONMENT:
-                       if (!style->latexparam().empty()) {
-                               if (style->latexparam() == "CDATA")
+                       if (!style->innertag().empty()) {
+                               if (style->innertag() == "CDATA")
                                        os << "]]>";
                                else
-                                       sgml::closeTag(os, depth + command_depth, false, style->latexparam());
+                                       sgml::closeTag(os, depth + command_depth, false,
+                                               style->innertag());
                        }
                        break;
                case LATEX_ITEM_ENVIRONMENT:
-                       if (desc_on == 1) break;
-                       end_tag = "para";
-                       sgml::closeTag(os, depth + 1 + command_depth, false, end_tag);
+                       item_tag = style->itemtag();
                        break;
                case LATEX_PARAGRAPH:
                        sgml::closeTag(os, depth + command_depth, false, style->latexname());
@@ -230,8 +252,8 @@ void docbookParagraphs(Buffer const & buf,
        // 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);
+                               sgml::closeEnvTags(os, false, environment_inner[depth],
+                                       item_tag, command_depth + depth);
                }
        }
 
@@ -241,4 +263,3 @@ void docbookParagraphs(Buffer const & buf,
                        os << endl;
                }
 }
-