]> git.lyx.org Git - lyx.git/blobdiff - src/paragraph_pimpl.C
layout as string
[lyx.git] / src / paragraph_pimpl.C
index 1c4e244197e09cc8a6977f62d9f0a9aeeeb3179b..c223c727853ca3dc61aa6bc0e56c2beb2f7d5706 100644 (file)
 
 #include "paragraph_pimpl.h"
 #include "texrow.h"
+#include "language.h"
 #include "bufferparams.h"
 #include "encoding.h"
 #include "lyxrc.h"
 #include "debug.h"
+#include "lyxtextclasslist.h"
+
 #include "support/LAssert.h"
 
-extern int tex_code_break_column;
+using lyx::pos_type;
+using std::endl;
+using std::ostream;
+using std::upper_bound;
+using std::lower_bound;
 
+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)
@@ -40,8 +61,7 @@ Paragraph::Pimpl::Pimpl(Paragraph * owner)
 }
 
 
-Paragraph::Pimpl::Pimpl(Paragraph::Pimpl const & p, Paragraph * owner,
-                        bool same_ids)
+Paragraph::Pimpl::Pimpl(Pimpl const & p, Paragraph * owner, bool same_ids)
        : params(p.params), owner_(owner)
 {
        inset_owner = p.inset_owner;
@@ -67,8 +87,7 @@ void Paragraph::Pimpl::setContentsFromPar(Paragraph const * par)
 }
 
 
-Paragraph::value_type
-Paragraph::Pimpl::getChar(Paragraph::size_type pos) const
+Paragraph::value_type Paragraph::Pimpl::getChar(pos_type pos) const
 {
        lyx::Assert(pos <= size());
        // This is stronger, and I belive that this is the assertion
@@ -82,15 +101,13 @@ Paragraph::Pimpl::getChar(Paragraph::size_type pos) const
 }
 
 
-void Paragraph::Pimpl::setChar(Paragraph::size_type pos,
-                               Paragraph::value_type c)
+void Paragraph::Pimpl::setChar(pos_type pos, value_type c)
 {
        text[pos] = c;
 }
 
 
