X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fparagraph_pimpl.C;h=ab9ba6d170a34ac7faba5461f7d2b9b6bcf8673e;hb=21226de2b87a86be19fff025cace3d286a75aa76;hp=5722b55b5c6aa40757cad3fe50074401afe95a5b;hpb=3f1021344b067ebf2b5a048d0bd03d3d4d9cd2dc;p=lyx.git diff --git a/src/paragraph_pimpl.C b/src/paragraph_pimpl.C index 5722b55b5c..ab9ba6d170 100644 --- a/src/paragraph_pimpl.C +++ b/src/paragraph_pimpl.C @@ -21,17 +21,33 @@ #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; +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 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) @@ -136,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) @@ -205,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 @@ -216,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 @@ -241,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(i) >= size()) return false; if (str[i] != getChar(pos + i)) return false; + if (owner_->getFont(bp, pos + i) != font) + return false; } return true; } @@ -290,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 << "}"; @@ -458,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;