]> git.lyx.org Git - lyx.git/blobdiff - src/paragraph.C
Fix #1736
[lyx.git] / src / paragraph.C
index 83cc81d24a42452ba509fbb6e4ede3270f3e71b4..5e02c66dd232ca71270e53cf31566983f262c4ca 100644 (file)
@@ -1331,14 +1331,40 @@ void Paragraph::simpleLinuxDocOnePar(Buffer const & buf,
 }
 
 
-string Paragraph::getDocbookId() const
+bool Paragraph::emptyTag() const
+{
+       for (pos_type i = 0; i < size(); ++i) {
+               if (isInset(i)) {
+                       InsetBase const * inset = getInset(i);
+                       InsetBase::Code lyx_code = inset->lyxCode();
+                       if (lyx_code != InsetBase::TOC_CODE and
+                           lyx_code != InsetBase::INCLUDE_CODE and
+                           lyx_code != InsetBase::GRAPHICS_CODE and
+                           lyx_code != InsetBase::ERT_CODE and
+                           lyx_code != InsetBase::FLOAT_CODE and
+                           lyx_code != InsetBase::TABULAR_CODE) {
+                               return false;
+                       }
+               } else {
+                       char c = getChar(i);
+                       if(c!= ' ' and c!= '\t')
+                               return false;
+               }
+
+       }
+       return true;
+}
+
+
+string Paragraph::getID(Buffer const & buf, OutputParams const & runparams) const
 {
        for (pos_type i = 0; i < size(); ++i) {
                if (isInset(i)) {
                        InsetBase const * inset = getInset(i);
                        InsetBase::Code lyx_code = inset->lyxCode();
                        if (lyx_code == InsetBase::LABEL_CODE) {
-                               return static_cast<InsetCommand const *>(inset)->getContents();
+                               string const id = static_cast<InsetCommand const *>(inset)->getContents();
+                               return "id=\"" + sgml::cleanID(buf, runparams, id) + "\"";
                        }
                }
 
@@ -1347,122 +1373,100 @@ string Paragraph::getDocbookId() const
 }
 
 
+pos_type Paragraph::getFirstWord(Buffer const & buf, ostream & os, OutputParams const & runparams) const
+{
+       pos_type i;
+       for (i = 0; i < size(); ++i) {
+               if (isInset(i)) {
+                       InsetBase const * inset = getInset(i);
+                       inset->docbook(buf, os, runparams);
+               } else {
+                       char c = getChar(i);
+                       if (c == ' ')
+                               break;
+                       bool ws;
+                       string str;
+                       boost::tie(ws, str) = sgml::escapeChar(c);
+
+                       os << str;
+               }
+       }
+       return i;
+}
+
+
+bool Paragraph::onlyText(Buffer const & buf, LyXFont const & outerfont, pos_type initial) const
+{
+       LyXLayout_ptr const & style = layout();
+       LyXFont font_old;
+
+       for (pos_type i = initial; i < size(); ++i) {
+               LyXFont font = getFont(buf.params(), i, outerfont);
+               if (isInset(i))
+                       return false;
+               if ( i != initial and font != font_old)
+                       return false;
+               font_old = font;
+       }
+
+       return true;
+}
+
+
 void Paragraph::simpleDocBookOnePar(Buffer const & buf,
                                    ostream & os,
-                                   LyXFont const & outerfont,
                                    OutputParams const & runparams,
-                                   lyx::depth_type depth) const
+                                   LyXFont const & outerfont,
+                                   pos_type initial) const
 {
        bool emph_flag = false;
 
        LyXLayout_ptr const & style = layout();
-       LyXLayout_ptr const & defaultstyle =
-               buf.params().getLyXTextClass().defaultLayout();
-
        LyXFont font_old =
                style->labeltype == LABEL_MANUAL ? style->labelfont : style->font;
 
-       int char_line_count = depth;
-       bool label_closed = true;
-       bool para_closed = true;
-
-       if (style->latextype == LATEX_ITEM_ENVIRONMENT) {
-               string ls = "";
-               Counters & counters = buf.params().getLyXTextClass().counters();
-               if (!style->free_spacing)
-                       os << string(depth,' ');
-               if (!style->labeltag().empty()) {
-                       os << "<" << style->labeltag() << ">\n";
-                       label_closed = false;
-               } else {
-                       if (!defaultstyle->latexparam().empty()) {
-                               counters.step("para");
-                               ls = tostr(counters.value("para"));
-                               ls = " id=\""
-                                       + subst(defaultstyle->latexparam(), "#", ls) + '"';
-                       }
-                       os << "<" << style->itemtag() << ">\n"
-                          << string(depth, ' ') << "<"
-                          << defaultstyle->latexname() << ls << ">\n";
-                       para_closed = false;
-               }
-       }
-
+       if (style->pass_thru and not onlyText(buf, outerfont, initial))
+               os << "]]>";
        // parsing main loop
-       for (pos_type i = 0; i < size(); ++i) {
+       for (pos_type i = initial; i < size(); ++i) {
                LyXFont font = getFont(buf.params(), i, outerfont);
 
                // handle <emphasis> tag
                if (font_old.emph() != font.emph()) {
                        if (font.emph() == LyXFont::ON) {
-                               if (style->latexparam() == "CDATA")
-                                       os << "]]>";
                                os << "<emphasis>";
-                               if (style->latexparam() == "CDATA")
-                                       os << "<![CDATA[";
                                emph_flag = true;
-                       } else if (i) {
-                               if (style->latexparam() == "CDATA")
-                                       os << "]]>";
+                       } else if (i != initial) {
                                os << "</emphasis>";
-                               if (style->latexparam() == "CDATA")
-                                       os << "<![CDATA[";
                                emph_flag = false;
                        }
                }
 
                if (isInset(i)) {
                        InsetBase const * inset = getInset(i);
-                       if (style->latexparam() == "CDATA")
-                               os << "]]>";
                        inset->docbook(buf, os, runparams);
-                       if (style->latexparam() == "CDATA")
-                               os << "<![CDATA[";
                } else {
                        char c = getChar(i);
                        bool ws;
                        string str;
                        boost::tie(ws, str) = sgml::escapeChar(c);
 
-                       if (style->pass_thru) {
+                       if (style->pass_thru)
                                os << c;
-                       } else if (isFreeSpacing() || c != ' ') {
-                                       os << str;
-                       } else if (!style->labeltag().empty() && !label_closed) {
-                               ++char_line_count;
-                               os << "\n</" << style->labeltag() << "><"
-                                  << style->itemtag() << "><"
-                                  << defaultstyle->latexname() << ">";
-                               label_closed = true;
-                               para_closed = false;
-                       } else {
-                               os << ' ';
-                       }
+                       else
+                               os << str;
                }
                font_old = font;
        }
 
        if (emph_flag) {
-               if (style->latexparam() == "CDATA")
-                       os << "]]>";
                os << "</emphasis>";
-               if (style->latexparam() == "CDATA")
-                       os << "<![CDATA[";
        }
 
-       // resets description flag correctly
-       if (!label_closed) {
-               // <term> not closed...
-               os << "</" << style->labeltag() << ">\n<"
-                  << style->itemtag() << "><"
-                  << defaultstyle->latexname() << ">&nbsp;";
-       }
-       if (!para_closed) {
-               os << "\n" << string(depth, ' ') << "</"
-                  << defaultstyle->latexname() << ">\n";
-       }
        if (style->free_spacing)
                os << '\n';
+       if (style->pass_thru and not onlyText(buf, outerfont, initial))
+               os << "<![CDATA[";
 }