]> git.lyx.org Git - lyx.git/blobdiff - src/paragraph_pimpl.C
fix build, thesaurus
[lyx.git] / src / paragraph_pimpl.C
index 7ee64a70d8f8a429a7025e724c6e24e46d049ba8..ab9ba6d170a34ac7faba5461f7d2b9b6bcf8673e 100644 (file)
@@ -21,6 +21,8 @@
 #include "encoding.h"
 #include "lyxrc.h"
 #include "debug.h"
+#include "lyxtextclasslist.h"
+
 #include "support/LAssert.h"
 
 using lyx::pos_type;
@@ -28,12 +30,24 @@ using lyx::pos_type;
 extern int tex_code_break_column;
 
 
-// Initialization of the counter for the paragraph id's,
-unsigned int Paragraph::Pimpl::paragraph_id = 0;
-
 // Initialize static member.
 ShareContainer<LyXFont> Paragraph::Pimpl::FontTable::container;
+// Initialization of the counter for the paragraph id's,
+unsigned int Paragraph::Pimpl::paragraph_id = 0;
 
+namespace {
+string special_phrases[][2] = {
+       { "LyX", "\\LyX{}" },
+       { "TeX", "\\TeX{}" },
+       { "LaTeX2e", "\\LaTeXe{}" },
+       { "LaTeX", "\\LaTeX{}" },
+       };
+size_t phrases_nr = sizeof(special_phrases)/sizeof(special_phrases[0]);
+} // namespace anon
 
 Paragraph::Pimpl::Pimpl(Paragraph * owner)
        : owner_(owner)
@@ -138,6 +152,7 @@ void Paragraph::Pimpl::insertInset(pos_type pos,
                        "there is an inset in position: " << pos << std::endl;
        } else {
                owner_->insetlist.insert(it, InsetTable(pos, inset));
+               inset->parOwner(owner_);
        }
        
        if (inset_owner)
@@ -207,9 +222,9 @@ void Paragraph::Pimpl::erase(pos_type pos)
 
 
 void Paragraph::Pimpl::simpleTeXBlanks(std::ostream & os, TexRow & texrow,
-                                      pos_type const i,
-                                      int & column, LyXFont const & font,
-                                      LyXLayout const & style)
+                                       pos_type const i,
+                                       int & column, LyXFont const & font,
+                                       LyXLayout const & style)
 {
        if (style.pass_thru) return;
        if (column > tex_code_break_column
@@ -218,6 +233,7 @@ void Paragraph::Pimpl::simpleTeXBlanks(std::ostream & os, TexRow & texrow,
            && (i < size() - 1)
            // same in FreeSpacing mode
            && !style.free_spacing
+               && !owner_->isFreeSpacing()
            // In typewriter mode, we want to avoid 
            // ! . ? : at the end of a line
            && !(font.family() == LyXFont::TYPEWRITER_FAMILY
@@ -243,13 +259,18 @@ void Paragraph::Pimpl::simpleTeXBlanks(std::ostream & os, TexRow & texrow,
 }
 
 
-bool Paragraph::Pimpl::isTextAt(string const & str, pos_type pos)
+bool Paragraph::Pimpl::isTextAt(BufferParams const & bp,
+                               string const & str, pos_type pos)
 {
-       for (int i=0; i < str.length(); ++i) {
-               if (pos + i >= size())
+       LyXFont const & font = owner_->getFont(bp, pos);
+       for (string::size_type i = 0; i < str.length(); ++i) {
+               if (pos + static_cast<pos_type>(i) >= size())
                        return false;
                if (str[i] != getChar(pos + i))
                        return false;
+               if (owner_->getFont(bp, pos + i) != font)
+                       return false;
        }
        return true;
 }
@@ -292,7 +313,7 @@ void Paragraph::Pimpl::simpleTeXSpecialChars(Buffer const * buf,
                        }
 
                        int tmp = inset->latex(buf, os, moving_arg,
-                                              style.free_spacing);
+                                              style.free_spacing);
 
                        if (close)
                                os << "}";
@@ -460,25 +481,25 @@ void Paragraph::Pimpl::simpleTeXSpecialChars(Buffer const * buf,
                                }
                                break;
                        }
-                               
-                       if (isTextAt("LyX", i)) {
-                               os << "\\LyX{}";
-                               i += 2;
-                               column += 5;
-                       } else if (isTextAt("TeX", i)) {
-                               os << "\\TeX{}";
-                               i += 2;
-                               column += 5;
-                       } else if (isTextAt("LaTeX2e", i)) {
-                               os << "\\LaTeXe{}";
-                               i += 6;
-                               column += 8;
-                       } else if (isTextAt("LaTeX", i)) {
-                               os << "\\LaTeX{}";
-                               i += 4;
-                               column += 7;
-                       // do we really try to print out '\0' ?
-                       } else if (c != '\0') {
+               
+                       // LyX, LaTeX etc.
+                       // FIXME: if we have "LaTeX" with a font change in the middle (before
+                       // the 'T', then the "TeX" part is still special cased. Really we
+                       // should only operate this on "words" for some definition of word
+                       size_t pnr = 0;
+                       for (; pnr < phrases_nr; ++pnr) {
+                               if (isTextAt(bparams, special_phrases[pnr][0], i)) {
+                                       os << special_phrases[pnr][1];
+                                       i += special_phrases[pnr][0].length() - 1;
+                                       column += special_phrases[pnr][1].length() - 1;
+                                       break;
+                               }
+                       }
+
+                       if (pnr == phrases_nr && c != '\0') {
                                os << c;
                        }
                        break;