-void Paragraph::Pimpl::insertChar(Paragraph::size_type pos,
-                                  Paragraph::value_type c,
+void Paragraph::Pimpl::insertChar(pos_type pos, value_type c,
                                   LyXFont const & font)
 {
        lyx::Assert(pos <= size());
@@ -99,7 +116,7 @@ void Paragraph::Pimpl::insertChar(Paragraph::size_type pos,
 
        // Update the font table.
        FontTable search_font(pos, LyXFont());
-       for (FontList::iterator it = std::lower_bound(fontlist.begin(),
+       for (FontList::iterator it = lower_bound(fontlist.begin(),
                                                      fontlist.end(),
                                                      search_font, matchFT());
             it != fontlist.end(); ++it)
@@ -109,7 +126,7 @@ void Paragraph::Pimpl::insertChar(Paragraph::size_type pos,
    
        // Update the inset table.
        InsetTable search_inset(pos, 0);
-       for (InsetList::iterator it = std::lower_bound(owner_->insetlist.begin(),
+       for (InsetList::iterator it = lower_bound(owner_->insetlist.begin(),
                                                       owner_->insetlist.end(),
                                                       search_inset, matchIT());
             it != owner_->insetlist.end(); ++it)
@@ -120,7 +137,7 @@ void Paragraph::Pimpl::insertChar(Paragraph::size_type pos,
 }
 
 
-void Paragraph::Pimpl::insertInset(Paragraph::size_type pos,
+void Paragraph::Pimpl::insertInset(pos_type pos,
                                   Inset * inset, LyXFont const & font)
 {
        lyx::Assert(inset);
@@ -131,14 +148,15 @@ void Paragraph::Pimpl::insertInset(Paragraph::size_type pos,
        
        // Add a new entry in the inset table.
        InsetTable search_inset(pos, 0);
-       InsetList::iterator it = std::lower_bound(owner_->insetlist.begin(),
+       InsetList::iterator it = lower_bound(owner_->insetlist.begin(),
                                                  owner_->insetlist.end(),
                                                  search_inset, matchIT());
        if (it != owner_->insetlist.end() && it->pos == pos) {
                lyxerr << "ERROR (Paragraph::InsertInset): "
-                       "there is an inset in position: " << pos << std::endl;
+                       "there is an inset in position: " << pos << endl;
        } else {
                owner_->insetlist.insert(it, InsetTable(pos, inset));
+               inset->parOwner(owner_);
        }
        
        if (inset_owner)
@@ -146,7 +164,7 @@ void Paragraph::Pimpl::insertInset(Paragraph::size_type pos,
 }
 
 
-void Paragraph::Pimpl::erase(Paragraph::size_type pos)
+void Paragraph::Pimpl::erase(pos_type pos)
 {
        lyx::Assert(pos < size());
        // if it is an inset, delete the inset entry 
@@ -154,7 +172,7 @@ void Paragraph::Pimpl::erase(Paragraph::size_type pos)
                // find the entry
                InsetTable search_inset(pos, 0);
                InsetList::iterator it =
-                       std::lower_bound(owner_->insetlist.begin(),
+                       lower_bound(owner_->insetlist.begin(),
                                         owner_->insetlist.end(),
                                         search_inset, matchIT());
                if (it != owner_->insetlist.end() && it->pos == pos) {
@@ -169,7 +187,7 @@ void Paragraph::Pimpl::erase(Paragraph::size_type pos)
        FontTable search_font(pos, LyXFont());
        
        FontList::iterator it =
-               std::lower_bound(fontlist.begin(),
+               lower_bound(fontlist.begin(),
                            fontlist.end(),
                            search_font, matchFT());
        if (it != fontlist.end() && it->pos() == pos &&
@@ -199,7 +217,7 @@ void Paragraph::Pimpl::erase(Paragraph::size_type pos)
        InsetTable search_inset(pos, 0);
        InsetList::iterator lend = owner_->insetlist.end();
        for (InsetList::iterator it =
-                    std::upper_bound(owner_->insetlist.begin(),
+                    upper_bound(owner_->insetlist.begin(),
                                      lend,
                                      search_inset, matchIT());
             it != lend; ++it)
@@ -207,10 +225,10 @@ void Paragraph::Pimpl::erase(Paragraph::size_type pos)
 }
 
 
-void Paragraph::Pimpl::simpleTeXBlanks(std::ostream & os, TexRow & texrow,
-                                      Paragraph::size_type const i,
-                                      int & column, LyXFont const & font,
-                                      LyXLayout const & style)
+void Paragraph::Pimpl::simpleTeXBlanks(ostream & os, TexRow & texrow,
+                                       pos_type const i,
+                                       int & column, LyXFont const & font,
+                                       LyXLayout const & style)
 {
        if (style.pass_thru) return;
        if (column > tex_code_break_column
@@ -219,6 +237,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
@@ -244,13 +263,18 @@ void Paragraph::Pimpl::simpleTeXBlanks(std::ostream & os, TexRow & texrow,
 }
 
 
-bool Paragraph::Pimpl::isTextAt(string const & str, Paragraph::size_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;
 }
@@ -258,7 +282,7 @@ bool Paragraph::Pimpl::isTextAt(string const & str, Paragraph::size_type pos)
  
 void Paragraph::Pimpl::simpleTeXSpecialChars(Buffer const * buf,
                                             BufferParams const & bparams,
-                                            std::ostream & os,
+                                            ostream & os,
                                             TexRow & texrow,
                                             bool moving_arg,
                                             LyXFont & font,
@@ -266,9 +290,9 @@ void Paragraph::Pimpl::simpleTeXSpecialChars(Buffer const * buf,
                                             LyXFont & basefont,
                                             bool & open_font,
                                             LyXLayout const & style,
-                                            Paragraph::size_type & i,
+                                            pos_type & i,
                                             int & column,
-                                            Paragraph::value_type const c)
+                                            value_type const c)
 {
        if (style.pass_thru) {
                if (c != '\0') os << c;
@@ -293,7 +317,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 << "}";
@@ -461,25 +485,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;
@@ -491,14 +515,13 @@ void Paragraph::Pimpl::simpleTeXSpecialChars(Buffer const * buf,
 
 Paragraph * Paragraph::Pimpl::TeXDeeper(Buffer const * buf,
                                        BufferParams const & bparams,
-                                       std::ostream & os, TexRow & texrow)
+                                       ostream & os, TexRow & texrow)
 {
-       lyxerr[Debug::LATEX] << "TeXDeeper...     " << this << std::endl;
+       lyxerr[Debug::LATEX] << "TeXDeeper...     " << this << endl;
        Paragraph * par = owner_;
 
        while (par && par->params().depth() == owner_->params().depth()) {
-               if (textclasslist.Style(bparams.textclass, 
-                                       par->layout).isEnvironment()) {
+               if (textclasslist[bparams.textclass][par->layout()].isEnvironment()) {
                        par = par->TeXEnvironment(buf, bparams,
                                                  os, texrow);
                } else {
@@ -506,7 +529,7 @@ Paragraph * Paragraph::Pimpl::TeXDeeper(Buffer const * buf,
                                             os, texrow, false);
                }
        }
-       lyxerr[Debug::LATEX] << "TeXDeeper...done " << par << std::endl;
+       lyxerr[Debug::LATEX] << "TeXDeeper...done " << par << endl;
 
        return par;
 }
@@ -533,12 +556,12 @@ LyXFont const Paragraph::Pimpl::realizeFont(LyXFont const & font,
        // check for environment font information
        char par_depth = owner_->getDepth();
        Paragraph const * par = owner_;
+       LyXTextClass const & tclass = textclasslist[bparams.textclass];
+       
        while (par && par->getDepth() && !tmpfont.resolved()) {
                par = par->outerHook();
                if (par) {
-                       tmpfont.realize(textclasslist.
-                                       Style(bparams.textclass,
-                                             par->getLayout()).font
+                       tmpfont.realize(tclass[par->layout()].font
 #ifdef INHERIT_LANGUAGE
                                        , bparams.language
 #endif
@@ -547,8 +570,7 @@ LyXFont const Paragraph::Pimpl::realizeFont(LyXFont const & font,
                }
        }
 
-       tmpfont.realize(textclasslist.TextClass(bparams.textclass)
-                       .defaultfont()
+       tmpfont.realize(tclass.defaultfont()
 #ifdef INHERIT_LANGUAGE
                , bparams.language
 #endif