X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fparagraph.C;h=9dce9f546ec3599fe3a5f67f9882e5cb51f19e77;hb=69bee02a8901793b34ac5ca6d07e93910cef4005;hp=44c829d8addbadb6697c061ea790ab54503d6366;hpb=15c913fe5a896f6d53dd50a64ed83be3ed1d8dc4;p=lyx.git diff --git a/src/paragraph.C b/src/paragraph.C index 44c829d8ad..9dce9f546e 100644 --- a/src/paragraph.C +++ b/src/paragraph.C @@ -22,14 +22,15 @@ #include "buffer.h" #include "bufferparams.h" +#include "counters.h" #include "encoding.h" #include "debug.h" #include "gettext.h" #include "language.h" -#include "latexrunparams.h" #include "lyxfont.h" #include "lyxrc.h" #include "lyxrow.h" +#include "outputparams.h" #include "paragraph_funcs.h" #include "sgml.h" #include "texrow.h" @@ -39,10 +40,12 @@ #include "insets/insetoptarg.h" #include "support/lstrings.h" -#include "support/textutils.h" #include "support/std_sstream.h" +#include "support/textutils.h" +#include "support/tostr.h" #include +#include #include #include @@ -61,23 +64,25 @@ using std::ostringstream; Paragraph::Paragraph() - : y(0), height(0), pimpl_(new Paragraph::Pimpl(this)) + : y(0), height(0), begin_of_body_(0), + pimpl_(new Paragraph::Pimpl(this)) { itemdepth = 0; params().clear(); } -Paragraph::Paragraph(Paragraph const & lp) - : y(0), height(0), text_(lp.text_), pimpl_(new Paragraph::Pimpl(*lp.pimpl_, this)) +Paragraph::Paragraph(Paragraph const & par) + : y(0), height(0), text_(par.text_), begin_of_body_(par.begin_of_body_), + pimpl_(new Paragraph::Pimpl(*par.pimpl_, this)) { itemdepth = 0; // this is because of the dummy layout of the paragraphs that // follow footnotes - layout_ = lp.layout(); + layout_ = par.layout(); // copy everything behind the break-position to the new paragraph - insetlist = lp.insetlist; + insetlist = par.insetlist; InsetList::iterator it = insetlist.begin(); InsetList::iterator end = insetlist.end(); for (; it != end; ++it) { @@ -87,26 +92,26 @@ Paragraph::Paragraph(Paragraph const & lp) } -void Paragraph::operator=(Paragraph const & lp) +void Paragraph::operator=(Paragraph const & par) { // needed as we will destroy the pimpl_ before copying it - if (&lp != this) + if (&par != this) return; lyxerr << "Paragraph::operator=()" << endl; - text_ = lp.text_; + text_ = par.text_; delete pimpl_; - pimpl_ = new Pimpl(*lp.pimpl_, this); + pimpl_ = new Pimpl(*par.pimpl_, this); - itemdepth = lp.itemdepth; + itemdepth = par.itemdepth; // this is because of the dummy layout of the paragraphs that // follow footnotes - layout_ = lp.layout(); + layout_ = par.layout(); // copy everything behind the break-position to the new paragraph - insetlist = lp.insetlist; + insetlist = par.insetlist; InsetList::iterator it = insetlist.begin(); InsetList::iterator end = insetlist.end(); for (; it != end; ++it) { @@ -114,7 +119,7 @@ void Paragraph::operator=(Paragraph const & lp) } } -// the destructor removes the new paragraph from the list + Paragraph::~Paragraph() { delete pimpl_; @@ -257,10 +262,17 @@ int Paragraph::erase(pos_type start, pos_type end) } -bool Paragraph::checkInsertChar(LyXFont & font) +void Paragraph::insert(pos_type start, string const & str, + LyXFont const & font) +{ + int size = str.size(); + for (int i = 0 ; i < size ; ++i) + insertChar(start + i, str[i], font); +} + + +bool Paragraph::checkInsertChar(LyXFont &) { - if (pimpl_->inset_owner) - return pimpl_->inset_owner->checkInsertChar(font); return true; } @@ -375,7 +387,7 @@ LyXFont const Paragraph::getFont(BufferParams const & bparams, pos_type pos, LyXLayout_ptr const & lout = layout(); - pos_type const body_pos = beginningOfBody(); + pos_type const body_pos = beginOfBody(); LyXFont layoutfont; if (pos < body_pos) @@ -579,9 +591,7 @@ int Paragraph::stripLeadingSpaces() bool Paragraph::hasSameLayout(Paragraph const & par) const { - return - par.layout() == layout() && - params().sameLayout(par.params()); + return par.layout() == layout() && params().sameLayout(par.params()); } @@ -633,34 +643,40 @@ void Paragraph::applyLayout(LyXLayout_ptr const & new_layout) layout(new_layout); params().labelWidthString(string()); params().align(LYX_ALIGN_LAYOUT); - params().spaceTop(VSpace(VSpace::NONE)); - params().spaceBottom(VSpace(VSpace::NONE)); params().spacing(Spacing(Spacing::Default)); } -int Paragraph::beginningOfBody() const +int Paragraph::beginOfBody() const { - if (layout()->labeltype != LABEL_MANUAL) - return 0; + return begin_of_body_; +} + + +void Paragraph::setBeginOfBody() +{ + if (layout()->labeltype != LABEL_MANUAL) { + begin_of_body_ = 0; + return; + } // Unroll the first two cycles of the loop // and remember the previous character to // remove unnecessary getChar() calls pos_type i = 0; - if (i < size() && !isNewline(i)) { + pos_type end = size(); + if (i < end && !isNewline(i)) { ++i; char previous_char = 0; char temp = 0; - if (i < size()) { - previous_char = getChar(i); + if (i < end) { + previous_char = text_[i]; if (!isNewline(i)) { ++i; - while (i < size() && previous_char != ' ') { - temp = getChar(i); + while (i < end && previous_char != ' ') { + temp = text_[i]; if (isNewline(i)) break; - ++i; previous_char = temp; } @@ -668,7 +684,7 @@ int Paragraph::beginningOfBody() const } } - return i; + begin_of_body_ = i; } @@ -687,17 +703,19 @@ int Paragraph::getPositionOfInset(InsetOld const * inset) const InsetBibitem * Paragraph::bibitem() const { - InsetList::const_iterator it = insetlist.begin(); - if (it != insetlist.end() && it->inset->lyxCode() == InsetOld::BIBTEX_CODE) - return static_cast(it->inset); + if (!insetlist.empty()) { + InsetOld * inset = insetlist.begin()->inset; + if (inset->lyxCode() == InsetOld::BIBTEX_CODE) + return static_cast(inset); + } return 0; } namespace { -/* paragraphs inside floats need different alignment tags to avoid -unwanted space */ +// paragraphs inside floats need different alignment tags to avoid +// unwanted space bool noTrivlistCentering(UpdatableInset const * inset) { @@ -868,7 +886,7 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf, BufferParams const & bparams, LyXFont const & outerfont, ostream & os, TexRow & texrow, - LatexRunParams const & runparams) + OutputParams const & runparams) { lyxerr[Debug::LATEX] << "SimpleTeXOnePar... " << this << endl; @@ -892,16 +910,7 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf, LyXFont basefont; // Maybe we have to create a optional argument. - pos_type body_pos; - - // FIXME: can we actually skip this check and just call - // beginningOfBody() ?? - if (style->labeltype != LABEL_MANUAL) { - body_pos = 0; - } else { - body_pos = beginningOfBody(); - } - + pos_type body_pos = beginOfBody(); unsigned int column = 0; if (body_pos > 0) { @@ -932,7 +941,6 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf, } if (!asdefault) column += startTeXParParams(bparams, os, moving_arg); - } for (pos_type i = 0; i < size(); ++i) { @@ -971,8 +979,7 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf, // rather than "\textXX{text }". (Asger) if (open_font && c == ' ' && i <= size() - 2) { LyXFont const & next_font = getFont(bparams, i + 1, outerfont); - if (next_font != running_font - && next_font != font) { + if (next_font != running_font && next_font != font) { font = next_font; } } @@ -1014,7 +1021,7 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf, column += Changes::latexMarkChange(os, running_change, change); running_change = change; - LatexRunParams rp = runparams; + OutputParams rp = runparams; rp.moving_arg = moving_arg; rp.free_spacing = style->free_spacing; pimpl_->simpleTeXSpecialChars(buf, bparams, @@ -1124,7 +1131,7 @@ void reset(PAR_TAG & p1, PAR_TAG const & p2) void Paragraph::simpleLinuxDocOnePar(Buffer const & buf, ostream & os, LyXFont const & outerfont, - LatexRunParams const & runparams, + OutputParams const & runparams, lyx::depth_type /*depth*/) const { LyXLayout_ptr const & style = layout(); @@ -1265,9 +1272,9 @@ void Paragraph::simpleLinuxDocOnePar(Buffer const & buf, char c = getChar(i); + if (c == Paragraph::META_INSET) { - InsetOld const * inset = getInset(i); - inset->linuxdoc(buf, os, runparams); + getInset(i)->linuxdoc(buf, os, runparams); font_old = font; continue; } @@ -1284,8 +1291,7 @@ void Paragraph::simpleLinuxDocOnePar(Buffer const & buf, if (ws && !isFreeSpacing()) { // in freespacing mode, spaces are // non-breaking characters - if (desc_on) {// if char is ' ' then... - + if (desc_on) { // if char is ' ' then... ++char_line_count; sgmlLineBreak(os, char_line_count, 6); os << ""; @@ -1319,19 +1325,44 @@ void Paragraph::simpleLinuxDocOnePar(Buffer const & buf, void Paragraph::simpleDocBookOnePar(Buffer const & buf, ostream & os, LyXFont const & outerfont, - int & desc_on, - LatexRunParams const & runparams, - lyx::depth_type depth) const + OutputParams const & runparams, + lyx::depth_type depth, + bool labelid) const { bool emph_flag = false; LyXLayout_ptr const & style = layout(); + LyXLayout_ptr const & defaultstyle = + buf.params().getLyXTextClass().defaultLayout(); - LyXFont font_old = (style->labeltype == LABEL_MANUAL ? style->labelfont : style->font); + LyXFont font_old = + style->labeltype == LABEL_MANUAL ? style->labelfont : style->font; int char_line_count = depth; - //if (!style.free_spacing) - // os << string(depth,' '); + bool label_closed = true; + bool para_closed = true; + + if (style->latextype == LATEX_ITEM_ENVIRONMENT) { + string ls = ""; + Counters & counters = buf.params().getLyXTextClass().counters(); + if (!style->free_spacing) + os << string(depth,' '); + if (!style->labeltag().empty()) { + os << "<" << style->labeltag() << ">\n"; + label_closed = false; + } else { + if (!defaultstyle->latexparam().empty()) { + counters.step("para"); + ls = tostr(counters.value("para")); + ls = " id=\"" + + subst(defaultstyle->latexparam(), "#", ls) + '"'; + } + os << "<" << style->itemtag() << ">\n" + << string(depth, ' ') << "<" + << defaultstyle->latexname() << ls << ">\n"; + para_closed = false; + } + } // parsing main loop for (pos_type i = 0; i < size(); ++i) { @@ -1360,7 +1391,8 @@ void Paragraph::simpleDocBookOnePar(Buffer const & buf, if (isInset(i)) { InsetOld const * inset = getInset(i); // don't print the inset in position 0 if desc_on == 3 (label) - if (i || desc_on != 3) { + //if (i || desc_on != 3) { + if (!labelid) { if (style->latexparam() == "CDATA") os << "]]>"; inset->docbook(buf, os, runparams); @@ -1377,10 +1409,13 @@ void Paragraph::simpleDocBookOnePar(Buffer const & buf, os << c; } else if (isFreeSpacing() || c != ' ') { os << str; - } else if (desc_on == 1) { + } else if (!style->labeltag().empty() && !label_closed) { ++char_line_count; - os << "\n"; - desc_on = 2; + os << "\nlabeltag() << "><" + << style->itemtag() << "><" + << defaultstyle->latexname() << ">"; + label_closed = true; + para_closed = false; } else { os << ' '; } @@ -1397,9 +1432,15 @@ void Paragraph::simpleDocBookOnePar(Buffer const & buf, } // resets description flag correctly - if (desc_on == 1) { + if (!label_closed) { // not closed... - os << "\n "; + os << "labeltag() << ">\n<" + << style->itemtag() << "><" + << defaultstyle->latexname() << "> "; + } + if (!para_closed) { + os << "\n" << string(depth, ' ') << "latexname() << ">\n"; } if (style->free_spacing) os << '\n'; @@ -1535,13 +1576,13 @@ bool Paragraph::isMultiLingual(BufferParams const & bparams) string const Paragraph::asString(Buffer const & buffer, bool label) const { - LatexRunParams runparams; + OutputParams runparams; return asString(buffer, runparams, label); } string const Paragraph::asString(Buffer const & buffer, - LatexRunParams const & runparams, + OutputParams const & runparams, bool label) const { #if 0 @@ -1556,7 +1597,7 @@ string const Paragraph::asString(Buffer const & buffer, else if (c == META_INSET && getInset(i)->lyxCode() == InsetOld::MATH_CODE) { ostringstream os; - getInset(i)->ascii(buffer, os, runparams); + getInset(i)->plaintext(buffer, os, runparams); s += subst(STRCONV(os.str()),'\n',' '); } } @@ -1574,13 +1615,13 @@ string const Paragraph::asString(Buffer const & buffer, pos_type beg, pos_type end, bool label) const { - LatexRunParams const runparams; + OutputParams const runparams; return asString(buffer, runparams, beg, end, label); } string const Paragraph::asString(Buffer const & buffer, - LatexRunParams const & runparams, + OutputParams const & runparams, pos_type beg, pos_type end, bool label) const { ostringstream os; @@ -1593,7 +1634,7 @@ string const Paragraph::asString(Buffer const & buffer, if (IsPrintable(c)) os << c; else if (c == META_INSET) - getInset(i)->ascii(buffer, os, runparams); + getInset(i)->plaintext(buffer, os, runparams); } return os.str(); @@ -1611,12 +1652,6 @@ void Paragraph::setInsetOwner(UpdatableInset * inset) } -void Paragraph::deleteInsetsLyXText(BufferView * bv) -{ - insetlist.deleteInsetsLyXText(bv); -} - - void Paragraph::setContentsFromPar(Paragraph const & par) { pimpl_->setContentsFromPar(par);