X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fparagraph_pimpl.C;h=c223c727853ca3dc61aa6bc0e56c2beb2f7d5706;hb=dbd7a961fc46bb10c85bdd8c7fb6626477ae63d8;hp=5722b55b5c6aa40757cad3fe50074401afe95a5b;hpb=3f1021344b067ebf2b5a048d0bd03d3d4d9cd2dc;p=lyx.git diff --git a/src/paragraph_pimpl.C b/src/paragraph_pimpl.C index 5722b55b5c..c223c72785 100644 --- a/src/paragraph_pimpl.C +++ b/src/paragraph_pimpl.C @@ -21,17 +21,37 @@ #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 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) @@ -96,7 +116,7 @@ void Paragraph::Pimpl::insertChar(pos_type pos, value_type c, // 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) @@ -106,7 +126,7 @@ void Paragraph::Pimpl::insertChar(pos_type pos, value_type c, // 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) @@ -128,14 +148,15 @@ void Paragraph::Pimpl::insertInset(pos_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) @@ -151,7 +172,7 @@ void Paragraph::Pimpl::erase(pos_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) { @@ -166,7 +187,7 @@ void Paragraph::Pimpl::erase(pos_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 && @@ -196,7 +217,7 @@ void Paragraph::Pimpl::erase(pos_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) @@ -204,10 +225,10 @@ 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) +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 @@ -216,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 @@ -241,13 +263,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; } @@ -255,7 +282,7 @@ bool Paragraph::Pimpl::isTextAt(string const & str, pos_type pos) void Paragraph::Pimpl::simpleTeXSpecialChars(Buffer const * buf, BufferParams const & bparams, - std::ostream & os, + ostream & os, TexRow & texrow, bool moving_arg, LyXFont & font, @@ -290,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 << "}"; @@ -458,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; @@ -488,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 { @@ -503,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; } @@ -530,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 @@ -544,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