X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fparagraph_pimpl.C;h=ab9ba6d170a34ac7faba5461f7d2b9b6bcf8673e;hb=21226de2b87a86be19fff025cace3d286a75aa76;hp=de5185747e83653c97c95a50044a4d64bb12f6e4;hpb=7cf094f99eea8341d421bc3b3f9baa023cc48b97;p=lyx.git diff --git a/src/paragraph_pimpl.C b/src/paragraph_pimpl.C index de5185747e..ab9ba6d170 100644 --- a/src/paragraph_pimpl.C +++ b/src/paragraph_pimpl.C @@ -16,21 +16,38 @@ #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" +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) @@ -40,8 +57,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 +83,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,16 +97,14 @@ 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, - LyXFont const & font) +void Paragraph::Pimpl::insertChar(pos_type pos, value_type c, + LyXFont const & font) { lyx::Assert(pos <= size()); @@ -100,24 +113,27 @@ 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(), - fontlist.end(), - search_font, matchFT()); + fontlist.end(), + search_font, matchFT()); it != fontlist.end(); ++it) + { it->pos(it->pos() + 1); + } // Update the inset table. InsetTable search_inset(pos, 0); for (InsetList::iterator it = std::lower_bound(owner_->insetlist.begin(), - owner_->insetlist.end(), - search_inset, matchIT()); + owner_->insetlist.end(), + search_inset, matchIT()); it != owner_->insetlist.end(); ++it) + { ++it->pos; - + } owner_->setFont(pos, font); } -void Paragraph::Pimpl::insertInset(Paragraph::size_type pos, +void Paragraph::Pimpl::insertInset(pos_type pos, Inset * inset, LyXFont const & font) { lyx::Assert(inset); @@ -136,6 +152,7 @@ void Paragraph::Pimpl::insertInset(Paragraph::size_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) @@ -143,7 +160,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 @@ -205,9 +222,9 @@ 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) + 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,6 +259,23 @@ void Paragraph::Pimpl::simpleTeXBlanks(std::ostream & os, TexRow & texrow, } +bool Paragraph::Pimpl::isTextAt(BufferParams const & bp, + string const & str, pos_type pos) +{ + 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; +} + + void Paragraph::Pimpl::simpleTeXSpecialChars(Buffer const * buf, BufferParams const & bparams, std::ostream & os, @@ -251,9 +286,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; @@ -278,19 +313,20 @@ void Paragraph::Pimpl::simpleTeXSpecialChars(Buffer const * buf, } int tmp = inset->latex(buf, os, moving_arg, - style.free_spacing); + style.free_spacing); if (close) os << "}"; if (tmp) { + for (int j = 0; j < tmp; ++j) { + texrow.newline(); + } + texrow.start(owner_, i + 1); column = 0; } else { column += int(os.tellp()) - len; } - for (; tmp--;) { - texrow.newline(); - } } } break; @@ -437,54 +473,33 @@ void Paragraph::Pimpl::simpleTeXSpecialChars(Buffer const * buf, break; default: - /* idea for labels --- begin*/ - // Check for "LyX" - if (c == 'L' - && i <= size() - 3 - && font.family() != LyXFont::TYPEWRITER_FAMILY - && getChar(i + 1) == 'y' - && getChar(i + 2) == 'X') { - os << "\\LyX{}"; - i += 2; - column += 5; - } - // Check for "TeX" - else if (c == 'T' - && i <= size() - 3 - && font.family() != LyXFont::TYPEWRITER_FAMILY - && getChar(i + 1) == 'e' - && getChar(i + 2) == 'X') { - os << "\\TeX{}"; - i += 2; - column += 5; + + // I assume this is hack treating typewriter as verbatim + if (font.family() == LyXFont::TYPEWRITER_FAMILY) { + if (c != '\0') { + os << c; + } + break; } - // Check for "LaTeX2e" - else if (c == 'L' - && i <= size() - 7 - && font.family() != LyXFont::TYPEWRITER_FAMILY - && getChar(i + 1) == 'a' - && getChar(i + 2) == 'T' - && getChar(i + 3) == 'e' - && getChar(i + 4) == 'X' - && getChar(i + 5) == '2' - && getChar(i + 6) == 'e') { - os << "\\LaTeXe{}"; - i += 6; - column += 8; + + // 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; + } } - // Check for "LaTeX" - else if (c == 'L' - && i <= size() - 5 - && font.family() != LyXFont::TYPEWRITER_FAMILY - && getChar(i + 1) == 'a' - && getChar(i + 2) == 'T' - && getChar(i + 3) == 'e' - && getChar(i + 4) == 'X') { - os << "\\LaTeX{}"; - i += 4; - column += 7; - /* idea for labels --- end*/ - } else if (c != '\0') { + + if (pnr == phrases_nr && c != '\0') { os << c; } break; @@ -541,25 +556,22 @@ LyXFont const Paragraph::Pimpl::realizeFont(LyXFont const & font, while (par && par->getDepth() && !tmpfont.resolved()) { par = par->outerHook(); if (par) { -#ifndef INHERIT_LANGUAGE tmpfont.realize(textclasslist. Style(bparams.textclass, - par->getLayout()).font); -#else - tmpfont.realize(textclasslist. - Style(bparams.textclass, - par->getLayout()).font, bparams.language); + par->getLayout()).font +#ifdef INHERIT_LANGUAGE + , bparams.language #endif + ); par_depth = par->getDepth(); } } -#ifndef INHERIT_LANGUAGE - tmpfont.realize(textclasslist.TextClass(bparams.textclass) - .defaultfont()); -#else tmpfont.realize(textclasslist.TextClass(bparams.textclass) - .defaultfont(), bparams.language); + .defaultfont() +#ifdef INHERIT_LANGUAGE + , bparams.language #endif + ); return tmpfont; }