X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FParagraph.cpp;h=cf09a491b1e17d01a9aba6ca27fa1dfe8c31e707;hb=4ba4d701f798488c098ecbc740c3020ed514cd96;hp=e0ae3228810fda7eaa05bbe0ea808133f9a10535;hpb=4ce743a0a77d85d5e1722a3f2854ce163e40b353;p=lyx.git diff --git a/src/Paragraph.cpp b/src/Paragraph.cpp index e0ae322881..cf09a491b1 100644 --- a/src/Paragraph.cpp +++ b/src/Paragraph.cpp @@ -176,21 +176,21 @@ 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, @@ -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) @@ -737,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; } @@ -759,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) { @@ -1204,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); @@ -1212,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); @@ -1237,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); @@ -1765,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; @@ -1829,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; @@ -1982,7 +1989,7 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf, } if (!asdefault) - column += startTeXParParams(bparams, os, + column += startTeXParParams(bparams, os, texrow, runparams.moving_arg); } @@ -2009,7 +2016,7 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf, } ++column; - + value_type const c = getChar(i); // Fully instantiated font @@ -2047,8 +2054,8 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf, i != body_pos - 1) { column += font.latexWriteStartChanges(os, bparams, - runparams, basefont, - last_font); + runparams, basefont, + last_font); running_font = font; open_font = true; } @@ -2114,7 +2121,7 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf, } if (!asdefault) { - column += endTeXParParams(bparams, os, texrow, + column += endTeXParParams(bparams, os, texrow, runparams.moving_arg); } @@ -2220,7 +2227,7 @@ pos_type Paragraph::getFirstWord(Buffer const & buf, odocstream & os, OutputPara if (c == ' ') break; os << sgml::escapeChar(c); - } + } } return i; } @@ -2280,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; } @@ -2394,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) @@ -2592,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