X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fparagraph.C;h=a17825476c65a166f6a23ddba048acc2e5826316;hb=bf6b9d1e189a13789308944d4d60f3ec994627b4;hp=b28a66e4d80bab1f967f0bdcf92a5840a1f4c00c;hpb=d6665cba427b04ae37f42c846398cad518d2be0f;p=lyx.git diff --git a/src/paragraph.C b/src/paragraph.C index b28a66e4d8..a17825476c 100644 --- a/src/paragraph.C +++ b/src/paragraph.C @@ -50,8 +50,8 @@ using std::reverse; int tex_code_break_column = 72; // needs non-zero initialization. set later. // this is a bad idea, but how can LyXParagraph find its buffer to get // parameters? (JMarc) -extern BufferView * current_view; -extern string bibitemWidest(BufferView *); + +extern string bibitemWidest(Buffer const *); // this is a minibuffer static char minibuffer_char; @@ -59,6 +59,8 @@ static LyXFont minibuffer_font; static Inset * minibuffer_inset; +extern BufferView * current_view; + // Initialization of the counter for the paragraph id's, // declared in lyxparagraph.h unsigned int LyXParagraph::paragraph_id = 0; @@ -67,7 +69,6 @@ unsigned int LyXParagraph::paragraph_id = 0; LyXParagraph::LyXParagraph() { text.reserve(500); // is this number too big? - for (int i = 0; i < 10; ++i) setCounter(i , 0); appendix = false; enumdepth = 0; @@ -91,8 +92,8 @@ LyXParagraph::LyXParagraph() LyXParagraph::LyXParagraph(LyXParagraph * par) { text.reserve(500); - par->text.resize(par->text.size()); - + par->fitToSize(); + for (int i = 0; i < 10; ++i) setCounter(i, 0); appendix = false; enumdepth = 0; @@ -242,7 +243,7 @@ void LyXParagraph::writeFile(Buffer const * buf, ostream & os, if (bibkey) bibkey->Write(buf, os); - LyXFont font1(LyXFont::ALL_INHERIT, params.language_info); + LyXFont font1(LyXFont::ALL_INHERIT, params.language); int column = 0; for (size_type i = 0; i < size(); ++i) { @@ -259,7 +260,7 @@ void LyXParagraph::writeFile(Buffer const * buf, ostream & os, font1 = font2; } - value_type c = GetChar(i); + value_type const c = GetChar(i); switch (c) { case META_INSET: { @@ -342,7 +343,7 @@ void LyXParagraph::validate(LaTeXFeatures & features) const features.layout[GetLayout()] = true; // then the fonts - Language const * doc_language = params.language_info; + Language const * doc_language = params.language; for (FontList::const_iterator cit = fontlist.begin(); cit != fontlist.end(); ++cit) { @@ -368,10 +369,10 @@ void LyXParagraph::validate(LaTeXFeatures & features) const } Language const * language = (*cit).font.language(); - if (language != doc_language) { + if (language->babel() != doc_language->babel()) { features.UsedLanguages.insert(language); lyxerr[Debug::LATEX] << "Found language " - << language->lang() << endl; + << language->babel() << endl; } } @@ -402,15 +403,17 @@ void LyXParagraph::validate(LaTeXFeatures & features) const // First few functions needed for cut and paste and paragraph breaking. -void LyXParagraph::CopyIntoMinibuffer(BufferParams const & bparams, +void LyXParagraph::CopyIntoMinibuffer(Buffer const & buffer, LyXParagraph::size_type pos) const { + BufferParams bparams = buffer.params; + minibuffer_char = GetChar(pos); minibuffer_font = GetFontSettings(bparams, pos); minibuffer_inset = 0; if (minibuffer_char == LyXParagraph::META_INSET) { if (GetInset(pos)) { - minibuffer_inset = GetInset(pos)->Clone(); + minibuffer_inset = GetInset(pos)->Clone(buffer); } else { minibuffer_inset = 0; minibuffer_char = ' '; @@ -553,6 +556,7 @@ void LyXParagraph::Erase(LyXParagraph::size_type pos) insetlist.erase(it); } } + text.erase(text.begin() + pos); // Erase entries in the tables. @@ -564,18 +568,18 @@ void LyXParagraph::Erase(LyXParagraph::size_type pos) search_font, matchFT()); if (it != fontlist.end() && (*it).pos == pos && (pos == 0 || - (it != fontlist.begin() && (*(it-1)).pos == pos - 1))) { + (it != fontlist.begin() && (*(it - 1)).pos == pos - 1))) { // If it is a multi-character font // entry, we just make it smaller // (see update below), otherwise we // should delete it. - unsigned int i = it - fontlist.begin(); + unsigned int const i = it - fontlist.begin(); fontlist.erase(fontlist.begin() + i); it = fontlist.begin() + i; if (i > 0 && i < fontlist.size() && - fontlist[i-1].font == fontlist[i].font) { - fontlist.erase(fontlist.begin() + i-1); - it = fontlist.begin() + i-1; + fontlist[i - 1].font == fontlist[i].font) { + fontlist.erase(fontlist.begin() + i - 1); + it = fontlist.begin() + i - 1; } } @@ -605,7 +609,7 @@ void LyXParagraph::Erase(LyXParagraph::size_type pos) void LyXParagraph::InsertChar(LyXParagraph::size_type pos, LyXParagraph::value_type c) { - LyXFont f(LyXFont::ALL_INHERIT); + LyXFont const f(LyXFont::ALL_INHERIT); InsertChar(pos, c, f); } @@ -631,6 +635,7 @@ void LyXParagraph::InsertChar(LyXParagraph::size_type pos, Assert(pos <= size()); #endif text.insert(text.begin() + pos, c); + // Update the font table. FontTable search_font(pos, LyXFont()); for (FontList::iterator it = lower_bound(fontlist.begin(), @@ -654,7 +659,7 @@ void LyXParagraph::InsertChar(LyXParagraph::size_type pos, void LyXParagraph::InsertInset(LyXParagraph::size_type pos, Inset * inset) { - LyXFont f(LyXFont::ALL_INHERIT); + LyXFont const f(LyXFont::ALL_INHERIT); InsertInset(pos, inset, f); } @@ -826,8 +831,7 @@ LyXFont const LyXParagraph::GetFontSettings(BufferParams const & bparams, "position does not exist. " << pos << " (" << static_cast(pos) << ")" << endl; - } - else if (pos > 0) { + } else if (pos > 0) { return GetFontSettings(bparams, pos - 1); } #else @@ -841,6 +845,7 @@ LyXFont const LyXParagraph::GetFontSettings(BufferParams const & bparams, //return LyXFont(LyXFont::ALL_INHERIT); } + // Gets uninstantiated font setting at position 0 LyXFont const LyXParagraph::GetFirstFontSettings() const { @@ -1004,6 +1009,47 @@ LyXParagraph::GetChar(LyXParagraph::size_type pos) const } +LyXParagraph::value_type +LyXParagraph::GetUChar(BufferParams const & bparams, + LyXParagraph::size_type pos) const +{ + value_type c = GetChar(pos); + if (!lyxrc.rtl_support) + return c; + + value_type uc = c; + switch (c) { + case '(': + uc = ')'; + break; + case ')': + uc = '('; + break; + case '[': + uc = ']'; + break; + case ']': + uc = '['; + break; + case '{': + uc = '}'; + break; + case '}': + uc = '{'; + break; + case '<': + uc = '>'; + break; + case '>': + uc = '<'; + break; + } + if (uc != c && GetFontSettings(bparams, pos).isRightToLeft()) + return uc; + else + return c; +} + // return an string of the current word, and the end of the word in lastpos. string const LyXParagraph::GetWord(LyXParagraph::size_type & lastpos) const { @@ -1153,34 +1199,35 @@ void LyXParagraph::SetFont(LyXParagraph::size_type pos, bool end = !notfound && fontlist[i].pos == pos; // Is position pos is the end of a font block? if (begin && end) { // A single char block - if (i+1 < fontlist.size() && - fontlist[i+1].font == font) { + if (i + 1 < fontlist.size() && + fontlist[i + 1].font == font) { // Merge the singleton block with the next block fontlist.erase(fontlist.begin() + i); - if (i > 0 && fontlist[i-1].font == font) + if (i > 0 && fontlist[i - 1].font == font) fontlist.erase(fontlist.begin() + i-1); - } else if (i > 0 && fontlist[i-1].font == font) { + } else if (i > 0 && fontlist[i - 1].font == font) { // Merge the singleton block with the previous block - fontlist[i-1].pos = pos; + fontlist[i - 1].pos = pos; fontlist.erase(fontlist.begin() + i); } else fontlist[i].font = font; } else if (begin) { - if (i > 0 && fontlist[i-1].font == font) - fontlist[i-1].pos = pos; + if (i > 0 && fontlist[i - 1].font == font) + fontlist[i - 1].pos = pos; else fontlist.insert(fontlist.begin() + i, FontTable(pos, font)); } else if (end) { fontlist[i].pos = pos - 1; - if (!(i+1 < fontlist.size() && - fontlist[i+1].font == font)) - fontlist.insert(fontlist.begin() + i+1, + if (!(i + 1 < fontlist.size() && + fontlist[i + 1].font == font)) + fontlist.insert(fontlist.begin() + i + 1, FontTable(pos, font)); } else { // The general case. The block is splitted into 3 blocks fontlist.insert(fontlist.begin() + i, FontTable(pos - 1, fontlist[i].font)); - fontlist.insert(fontlist.begin() + i+1, FontTable(pos, font)); + fontlist.insert(fontlist.begin() + i + 1, + FontTable(pos, font)); } } @@ -1467,11 +1514,13 @@ void LyXParagraph::BreakParagraph(BufferParams const & bparams, if (tmp->InsertFromMinibuffer(j - pos)) ++j; } - tmp->text.resize(tmp->text.size()); + + tmp->fitToSize(); + for (i = pos_end; i >= pos; --i) par->Erase(i - pos_first); - par->text.resize(par->text.size()); + par->fitToSize(); #else size_type pos_end = text.size() - 1; @@ -1610,7 +1659,8 @@ LyXParagraph * LyXParagraph::Clone() const // ale970302 if (bibkey) - result->bibkey = static_cast(bibkey->Clone()); + result->bibkey = static_cast + (bibkey->Clone(*current_view->buffer())); else result->bibkey = 0; @@ -1621,7 +1671,7 @@ LyXParagraph * LyXParagraph::Clone() const result->insetlist = insetlist; for (InsetList::iterator it = result->insetlist.begin(); it != result->insetlist.end(); ++it) - (*it).inset = (*it).inset->Clone(); + (*it).inset = (*it).inset->Clone(*current_view->buffer()); return result; } @@ -1689,11 +1739,13 @@ void LyXParagraph::BreakParagraphConservative(BufferParams const & bparams, if (tmp->InsertFromMinibuffer(j - pos)) ++j; } - tmp->text.resize(tmp->text.size()); + + tmp->fitToSize(); + for (size_type i = pos_end; i >= pos; --i) par->Erase(i - pos_first); - par->text.resize(par->text.size()); + par->fitToSize(); } #else // create a new paragraph @@ -1802,7 +1854,7 @@ int LyXParagraph::GetEndLabel(BufferParams const & bparams) const if (endlabeltype != END_LABEL_NO_LABEL) { LyXParagraph const * last = this; #ifndef NEW_INSETS - if( footnoteflag == NO_FOOTNOTE) + if (footnoteflag == NO_FOOTNOTE) last = LastPhysicalPar(); else if (next->footnoteflag == NO_FOOTNOTE) return endlabeltype; @@ -1959,9 +2011,8 @@ void LyXParagraph::SetOnlyLayout(BufferParams const & bparams, } if ((par->pextra_type == PEXTRA_NONE) && npar && (npar->pextra_type != PEXTRA_NONE)) { - string - p1 = npar->pextra_width, - p2 = npar->pextra_widthp; + string const p1 = npar->pextra_width; + string const p2 = npar->pextra_widthp; npar->SetPExtraType(bparams, npar->pextra_type, p1, p2); } @@ -2020,17 +2071,15 @@ void LyXParagraph::SetLayout(BufferParams const & bparams, #endif } if (ppar && (ppar->pextra_type != PEXTRA_NONE)) { - string - p1 = ppar->pextra_width, - p2 = ppar->pextra_widthp; + string const p1 = ppar->pextra_width; + string const p2 = ppar->pextra_widthp; ppar->SetPExtraType(bparams, ppar->pextra_type, p1, p2); } if ((par->pextra_type == PEXTRA_NONE) && npar && (npar->pextra_type != PEXTRA_NONE)) { - string - p1 = npar->pextra_width, - p2 = npar->pextra_widthp; + string const p1 = npar->pextra_width; + string const p2 = npar->pextra_widthp; npar->SetPExtraType(bparams, npar->pextra_type, p1, p2); } @@ -2059,7 +2108,8 @@ int LyXParagraph::BeginningOfMainBody() const && GetChar(i) != LyXParagraph::META_NEWLINE ) { ++i; - char previous_char = 0, temp = 0; + char previous_char = 0; + char temp = 0; if (i < size() && (previous_char = GetChar(i)) != LyXParagraph::META_NEWLINE) { // Yes, this ^ is supposed to be "= " not "==" @@ -2187,11 +2237,14 @@ int LyXParagraph::GetPositionOfInset(Inset * inset) const return (*cit).pos; } } + if (inset == bibkey) + return 0; + #ifndef NEW_INSETS // Think about footnotes. if (footnoteflag == LyXParagraph::NO_FOOTNOTE && next && next->footnoteflag == LyXParagraph::CLOSED_FOOTNOTE) { - int further = + int const further = NextAfterFootnote()->GetPositionOfInset(inset); if (further != -1) return text.size() + 1 + further; @@ -2261,12 +2314,13 @@ LyXParagraph * LyXParagraph::TeXOnePar(Buffer const * buf, } Language const * language = getParLanguage(bparams); - Language const * doc_language = bparams.language_info; + Language const * doc_language = bparams.language; Language const * previous_language = previous ? previous->getParLanguage(bparams) : doc_language; - if (language != doc_language && language != previous_language) { + if (language->babel() != doc_language->babel() && + language->babel() != previous_language->babel()) { os << subst(lyxrc.language_command_begin, "$$lang", - language->lang()) + language->babel()) << endl; texrow.newline(); } @@ -2311,7 +2365,7 @@ LyXParagraph * LyXParagraph::TeXOnePar(Buffer const * buf, ? GetFontSettings(bparams, size()-1).isRightToLeft() : language->RightToLeft(); - if ( (p = NextAfterFootnote()) != 0 && + if ((p = NextAfterFootnote()) != 0 && p->size() > 0 && p->GetFontSettings(bparams, 0).isRightToLeft() != is_rtl) is_rtl = getParLanguage(bparams)->RightToLeft(); @@ -2354,35 +2408,31 @@ LyXParagraph * LyXParagraph::TeXOnePar(Buffer const * buf, // This is necessary because LaTeX (and LyX on the screen) // calculates the space between the baselines according // to this font. (Matthias) + // + // Is this really needed ? (Dekel) + // We do not need to use to change the font for the last paragraph + // or for a command. LyXFont font = getFont(bparams, Last() - 1); - if (need_par && next) { - if (style.resfont.size() != font.size()) { - os << '\\' - << font.latexSize() - << ' '; - } + bool is_command = textclasslist.Style(bparams.textclass, + GetLayout()).isCommand(); + if (style.resfont.size() != font.size() && next && !is_command) { + if (!need_par) + os << "{"; + os << "\\" << font.latexSize() << " \\par}"; + } else if (need_par) { os << "\\par}"; - } else if (textclasslist.Style(bparams.textclass, - GetLayout()).isCommand()) { - if (style.resfont.size() != font.size()) { - os << '\\' - << font.latexSize() - << ' '; - } - os << '}'; - } else if ((style.resfont.size() != font.size()) && next){ - os << "{\\" << font.latexSize() << " \\par}"; - } + } else if (is_command) + os << "}"; - if (language != doc_language && + if (language->babel() != doc_language->babel() && (!par #ifndef NEW_INSETS || (footnoteflag != NO_FOOTNOTE && par->footnoteflag != footnoteflag) #endif - || par->getParLanguage(bparams) != language)) { + || par->getParLanguage(bparams)->babel() != language->babel())) { os << endl << subst(lyxrc.language_command_end, "$$lang", - doc_language->lang()); + doc_language->babel()); } switch (style.latextype) { @@ -2403,17 +2453,11 @@ LyXParagraph * LyXParagraph::TeXOnePar(Buffer const * buf, break; default: // we don't need it for the last paragraph!!! - if (next -#ifndef NEW_INSETS - && !( footnoteflag != LyXParagraph::NO_FOOTNOTE - && footnotekind != LyXParagraph::FOOTNOTE - && footnotekind != LyXParagraph::MARGIN) -#endif - ) { - // don't insert this if we would be adding it - // before or after a table in a float. This - // little trick is needed in order to allow - // use of tables in \subfigures or \subtables. + // or for tables in floats + // -- effectively creates a \par where there isn't one which + // breaks a \subfigure or \subtable. + if (next) { +// && footnoteflag == LyXParagraph::NO_FOOTNOTE) { os << '\n'; texrow.newline(); } @@ -2539,9 +2583,11 @@ bool LyXParagraph::SimpleTeXOnePar(Buffer const * buf, if (style.isCommand()) { os << '{'; ++column; - } else if (align != LYX_ALIGN_LAYOUT) { - os << "{\\par"; - column += 4; + } else if (align != LYX_ALIGN_LAYOUT && next) { + // We do not need \par here (Dekel) + // os << "{\\par"; + os << "{"; + ++column; return_value = true; } @@ -2556,7 +2602,9 @@ bool LyXParagraph::SimpleTeXOnePar(Buffer const * buf, case LYX_ALIGN_SPECIAL: break; case LYX_ALIGN_LEFT: - if (getParLanguage(bparams)->lang() != "hebrew") { + if (moving_arg) + os << "\\protect"; + if (getParLanguage(bparams)->babel() != "hebrew") { os << "\\raggedright "; column+= 13; } else { @@ -2565,7 +2613,9 @@ bool LyXParagraph::SimpleTeXOnePar(Buffer const * buf, } break; case LYX_ALIGN_RIGHT: - if (getParLanguage(bparams)->lang() != "hebrew") { + if (moving_arg) + os << "\\protect"; + if (getParLanguage(bparams)->babel() != "hebrew") { os << "\\raggedleft "; column+= 12; } else { @@ -2574,6 +2624,8 @@ bool LyXParagraph::SimpleTeXOnePar(Buffer const * buf, } break; case LYX_ALIGN_CENTER: + if (moving_arg) + os << "\\protect"; os << "\\centering "; column+= 11; break; @@ -2817,7 +2869,7 @@ void LyXParagraph::SimpleTeXSpecialChars(Buffer const * buf, Inset * inset = GetInset(i); if (inset) { bool close = false; - int len = os.tellp(); + int const len = os.tellp(); if ((inset->LyxCode() == Inset::GRAPHICS_CODE || inset->LyxCode() == Inset::MATH_CODE || inset->LyxCode() == Inset::URL_CODE) @@ -2928,7 +2980,7 @@ void LyXParagraph::SimpleTeXSpecialChars(Buffer const * buf, } // Otherwise, we use what LaTeX // provides us. - switch(c) { + switch (c) { case '<': os << "\\textless{}"; column += 10; @@ -3175,7 +3227,7 @@ LyXParagraph * LyXParagraph::TeXEnvironment(Buffer const * buf, texrow.newline(); } os << "\\begin{minipage}"; - switch(pextra_alignment) { + switch (pextra_alignment) { case MINIPAGE_ALIGN_TOP: os << "[t]"; break; @@ -3237,7 +3289,7 @@ LyXParagraph * LyXParagraph::TeXEnvironment(Buffer const * buf, } else if (style.labeltype == LABEL_BIBLIO) { // ale970405 os << "\\begin{" << style.latexname() << "}{" - << bibitemWidest(current_view) + << bibitemWidest(buf) << "}\n"; } else if (style.latextype == LATEX_ITEM_ENVIRONMENT) { #ifdef FANCY_FOOTNOTE_CODE @@ -3314,7 +3366,7 @@ LyXParagraph * LyXParagraph::TeXEnvironment(Buffer const * buf, texrow.newline(); } os << "\\begin{minipage}"; - switch(par->pextra_alignment) { + switch (par->pextra_alignment) { case MINIPAGE_ALIGN_TOP: os << "[t]"; break; @@ -3625,9 +3677,6 @@ LyXParagraph * LyXParagraph::TeXFootnote(Buffer const * buf, "Footnote in a Footnote -- not supported" << endl; } -//#ifndef HAVE_OSTREAM -// delete [] dummy.str(); -//#endif } switch (footnotekind) { @@ -3847,14 +3896,14 @@ bool LyXParagraph::IsKomma(size_type pos) const /// Used by the spellchecker bool LyXParagraph::IsLetter(LyXParagraph::size_type pos) const { - value_type c = GetChar(pos); + value_type const c = GetChar(pos); if (IsLetterChar(c)) return true; // '\0' is not a letter, allthough every string contains "" (below) - if( c == '\0') + if (c == '\0') return false; // We want to pass the ' and escape chars to ispell - string extra = lyxrc.isp_esc_chars + '\''; + string const extra = lyxrc.isp_esc_chars + '\''; char ch[2] = { c, 0 }; return contains(extra, ch); } @@ -3874,16 +3923,12 @@ LyXParagraph::getParLanguage(BufferParams const & bparams) const return FirstPhysicalPar()->getParLanguage(bparams); else #endif - if (size() > 0) { - Language const * lang = GetFirstFontSettings().language(); - - if (lang->lang() == "default") - return bparams.language_info; - return lang; - } else if (previous) + if (size() > 0) + return GetFirstFontSettings().language(); + else if (previous) return previous->getParLanguage(bparams); - - return bparams.language_info; + else + return bparams.language; } @@ -3897,7 +3942,7 @@ bool LyXParagraph::isRightToLeftPar(BufferParams const & bparams) const void LyXParagraph::ChangeLanguage(BufferParams const & bparams, Language const * from, Language const * to) { - for(size_type i = 0; i < size(); ++i) { + for (size_type i = 0; i < size(); ++i) { LyXFont font = GetFontSettings(bparams, i); if (font.language() == from) { font.setLanguage(to); @@ -3909,7 +3954,7 @@ void LyXParagraph::ChangeLanguage(BufferParams const & bparams, bool LyXParagraph::isMultiLingual(BufferParams const & bparams) { - Language const * doc_language = bparams.language_info; + Language const * doc_language = bparams.language; for (FontList::const_iterator cit = fontlist.begin(); cit != fontlist.end(); ++cit) if ((*cit).font.language() != doc_language) @@ -3930,7 +3975,7 @@ string const LyXParagraph::String(Buffer const * buffer, bool label) if (label && !labelstring.empty()) #endif s += labelstring + ' '; - string::size_type len = s.size(); + string::size_type const len = s.size(); for (LyXParagraph::size_type i = 0; i < size(); ++i) { value_type c = GetChar(i); @@ -3940,7 +3985,7 @@ string const LyXParagraph::String(Buffer const * buffer, bool label) GetInset(i)->LyxCode() == Inset::MATH_CODE) { std::ostringstream ost; GetInset(i)->Ascii(buffer, ost); - s += subst(ost.str(),'\n',' '); + s += subst(ost.str().c_str(),'\n',' '); } } @@ -3974,13 +4019,13 @@ string const LyXParagraph::String(Buffer const * buffer, s += labelstring + ' '; for (LyXParagraph::size_type i = beg; i < end; ++i) { - value_type c = GetChar(i); + value_type c = GetUChar(buffer->params, i); if (IsPrintable(c)) s += c; else if (c == META_INSET) { std::ostringstream ost; GetInset(i)->Ascii(buffer, ost); - s += ost.str(); + s += ost.str().c_str(); } } @@ -4027,3 +4072,16 @@ void LyXParagraph::resizeInsetsLyXText(BufferView * bv) } } } + + +void LyXParagraph::fitToSize() +{ + TextContainer tmp(text.begin(), text.end()); + text.swap(tmp); +} + + +void LyXParagraph::setContentsFromPar(LyXParagraph * par) +{ + text = par->text; +}