X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fparagraph_pimpl.C;h=ab4b20af932117b7d012be41b1167f083e104c92;hb=98c966c64594611e469313314abd1e59524adb4a;hp=c28db75b3316c85d8a8a3028c44f0e169b7d6b38;hpb=b8e78dc35f527143f2d51ba1e5f103decdeae6ad;p=lyx.git diff --git a/src/paragraph_pimpl.C b/src/paragraph_pimpl.C index c28db75b33..ab4b20af93 100644 --- a/src/paragraph_pimpl.C +++ b/src/paragraph_pimpl.C @@ -1,10 +1,10 @@ /* This file is part of - * ====================================================== - * + * ====================================================== + * * LyX, The Document Processor - * + * * Copyright 1995 Matthias Ettrich - * Copyright 1995-2001 The LyX Team. + * Copyright 1995-2001 The LyX Team. * * ====================================================== */ @@ -21,9 +21,15 @@ #include "encoding.h" #include "lyxrc.h" #include "debug.h" +#include "lyxtextclasslist.h" + #include "support/LAssert.h" using lyx::pos_type; +using std::endl; +using std::ostream; +using std::upper_bound; +using std::lower_bound; extern int tex_code_break_column; @@ -34,18 +40,18 @@ ShareContainer Paragraph::Pimpl::FontTable::container; 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) @@ -90,7 +96,7 @@ Paragraph::value_type Paragraph::Pimpl::getChar(pos_type pos) const // Then this has no meaning. (Lgb) if (!size() || pos == size()) return '\0'; - + return text[pos]; } @@ -102,7 +108,7 @@ void Paragraph::Pimpl::setChar(pos_type pos, value_type c) void Paragraph::Pimpl::insertChar(pos_type pos, value_type c, - LyXFont const & font) + LyXFont const & font) { lyx::Assert(pos <= size()); @@ -110,19 +116,19 @@ 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(), - fontlist.end(), - search_font, matchFT()); + for (FontList::iterator it = lower_bound(fontlist.begin(), + 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()); + for (InsetList::iterator it = lower_bound(owner_->insetlist.begin(), + owner_->insetlist.end(), + search_inset, matchIT()); it != owner_->insetlist.end(); ++it) { ++it->pos; @@ -136,22 +142,23 @@ void Paragraph::Pimpl::insertInset(pos_type pos, { lyx::Assert(inset); lyx::Assert(pos <= size()); - + insertChar(pos, META_INSET, font); lyx::Assert(text[pos] == META_INSET); - + // 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) inset->setOwner(inset_owner); } @@ -160,12 +167,12 @@ void Paragraph::Pimpl::insertInset(pos_type pos, void Paragraph::Pimpl::erase(pos_type pos) { lyx::Assert(pos < size()); - // if it is an inset, delete the inset entry + // if it is an inset, delete the inset entry if (text[pos] == Paragraph::META_INSET) { // 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) { @@ -173,19 +180,19 @@ void Paragraph::Pimpl::erase(pos_type pos) owner_->insetlist.erase(it); } } - + text.erase(text.begin() + pos); - + // Erase entries in the tables. 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 && - (pos == 0 || - (it != fontlist.begin() + (pos == 0 || + (it != fontlist.begin() && boost::prior(it)->pos() == pos - 1))) { // If it is a multi-character font // entry, we just make it smaller @@ -200,17 +207,17 @@ void Paragraph::Pimpl::erase(pos_type pos) it = fontlist.begin() + i - 1; } } - + // Update all other entries. FontList::iterator fend = fontlist.end(); for (; it != fend; ++it) it->pos(it->pos() - 1); - + // Update the inset table. 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) @@ -218,23 +225,24 @@ void Paragraph::Pimpl::erase(pos_type pos) } -void Paragraph::Pimpl::simpleTeXBlanks(std::ostream & os, TexRow & texrow, +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 - && i + && i && getChar(i - 1) != ' ' && (i < size() - 1) // same in FreeSpacing mode && !style.free_spacing - // In typewriter mode, we want to avoid + && !owner_->isFreeSpacing() + // In typewriter mode, we want to avoid // ! . ? : at the end of a line && !(font.family() == LyXFont::TYPEWRITER_FAMILY && (getChar(i - 1) == '.' - || getChar(i - 1) == '?' + || getChar(i - 1) == '?' || getChar(i - 1) == ':' || getChar(i - 1) == '!'))) { if (tex_code_break_column == 0) { @@ -255,9 +263,11 @@ void Paragraph::Pimpl::simpleTeXBlanks(std::ostream & os, TexRow & texrow, } -bool Paragraph::Pimpl::isTextAt(BufferParams const & bp, LyXFont & font, +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; @@ -269,10 +279,10 @@ bool Paragraph::Pimpl::isTextAt(BufferParams const & bp, LyXFont & font, return true; } - + void Paragraph::Pimpl::simpleTeXSpecialChars(Buffer const * buf, BufferParams const & bparams, - std::ostream & os, + ostream & os, TexRow & texrow, bool moving_arg, LyXFont & font, @@ -336,7 +346,7 @@ void Paragraph::Pimpl::simpleTeXSpecialChars(Buffer const * buf, running_font = basefont; break; - case Paragraph::META_HFILL: + case Paragraph::META_HFILL: os << "\\hfill{}"; column += 7; break; @@ -345,12 +355,12 @@ void Paragraph::Pimpl::simpleTeXSpecialChars(Buffer const * buf, // And now for the special cases within each mode switch (c) { - case '\\': + case '\\': os << "\\textbackslash{}"; column += 15; break; - - case '°': case '±': case '²': case '³': + + case '°': case '±': case '²': case '³': case '×': case '÷': case '¹': case 'ª': case 'º': case '¬': case 'µ': if ((bparams.inputenc == "latin1" || @@ -368,7 +378,7 @@ void Paragraph::Pimpl::simpleTeXSpecialChars(Buffer const * buf, os << c; } break; - + case '|': case '<': case '>': // In T1 encoding, these characters exist if (lyxrc.fontenc == "T1") { @@ -391,7 +401,7 @@ void Paragraph::Pimpl::simpleTeXSpecialChars(Buffer const * buf, if (font.family() == LyXFont::TYPEWRITER_FAMILY) { os << c; break; - } + } // Otherwise, we use what LaTeX // provides us. switch (c) { @@ -409,7 +419,7 @@ void Paragraph::Pimpl::simpleTeXSpecialChars(Buffer const * buf, break; } break; - + case '-': // "--" in Typewriter mode -> "-{}-" if (i <= size() - 2 && getChar(i + 1) == '-' @@ -420,12 +430,12 @@ void Paragraph::Pimpl::simpleTeXSpecialChars(Buffer const * buf, os << '-'; } break; - - case '\"': + + case '\"': os << "\\char`\\\"{}"; column += 9; break; - + case '£': if (bparams.inputenc == "default") { os << "\\pounds{}"; @@ -434,24 +444,24 @@ void Paragraph::Pimpl::simpleTeXSpecialChars(Buffer const * buf, os << c; } break; - + case '$': case '&': case '%': case '#': case '{': case '}': case '_': os << '\\' << c; column += 1; break; - + case '~': os << "\\textasciitilde{}"; column += 16; break; - + case '^': os << "\\textasciicircum{}"; column += 17; break; - + case '*': case '[': case ']': // avoid being mistaken for optional arguments os << '{' << c << '}'; @@ -461,13 +471,13 @@ void Paragraph::Pimpl::simpleTeXSpecialChars(Buffer const * buf, case ' ': // Blanks are printed before font switching. // Sure? I am not! (try nice-latex) - // I am sure it's correct. LyX might be smarter - // in the future, but for now, nothing wrong is - // written. (Asger) + // I am sure it's correct. LyX might be smarter + // in the future, but for now, nothing wrong is + // written. (Asger) break; default: - + // I assume this is hack treating typewriter as verbatim if (font.family() == LyXFont::TYPEWRITER_FAMILY) { if (c != '\0') { @@ -475,17 +485,17 @@ void Paragraph::Pimpl::simpleTeXSpecialChars(Buffer const * buf, } break; } - + // 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, font, special_phrases[pnr][0], i)) { + 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; @@ -505,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 { @@ -520,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; } @@ -543,16 +552,16 @@ LyXFont const Paragraph::Pimpl::realizeFont(LyXFont const & font, BufferParams const & bparams) const { LyXFont tmpfont(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 @@ -561,11 +570,10 @@ 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 ); - return tmpfont; + return tmpfont; }