X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FParagraph.cpp;h=cf09a491b1e17d01a9aba6ca27fa1dfe8c31e707;hb=4ba4d701f798488c098ecbc740c3020ed514cd96;hp=f08f55874a3a6cea6f28b2e50549858ab64fe9c2;hpb=0bf9ac02a8988b2747c15520780cbf4343dd6a45;p=lyx.git diff --git a/src/Paragraph.cpp b/src/Paragraph.cpp index f08f55874a..cf09a491b1 100644 --- a/src/Paragraph.cpp +++ b/src/Paragraph.cpp @@ -176,25 +176,25 @@ public: /// Output the surrogate pair formed by \p c and \p next to \p os. /// \return the number of characters written. int latexSurrogatePair(odocstream & os, value_type c, value_type next, - Encoding const &); + Encoding const &); /// Output a space in appropriate formatting (or a surrogate pair /// if the next character is a combining character). /// \return whether a surrogate pair was output. bool simpleTeXBlanks(Encoding const &, - odocstream &, TexRow & texrow, + odocstream &, TexRow & texrow, pos_type & i, unsigned int & column, Font const & font, Layout const & style); /// void simpleTeXSpecialChars(Buffer const &, BufferParams const &, - odocstream &, - TexRow & texrow, OutputParams const &, - Font & running_font, + odocstream &, + TexRow & texrow, OutputParams const &, + Font & running_font, Font & basefont, Font const & outerfont, bool & open_font, - Change::Type & running_change, + Change & running_change, Layout const & style, pos_type & i, unsigned int & column, value_type const c); @@ -445,7 +445,7 @@ void Paragraph::Pimpl::insertChar(pos_type pos, value_type c, Change const & cha // Update the font table. FontTable search_font(pos, Font()); - for (FontList::iterator it + for (FontList::iterator it = lower_bound(fontlist.begin(), fontlist.end(), search_font, matchFT()); it != fontlist.end(); ++it) { @@ -458,7 +458,7 @@ void Paragraph::Pimpl::insertChar(pos_type pos, value_type c, Change const & cha void Paragraph::Pimpl::insertInset(pos_type pos, Inset * inset, - Change const & change) + Change const & change) { BOOST_ASSERT(inset); BOOST_ASSERT(pos >= 0 && pos <= size()); @@ -480,7 +480,7 @@ bool Paragraph::Pimpl::eraseChar(pos_type pos, bool trackChanges) if (trackChanges) { Change change = changes_.lookup(pos); - // set the character to DELETED if + // set the character to DELETED if // a) it was previously unchanged or // b) it was inserted by a co-author @@ -580,8 +580,8 @@ int Paragraph::Pimpl::latexSurrogatePair(odocstream & os, value_type c, bool Paragraph::Pimpl::simpleTeXBlanks(Encoding const & encoding, - odocstream & os, TexRow & texrow, - pos_type & i, + odocstream & os, TexRow & texrow, + pos_type & i, unsigned int & column, Font const & font, Layout const & style) @@ -665,7 +665,7 @@ void Paragraph::Pimpl::simpleTeXSpecialChars(Buffer const & buf, Font & basefont, Font const & outerfont, bool & open_font, - Change::Type & running_change, + Change & running_change, Layout const & style, pos_type & i, unsigned int & column, @@ -702,7 +702,8 @@ void Paragraph::Pimpl::simpleTeXSpecialChars(Buffer const & buf, } else { if (open_font) { column += running_font.latexWriteEndChanges( - os, basefont, basefont); + os, bparams, runparams, + basefont, basefont); open_font = false; } @@ -723,18 +724,10 @@ void Paragraph::Pimpl::simpleTeXSpecialChars(Buffer const & buf, break; } - // output change tracking marks only if desired, - // if dvipost is installed, - // and with dvi/ps (other formats don't work) - LaTeXFeatures features(buf, bparams, runparams); - bool const output = bparams.outputChanges - && runparams.flavor == OutputParams::LATEX - && features.isAvailable("dvipost"); - if (inset->canTrackChanges()) { - column += Changes::latexMarkChange(os, running_change, - Change::UNCHANGED, output); - running_change = Change::UNCHANGED; + column += Changes::latexMarkChange(os, bparams, running_change, + Change(Change::UNCHANGED)); + running_change = Change(Change::UNCHANGED); } bool close = false; @@ -744,7 +737,10 @@ void Paragraph::Pimpl::simpleTeXSpecialChars(Buffer const & buf, || inset->lyxCode() == Inset::MATH_CODE || inset->lyxCode() == Inset::URL_CODE) && running_font.isRightToLeft()) { - os << "\\L{"; + if (running_font.language()->lang() == "farsi") + os << "\\beginL{}"; + else + os << "\\L{"; close = true; } @@ -757,7 +753,8 @@ void Paragraph::Pimpl::simpleTeXSpecialChars(Buffer const & buf, // some insets cannot be inside a font change command if (open_font && inset->noFontChange()) { column += running_font.latexWriteEndChanges( - os, basefont, basefont); + os, bparams, runparams, + basefont, basefont); open_font = false; basefont = owner_->getLayoutFont(bparams, outerfont); running_font = basefont; @@ -765,8 +762,12 @@ void Paragraph::Pimpl::simpleTeXSpecialChars(Buffer const & buf, int tmp = inset->latex(buf, os, runparams); - if (close) - os << '}'; + if (close) { + if (running_font.language()->lang() == "farsi") + os << "\\endL{}"; + else + os << '}'; + } if (tmp) { for (int j = 0; j < tmp; ++j) { @@ -991,7 +992,7 @@ void Paragraph::Pimpl::validate(LaTeXFeatures & features, { features.useLanguage(language); LYXERR(Debug::LATEX) << "Found language " - << language->babel() << endl; + << language->lang() << endl; } } @@ -1210,7 +1211,7 @@ int Paragraph::eraseChars(pos_type start, pos_type end, bool trackChanges) void Paragraph::insert(pos_type start, docstring const & str, - Font const & font, Change const & change) + Font const & font, Change const & change) { for (size_t i = 0, n = str.size(); i != n ; ++i) insertChar(start + i, str[i], font, change); @@ -1218,24 +1219,24 @@ void Paragraph::insert(pos_type start, docstring const & str, void Paragraph::insertChar(pos_type pos, Paragraph::value_type c, - bool trackChanges) + bool trackChanges) { pimpl_->insertChar(pos, c, Change(trackChanges ? - Change::INSERTED : Change::UNCHANGED)); + Change::INSERTED : Change::UNCHANGED)); } void Paragraph::insertChar(pos_type pos, Paragraph::value_type c, - Font const & font, bool trackChanges) + Font const & font, bool trackChanges) { pimpl_->insertChar(pos, c, Change(trackChanges ? - Change::INSERTED : Change::UNCHANGED)); + Change::INSERTED : Change::UNCHANGED)); setFont(pos, font); } void Paragraph::insertChar(pos_type pos, Paragraph::value_type c, - Font const & font, Change const & change) + Font const & font, Change const & change) { pimpl_->insertChar(pos, c, change); setFont(pos, font); @@ -1243,14 +1244,14 @@ void Paragraph::insertChar(pos_type pos, Paragraph::value_type c, void Paragraph::insertInset(pos_type pos, Inset * inset, - Change const & change) + Change const & change) { pimpl_->insertInset(pos, inset, change); } void Paragraph::insertInset(pos_type pos, Inset * inset, - Font const & font, Change const & change) + Font const & font, Change const & change) { pimpl_->insertInset(pos, inset, change); setFont(pos, font); @@ -1326,7 +1327,7 @@ Font const Paragraph::getFirstFontSettings(BufferParams const & bparams) const // Gets the fully instantiated font at a given position in a paragraph -// This is basically the same function as LyXText::GetFont() in text2.cpp. +// This is basically the same function as Text::GetFont() in text2.cpp. // The difference is that this one is used for generating the LaTeX file, // and thus cosmetic "improvements" are disallowed: This has to deliver // the true picture of the buffer. (Asger) @@ -1611,7 +1612,7 @@ docstring const Paragraph::translateIfPossible(docstring const & s, docstring Paragraph::expandLabel(Layout_ptr const & layout, BufferParams const & bparams, bool process_appendix) const { - LyXTextClass const & tclass = bparams.getLyXTextClass(); + TextClass const & tclass = bparams.getTextClass(); docstring fmt; if (process_appendix && params().appendix()) @@ -1771,7 +1772,7 @@ void adjust_row_column(string const & str, TexRow & texrow, int & column) // This could go to ParagraphParameters if we want to int Paragraph::startTeXParParams(BufferParams const & bparams, - odocstream & os, TexRow & texrow, + odocstream & os, TexRow & texrow, bool moving_arg) const { int column = 0; @@ -1835,8 +1836,8 @@ int Paragraph::startTeXParParams(BufferParams const & bparams, // This could go to ParagraphParameters if we want to -int Paragraph::endTeXParParams(BufferParams const & bparams, - odocstream & os, TexRow & texrow, +int Paragraph::endTeXParParams(BufferParams const & bparams, + odocstream & os, TexRow & texrow, bool moving_arg) const { int column = 0; @@ -1915,7 +1916,7 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf, bool asdefault = forceDefaultParagraphs(); if (asdefault) { - style = bparams.getLyXTextClass().defaultLayout(); + style = bparams.getTextClass().defaultLayout(); } else { style = layout(); } @@ -1928,13 +1929,6 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf, // of the body. Font basefont; - // output change tracking marks only if desired, - // if dvipost is installed, - // and with dvi/ps (other formats don't work) - bool const output = bparams.outputChanges - && runparams.flavor == OutputParams::LATEX - && LaTeXFeatures::isAvailable("dvipost"); - // Maybe we have to create a optional argument. pos_type body_pos = beginOfBody(); unsigned int column = 0; @@ -1954,7 +1948,7 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf, // Do we have an open font change? bool open_font = false; - Change::Type runningChangeType = Change::UNCHANGED; + Change runningChange = Change(Change::UNCHANGED); texrow.start(id(), 0); @@ -1975,15 +1969,16 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf, if (body_pos > 0) { if (open_font) { column += running_font.latexWriteEndChanges( - os, basefont, basefont); + os, bparams, runparams, + basefont, basefont); open_font = false; } basefont = getLayoutFont(bparams, outerfont); running_font = basefont; - column += Changes::latexMarkChange(os, - runningChangeType, Change::UNCHANGED, output); - runningChangeType = Change::UNCHANGED; + column += Changes::latexMarkChange(os, bparams, + runningChange, Change(Change::UNCHANGED)); + runningChange = Change(Change::UNCHANGED); os << "}] "; column +=3; @@ -1994,25 +1989,33 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf, } if (!asdefault) - column += startTeXParParams(bparams, os, + column += startTeXParParams(bparams, os, texrow, runparams.moving_arg); } - Change::Type changeType = pimpl_->lookupChange(i).type; + Change const & change = pimpl_->lookupChange(i); + + if (bparams.outputChanges && runningChange != change) { + if (open_font) { + column += running_font.latexWriteEndChanges( + os, bparams, runparams, basefont, basefont); + open_font = false; + } + basefont = getLayoutFont(bparams, outerfont); + running_font = basefont; + + column += Changes::latexMarkChange(os, bparams, runningChange, change); + runningChange = change; + } // do not output text which is marked deleted // if change tracking output is disabled - if (!output && changeType == Change::DELETED) { - runningChangeType = changeType; + if (!bparams.outputChanges && change.type == Change::DELETED) { continue; } ++column; - - column += Changes::latexMarkChange(os, runningChangeType, - changeType, output); - runningChangeType = changeType; value_type const c = getChar(i); @@ -2027,19 +2030,22 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf, font.language() != running_font.language())) { column += running_font.latexWriteEndChanges( - os, basefont, + os, bparams, runparams, basefont, (i == body_pos-1) ? basefont : font); running_font = basefont; open_font = false; } // Switch file encoding if necessary - int const count = switchEncoding(os, bparams, - runparams.moving_arg, *(runparams.encoding), - *(font.language()->encoding())); - if (count > 0) { - column += count; - runparams.encoding = font.language()->encoding(); + if (runparams.encoding->package() == Encoding::inputenc && + font.language()->encoding()->package() == Encoding::inputenc) { + int const count = switchEncoding(os, bparams, + runparams.moving_arg, *(runparams.encoding), + *(font.language()->encoding())); + if (count > 0) { + column += count; + runparams.encoding = font.language()->encoding(); + } } // Do we need to change font? @@ -2047,8 +2053,9 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf, font.language() != running_font.language()) && i != body_pos - 1) { - column += font.latexWriteStartChanges(os, basefont, - last_font); + column += font.latexWriteStartChanges(os, bparams, + runparams, basefont, + last_font); running_font = font; open_font = true; } @@ -2079,7 +2086,7 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf, pimpl_->simpleTeXSpecialChars(buf, bparams, os, texrow, rp, running_font, basefont, outerfont, open_font, - runningChangeType, *style, i, column, c); + runningChange, *style, i, column, c); } // If we have an open font definition, we have to close it @@ -2087,11 +2094,12 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf, #ifdef FIXED_LANGUAGE_END_DETECTION if (next_) { running_font - .latexWriteEndChanges(os, basefont, + .latexWriteEndChanges(os, bparams, runparams, + basefont, next_->getFont(bparams, 0, outerfont)); } else { - running_font.latexWriteEndChanges(os, basefont, - basefont); + running_font.latexWriteEndChanges(os, bparams, + runparams, basefont, basefont); } #else #ifdef WITH_WARNINGS @@ -2099,12 +2107,12 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf, //#warning there as we start another \selectlanguage with the next paragraph if //#warning we are in need of this. This should be fixed sometime (Jug) #endif - running_font.latexWriteEndChanges(os, basefont, basefont); + running_font.latexWriteEndChanges(os, bparams, runparams, + basefont, basefont); #endif } - column += Changes::latexMarkChange(os, - runningChangeType, Change::UNCHANGED, output); + column += Changes::latexMarkChange(os, bparams, runningChange, Change(Change::UNCHANGED)); // Needed if there is an optional argument but no contents. if (body_pos > 0 && body_pos == size()) { @@ -2113,7 +2121,7 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf, } if (!asdefault) { - column += endTeXParParams(bparams, os, texrow, + column += endTeXParParams(bparams, os, texrow, runparams.moving_arg); } @@ -2175,6 +2183,7 @@ bool Paragraph::emptyTag() const lyx_code != Inset::INCLUDE_CODE && lyx_code != Inset::GRAPHICS_CODE && lyx_code != Inset::ERT_CODE && + lyx_code != Inset::LISTINGS_CODE && lyx_code != Inset::FLOAT_CODE && lyx_code != Inset::TABULAR_CODE) { return false; @@ -2218,7 +2227,7 @@ pos_type Paragraph::getFirstWord(Buffer const & buf, odocstream & os, OutputPara if (c == ' ') break; os << sgml::escapeChar(c); - } + } } return i; } @@ -2278,9 +2287,9 @@ void Paragraph::simpleDocBookOnePar(Buffer const & buf, value_type c = getChar(i); if (style->pass_thru) - os.put(c); + os.put(c); else - os << sgml::escapeChar(c); + os << sgml::escapeChar(c); } font_old = font; } @@ -2340,7 +2349,8 @@ bool Paragraph::isRightToLeftPar(BufferParams const & bparams) const { return lyxrc.rtl_support && getParLanguage(bparams)->rightToLeft() - && ownerCode() != Inset::ERT_CODE; + && ownerCode() != Inset::ERT_CODE + && ownerCode() != Inset::LISTINGS_CODE; } @@ -2391,7 +2401,7 @@ docstring const Paragraph::asString(Buffer const & buffer, os << params().labelString() << ' '; for (pos_type i = beg; i < end; ++i) { - value_type const c = getUChar(buffer.params(), i); + value_type const c = getChar(i); if (isPrintable(c)) os.put(c); else if (c == META_INSET) @@ -2501,7 +2511,7 @@ bool Paragraph::isFreeSpacing() const // for now we just need this, later should we need this in some // other way we can always add a function to Inset too. - return ownerCode() == Inset::ERT_CODE; + return ownerCode() == Inset::ERT_CODE || ownerCode() == Inset::LISTINGS_CODE; } @@ -2509,7 +2519,7 @@ bool Paragraph::allowEmpty() const { if (layout()->keepempty) return true; - return ownerCode() == Inset::ERT_CODE; + return ownerCode() == Inset::ERT_CODE || ownerCode() == Inset::LISTINGS_CODE; } @@ -2589,25 +2599,70 @@ bool Paragraph::hfillExpansion(Row const & row, pos_type pos) const } -bool Paragraph::checkBiblio(bool track_changes) +int Paragraph::checkBiblio(bool track_changes) { + //FIXME From JS: + //This is getting more and more a mess. ...We really should clean + //up this bibitem issue for 1.6. See also bug 2743. + // Add bibitem insets if necessary if (layout()->labeltype != LABEL_BIBLIO) - return false; + return 0; bool hasbibitem = !insetlist.empty() // Insist on it being in pos 0 && getChar(0) == Paragraph::META_INSET && insetlist.begin()->inset->lyxCode() == Inset::BIBITEM_CODE; - if (hasbibitem) - return false; + docstring oldkey; + docstring oldlabel; + + // remove a bibitem in pos != 0 + // restore it later in pos 0 if necessary + // (e.g. if a user inserts contents _before_ the item) + // we're assuming there's only one of these, which there + // should be. + int erasedInsetPosition = -1; + InsetList::iterator it = insetlist.begin(); + InsetList::iterator end = insetlist.end(); + for (; it != end; ++it) + if (it->inset->lyxCode() == Inset::BIBITEM_CODE + && it->pos > 0) { + InsetBibitem * olditem = static_cast(it->inset); + oldkey = olditem->getParam("key"); + oldlabel = olditem->getParam("label"); + erasedInsetPosition = it->pos; + eraseChar(erasedInsetPosition, track_changes); + break; + } + + //There was an InsetBibitem at the beginning, and we didn't + //have to erase one. + if (hasbibitem && erasedInsetPosition < 0) + return 0; + //There was an InsetBibitem at the beginning and we did have to + //erase one. So we give its properties to the beginning inset. + if (hasbibitem) { + InsetBibitem * inset = + static_cast(insetlist.begin()->inset); + if (!oldkey.empty()) + inset->setParam("key", oldkey); + inset->setParam("label", oldlabel); + return -erasedInsetPosition; + } + + //There was no inset at the beginning, so we need to create one with + //the key and label of the one we erased. InsetBibitem * inset(new InsetBibitem(InsetCommandParams("bibitem"))); + // restore values of previously deleted item in this par. + if (!oldkey.empty()) + inset->setParam("key", oldkey); + inset->setParam("label", oldlabel); insertInset(0, static_cast(inset), - Change(track_changes ? Change::INSERTED : Change::UNCHANGED)); + Change(track_changes ? Change::INSERTED : Change::UNCHANGED)); - return true; + return 1; } } // namespace lyx