X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FParagraph.cpp;h=e26f70f4bce4ca04754af67565dd6263acd09e30;hb=3f7d2a66f522a45583e0a8b0ba734bb71f0ddde0;hp=08fb7c527d8b8cbb2ce73be02e740723bbf3fcc2;hpb=1669c17c0fdc20ca12d0d2d30bad364b17a31e3d;p=lyx.git diff --git a/src/Paragraph.cpp b/src/Paragraph.cpp index 08fb7c527d..e26f70f4bc 100644 --- a/src/Paragraph.cpp +++ b/src/Paragraph.cpp @@ -19,6 +19,7 @@ #include "Paragraph.h" +#include "LayoutFile.h" #include "Buffer.h" #include "BufferParams.h" #include "Changes.h" @@ -78,7 +79,7 @@ class Paragraph::Private { public: /// - Private(Paragraph * owner); + Private(Paragraph * owner, Layout const & layout); /// "Copy constructor" Private(Private const &, Paragraph * owner); @@ -115,7 +116,7 @@ public: bool) const; /// - void latexInset(Buffer const &, BufferParams const &, + void latexInset(BufferParams const &, odocstream &, TexRow & texrow, OutputParams &, Font & running_font, @@ -189,9 +190,6 @@ public: /// InsetList insetlist_; - /// - LayoutPtr layout_; - /// end of label pos_type begin_of_body_; @@ -202,6 +200,8 @@ public: typedef std::set Words; /// Words words_; + /// + Layout const * layout_; }; @@ -228,8 +228,8 @@ size_t const phrases_nr = sizeof(special_phrases)/sizeof(special_phrase); } // namespace anon -Paragraph::Private::Private(Paragraph * owner) - : owner_(owner), inset_owner_(0), begin_of_body_(0) +Paragraph::Private::Private(Paragraph * owner, Layout const & layout) + : owner_(owner), inset_owner_(0), begin_of_body_(0), layout_(&layout) { id_ = paragraph_id++; text_.reserve(100); @@ -239,7 +239,8 @@ Paragraph::Private::Private(Paragraph * owner) Paragraph::Private::Private(Private const & p, Paragraph * owner) : owner_(owner), inset_owner_(p.inset_owner_), fontlist_(p.fontlist_), params_(p.params_), changes_(p.changes_), insetlist_(p.insetlist_), - layout_(p.layout_), begin_of_body_(p.begin_of_body_), text_(p.text_) + begin_of_body_(p.begin_of_body_), text_(p.text_), words_(p.words_), + layout_(p.layout_) { id_ = paragraph_id++; } @@ -631,7 +632,7 @@ bool Paragraph::Private::isTextAt(string const & str, pos_type pos) const } -void Paragraph::Private::latexInset(Buffer const & buf, +void Paragraph::Private::latexInset( BufferParams const & bparams, odocstream & os, TexRow & texrow, @@ -649,7 +650,7 @@ void Paragraph::Private::latexInset(Buffer const & buf, BOOST_ASSERT(inset); if (style.pass_thru) { - inset->plaintext(buf, os, runparams); + inset->plaintext(os, runparams); return; } @@ -742,7 +743,7 @@ void Paragraph::Private::latexInset(Buffer const & buf, } } - int tmp = inset->latex(buf, os, runparams); + int tmp = inset->latex(os, runparams); if (close) { if (running_font.language()->lang() == "farsi") @@ -1033,8 +1034,12 @@ void Paragraph::Private::validate(LaTeXFeatures & features, // ///////////////////////////////////////////////////////////////////// -Paragraph::Paragraph() - : d(new Paragraph::Private(this)) +namespace { + Layout const emptyParagraphLayout; +} + +Paragraph::Paragraph() + : d(new Paragraph::Private(this, emptyParagraphLayout)) { itemdepth = 0; d->params_.clear(); @@ -1045,6 +1050,7 @@ Paragraph::Paragraph(Paragraph const & par) : itemdepth(par.itemdepth), d(new Paragraph::Private(*par.d, this)) { + registerWords(); } @@ -1054,8 +1060,10 @@ Paragraph & Paragraph::operator=(Paragraph const & par) if (&par != this) { itemdepth = par.itemdepth; + deregisterWords(); delete d; d = new Private(*par.d, this); + registerWords(); } return *this; } @@ -1068,9 +1076,8 @@ Paragraph::~Paragraph() } -void Paragraph::write(Buffer const & buf, ostream & os, - BufferParams const & bparams, - depth_type & dth) const +void Paragraph::write(ostream & os, BufferParams const & bparams, + depth_type & dth) const { // The beginning or end of a deeper (i.e. nested) area? if (dth != d->params_.depth()) { @@ -1122,12 +1129,12 @@ void Paragraph::write(Buffer const & buf, ostream & os, // international char, let it write // code directly so it's shorter in // the file - inset->write(buf, os); + inset->write(os); } else { if (i) os << '\n'; os << "\\begin_inset "; - inset->write(buf, os); + inset->write(os); os << "\n\\end_inset\n\n"; column = 0; } @@ -1452,7 +1459,8 @@ bool Paragraph::stripLeadingSpaces(bool trackChanges) bool Paragraph::hasSameLayout(Paragraph const & par) const { - return par.d->layout_ == d->layout_ && d->params_.sameLayout(par.d->params_); + return par.d->layout_ == d->layout_ + && d->params_.sameLayout(par.d->params_); } @@ -1516,21 +1524,21 @@ docstring const Paragraph::translateIfPossible(docstring const & s, } -docstring Paragraph::expandLabel(LayoutPtr const & layout, +docstring Paragraph::expandLabel(Layout const & layout, BufferParams const & bparams, bool process_appendix) const { - TextClass const & tclass = bparams.textClass(); + DocumentClass const & tclass = bparams.documentClass(); docstring fmt; if (process_appendix && d->params_.appendix()) - fmt = translateIfPossible(layout->labelstring_appendix(), + fmt = translateIfPossible(layout.labelstring_appendix(), bparams); else - fmt = translateIfPossible(layout->labelstring(), bparams); + fmt = translateIfPossible(layout.labelstring(), bparams); - if (fmt.empty() && layout->labeltype == LABEL_COUNTER - && !layout->counter.empty()) - fmt = "\\the" + layout->counter; + if (fmt.empty() && layout.labeltype == LABEL_COUNTER + && !layout.counter.empty()) + fmt = "\\the" + layout.counter; // handle 'inherited level parts' in 'fmt', // i.e. the stuff between '@' in '@Section@.\arabic{subsection}' @@ -1552,9 +1560,9 @@ docstring Paragraph::expandLabel(LayoutPtr const & layout, } -void Paragraph::applyLayout(LayoutPtr const & new_layout) +void Paragraph::applyLayout(Layout const & new_layout) { - d->layout_ = new_layout; + d->layout_ = &new_layout; LyXAlignment const oldAlign = d->params_.align(); if (!(oldAlign & d->layout_->alignpossible)) { @@ -1805,8 +1813,7 @@ int Paragraph::Private::endTeXParParams(BufferParams const & bparams, // This one spits out the text of the paragraph -bool Paragraph::latex(Buffer const & buf, - BufferParams const & bparams, +bool Paragraph::latex(BufferParams const & bparams, Font const & outerfont, odocstream & os, TexRow & texrow, OutputParams const & runparams) const @@ -1815,19 +1822,11 @@ bool Paragraph::latex(Buffer const & buf, bool return_value = false; - LayoutPtr style; - - // well we have to check if we are in an inset with unlimited - // length (all in one row) if that is true then we don't allow - // any special options in the paragraph and also we don't allow - // any environment other than the default layout of the text class - // to be valid! bool asdefault = forceEmptyLayout(); - if (asdefault) - style = bparams.textClass().defaultLayout(); - else - style = d->layout_; + Layout const & style = asdefault ? + bparams.documentClass().emptyLayout() : + *d->layout_; // Current base font for all inherited font changes, without any // change caused by an individual character, except for the language: @@ -1862,7 +1861,7 @@ bool Paragraph::latex(Buffer const & buf, // if the paragraph is empty, the loop will not be entered at all if (empty()) { - if (style->isCommand()) { + if (style.isCommand()) { os << '{'; ++column; } @@ -1891,7 +1890,7 @@ bool Paragraph::latex(Buffer const & buf, os << "}] "; column +=3; } - if (style->isCommand()) { + if (style.isCommand()) { os << '{'; ++column; } @@ -1991,13 +1990,13 @@ bool Paragraph::latex(Buffer const & buf, if (c == ' ') { // FIXME: integrate this case in latexSpecialChar // Do not print the separation of the optional argument - // if style->pass_thru is false. This works because + // if style.pass_thru is false. This works because // latexSpecialChar ignores spaces if - // style->pass_thru is false. + // style.pass_thru is false. if (i != body_pos - 1) { if (d->simpleTeXBlanks( runparams, os, texrow, - i, column, font, *style)) { + i, column, font, style)) { // A surrogate pair was output. We // must not call latexSpecialChar // in this iteration, since it would output @@ -2009,22 +2008,22 @@ bool Paragraph::latex(Buffer const & buf, } OutputParams rp = runparams; - rp.free_spacing = style->free_spacing; + rp.free_spacing = style.free_spacing; rp.local_font = &font; - rp.intitle = style->intitle; + rp.intitle = style.intitle; // Two major modes: LaTeX or plain // Handle here those cases common to both modes // and then split to handle the two modes separately. if (c == META_INSET) - d->latexInset(buf, bparams, os, + d->latexInset(bparams, os, texrow, rp, running_font, basefont, outerfont, open_font, - runningChange, *style, i, column); + runningChange, style, i, column); else { try { d->latexSpecialChar(os, rp, running_font, runningChange, - *style, i, column); + style, i, column); } catch (EncodingException & e) { if (runparams.dryrun) { os << "<" << _("LyX Warning: ") @@ -2108,7 +2107,8 @@ bool Paragraph::emptyTag() const } -string Paragraph::getID(Buffer const & buf, OutputParams const & runparams) const +string Paragraph::getID(Buffer const & buf, OutputParams const & runparams) + const { for (pos_type i = 0; i < size(); ++i) { if (Inset const * inset = getInset(i)) { @@ -2124,12 +2124,13 @@ string Paragraph::getID(Buffer const & buf, OutputParams const & runparams) cons } -pos_type Paragraph::getFirstWord(Buffer const & buf, odocstream & os, OutputParams const & runparams) const +pos_type Paragraph::firstWord(odocstream & os, OutputParams const & runparams) + const { pos_type i; for (i = 0; i < size(); ++i) { if (Inset const * inset = getInset(i)) { - inset->docbook(buf, os, runparams); + inset->docbook(os, runparams); } else { char_type c = d->text_[i]; if (c == ' ') @@ -2166,11 +2167,11 @@ void Paragraph::simpleDocBookOnePar(Buffer const & buf, { bool emph_flag = false; - LayoutPtr const & style = d->layout_; + Layout const & style = *d->layout_; FontInfo font_old = - style->labeltype == LABEL_MANUAL ? style->labelfont : style->font; + style.labeltype == LABEL_MANUAL ? style.labelfont : style.font; - if (style->pass_thru && !d->onlyText(buf, outerfont, initial)) + if (style.pass_thru && !d->onlyText(buf, outerfont, initial)) os << "]]>"; // parsing main loop @@ -2189,11 +2190,11 @@ void Paragraph::simpleDocBookOnePar(Buffer const & buf, } if (Inset const * inset = getInset(i)) { - inset->docbook(buf, os, runparams); + inset->docbook(os, runparams); } else { char_type c = d->text_[i]; - if (style->pass_thru) + if (style.pass_thru) os.put(c); else os << sgml::escapeChar(c); @@ -2205,9 +2206,9 @@ void Paragraph::simpleDocBookOnePar(Buffer const & buf, os << ""; } - if (style->free_spacing) + if (style.free_spacing) os << '\n'; - if (style->pass_thru && !d->onlyText(buf, outerfont, initial)) + if (style.pass_thru && !d->onlyText(buf, outerfont, initial)) os << "textString(buffer, os); + getInset(i)->textString(os); } return os.str(); @@ -2335,19 +2333,19 @@ int Paragraph::id() const } -LayoutPtr const & Paragraph::layout() const +Layout const & Paragraph::layout() const { - return d->layout_; + return *d->layout_; } -void Paragraph::setLayout(LayoutPtr const & layout) +void Paragraph::setLayout(Layout const & layout) { - d->layout_ = layout; + d->layout_ = &layout; } -void Paragraph::setEmptyOrDefaultLayout(TextClass const & tclass) +void Paragraph::setEmptyOrDefaultLayout(DocumentClass const & tclass) { if (useEmptyLayout()) setLayout(tclass.emptyLayout()); @@ -2436,11 +2434,11 @@ char_type Paragraph::transformChar(char_type c, pos_type pos) const } -int Paragraph::checkBiblio(bool track_changes) +int Paragraph::checkBiblio(Buffer const & buffer) { - //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. + // 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 (d->layout_->labeltype != LABEL_BIBLIO) @@ -2451,6 +2449,8 @@ int Paragraph::checkBiblio(bool track_changes) && d->text_[0] == META_INSET && d->insetlist_.begin()->inset->lyxCode() == BIBITEM_CODE; + bool track_changes = buffer.params().trackChanges; + docstring oldkey; docstring oldlabel; @@ -2473,13 +2473,13 @@ int Paragraph::checkBiblio(bool track_changes) break; } - //There was an InsetBibitem at the beginning, and we didn't - //have to erase one. + // 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. + // 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(d->insetlist_.begin()->inset); @@ -2489,9 +2489,10 @@ int Paragraph::checkBiblio(bool track_changes) 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_CODE))); + // 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_CODE)); + inset->setBuffer(const_cast(buffer)); // restore values of previously deleted item in this par. if (!oldkey.empty()) inset->setParam("key", oldkey); @@ -2687,7 +2688,6 @@ bool Paragraph::isSeparator(pos_type pos) const void Paragraph::deregisterWords() { - // deregister words Private::Words::const_iterator it; WordList & wl = theWordList(); for (it = d->words_.begin(); it != d->words_.end(); ++it) @@ -2696,12 +2696,12 @@ void Paragraph::deregisterWords() } -void Paragraph::registerWords(Cursor const & cur) +void Paragraph::collectWords(CursorSlice const & sl) { // find new words bool inword = false; - - lyxerr << "Words: "; + + //lyxerr << "Words: "; pos_type n = size(); for (pos_type pos = 0; pos != n; ++pos) { if (isDeleted(pos)) @@ -2711,26 +2711,28 @@ void Paragraph::registerWords(Cursor const & cur) inword = false; continue; } - + if (inword) continue; - + inword = true; - CursorSlice from = cur.top(); - CursorSlice to = cur.top(); + CursorSlice from = sl; + CursorSlice to = sl; from.pos() = pos; to.pos() = pos; - from.text()->getWord(from, to, NEXT_WORD); + from.text()->getWord(from, to, WHOLE_WORD); if (to.pos() - from.pos() < 6) continue; - docstring word - = asString(cur.buffer(), from.pos(), to.pos(), false); + docstring word = asString(from.pos(), to.pos(), false); d->words_.insert(word); - lyxerr << word << " "; + //lyxerr << word << " "; } - lyxerr << std::endl; - - // register words + //lyxerr << std::endl; +} + + +void Paragraph::registerWords() +{ Private::Words::const_iterator it; WordList & wl = theWordList(); for (it = d->words_.begin(); it != d->words_.end(); ++it) @@ -2738,10 +2740,12 @@ void Paragraph::registerWords(Cursor const & cur) } -void Paragraph::updateWords(Cursor const & cur) +void Paragraph::updateWords(CursorSlice const & sl) { + BOOST_ASSERT(&sl.paragraph() == this); deregisterWords(); - registerWords(cur); + collectWords(sl); + registerWords(); } } // namespace lyx