X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fparagraph.C;h=71df78078a54f9dde82c74f4ed438d2f6de090e4;hb=d891a896f47df2d7f048ad7e4498f2fd4f3c5d3b;hp=35101a0327db470d3a223816a7db97c67653d8cd;hpb=ce686f1803ba896e0fee934292c5879f278adead;p=lyx.git diff --git a/src/paragraph.C b/src/paragraph.C index 35101a0327..71df78078a 100644 --- a/src/paragraph.C +++ b/src/paragraph.C @@ -22,6 +22,7 @@ #include "buffer.h" #include "bufferparams.h" +#include "counters.h" #include "encoding.h" #include "debug.h" #include "gettext.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 @@ -52,6 +55,7 @@ using lyx::pos_type; using lyx::support::contains; using lyx::support::subst; +using std::distance; using std::endl; using std::list; using std::stack; @@ -82,10 +86,8 @@ Paragraph::Paragraph(Paragraph const & par) insetlist = par.insetlist; InsetList::iterator it = insetlist.begin(); InsetList::iterator end = insetlist.end(); - for (; it != end; ++it) { - // currently we hold Inset*, not InsetBase* - it->inset = static_cast(it->inset->clone().release()); - } + for (; it != end; ++it) + it->inset = it->inset->clone().release(); } @@ -111,9 +113,8 @@ void Paragraph::operator=(Paragraph const & par) insetlist = par.insetlist; InsetList::iterator it = insetlist.begin(); InsetList::iterator end = insetlist.end(); - for (; it != end; ++it) { - it->inset = static_cast(it->inset->clone().release()); - } + for (; it != end; ++it) + it->inset = it->inset->clone().release(); } @@ -178,7 +179,7 @@ void Paragraph::write(Buffer const & buf, ostream & os, switch (c) { case META_INSET: { - InsetOld const * inset = getInset(i); + InsetBase const * inset = getInset(i); if (inset) if (inset->directWrite()) { // international char, let it write @@ -268,10 +269,8 @@ void Paragraph::insert(pos_type start, string const & str, } -bool Paragraph::checkInsertChar(LyXFont & font) +bool Paragraph::checkInsertChar(LyXFont &) { - if (pimpl_->inset_owner) - return pimpl_->inset_owner->checkInsertChar(font); return true; } @@ -289,13 +288,13 @@ void Paragraph::insertChar(pos_type pos, Paragraph::value_type c, } -void Paragraph::insertInset(pos_type pos, InsetOld * inset) +void Paragraph::insertInset(pos_type pos, InsetBase * inset) { insertInset(pos, inset, LyXFont(LyXFont::ALL_INHERIT)); } -void Paragraph::insertInset(pos_type pos, InsetOld * inset, +void Paragraph::insertInset(pos_type pos, InsetBase * inset, LyXFont const & font, Change change) { pimpl_->insertInset(pos, inset, font, change); @@ -311,14 +310,14 @@ bool Paragraph::insetAllowed(InsetOld_code code) } -InsetOld * Paragraph::getInset(pos_type pos) +InsetBase * Paragraph::getInset(pos_type pos) { BOOST_ASSERT(pos < size()); return insetlist.get(pos); } -InsetOld const * Paragraph::getInset(pos_type pos) const +InsetBase const * Paragraph::getInset(pos_type pos) const { BOOST_ASSERT(pos < size()); return insetlist.get(pos); @@ -329,7 +328,10 @@ InsetOld const * Paragraph::getInset(pos_type pos) const LyXFont const Paragraph::getFontSettings(BufferParams const & bparams, pos_type pos) const { - BOOST_ASSERT(pos <= size()); + if (pos > size()) { + lyxerr << " pos: " << pos << " size: " << size() << endl; + BOOST_ASSERT(pos <= size()); + } Pimpl::FontList::const_iterator cit = pimpl_->fontlist.begin(); Pimpl::FontList::const_iterator end = pimpl_->fontlist.end(); @@ -520,7 +522,7 @@ void Paragraph::setFont(pos_type pos, LyXFont const & font) if (it->pos() >= pos) break; } - unsigned int i = std::distance(beg, it); + unsigned int i = distance(beg, it); bool notfound = (it == endit); if (!notfound && pimpl_->fontlist[i].font() == font) @@ -590,9 +592,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()); } @@ -644,8 +644,6 @@ 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)); } @@ -692,7 +690,7 @@ void Paragraph::setBeginOfBody() // returns -1 if inset not found -int Paragraph::getPositionOfInset(InsetOld const * inset) const +int Paragraph::getPositionOfInset(InsetBase const * inset) const { // Find the entry. InsetList::const_iterator it = insetlist.begin(); @@ -707,8 +705,8 @@ int Paragraph::getPositionOfInset(InsetOld const * inset) const InsetBibitem * Paragraph::bibitem() const { if (!insetlist.empty()) { - InsetOld * inset = insetlist.begin()->inset; - if (inset->lyxCode() == InsetOld::BIBTEX_CODE) + InsetBase * inset = insetlist.begin()->inset; + if (inset->lyxCode() == InsetBase::BIBTEX_CODE) return static_cast(inset); } return 0; @@ -717,15 +715,15 @@ InsetBibitem * Paragraph::bibitem() const 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) { if (inset && inset->owner()) { - InsetOld::Code const code = inset->owner()->lyxCode(); - return code == InsetOld::FLOAT_CODE || - code == InsetOld::WRAP_CODE; + InsetBase::Code const code = inset->owner()->lyxCode(); + return code == InsetBase::FLOAT_CODE || + code == InsetBase::WRAP_CODE; } return false; } @@ -1090,7 +1088,7 @@ void sgmlLineBreak(ostream & os, string::size_type & colcount, } enum PAR_TAG { - NONE=0, + PAR_NONE=0, TT = 1, SF = 2, BF = 4, @@ -1102,7 +1100,7 @@ enum PAR_TAG { string tag_name(PAR_TAG const & pt) { switch (pt) { - case NONE: return "!-- --"; + case PAR_NONE: return "!-- --"; case TT: return "tt"; case SF: return "sf"; case BF: return "bf"; @@ -1161,7 +1159,7 @@ void Paragraph::simpleLinuxDocOnePar(Buffer const & buf, // parsing main loop for (pos_type i = 0; i < size(); ++i) { - PAR_TAG tag_close = NONE; + PAR_TAG tag_close = PAR_NONE; list < PAR_TAG > tag_open; LyXFont const font = getFont(buf.params(), i, outerfont); @@ -1275,9 +1273,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; } @@ -1294,8 +1292,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 << ""; @@ -1329,19 +1326,44 @@ void Paragraph::simpleLinuxDocOnePar(Buffer const & buf, void Paragraph::simpleDocBookOnePar(Buffer const & buf, ostream & os, LyXFont const & outerfont, - int & desc_on, OutputParams const & runparams, - lyx::depth_type depth) const + 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) { @@ -1366,11 +1388,11 @@ void Paragraph::simpleDocBookOnePar(Buffer const & buf, } } - if (isInset(i)) { - InsetOld const * inset = getInset(i); + InsetBase 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); @@ -1387,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 << ' '; } @@ -1407,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'; @@ -1432,7 +1463,7 @@ bool IsInsetChar(char c) bool Paragraph::isHfill(pos_type pos) const { return IsInsetChar(getChar(pos)) - && getInset(pos)->lyxCode() == InsetOld::HFILL_CODE; + && getInset(pos)->lyxCode() == InsetBase::HFILL_CODE; } @@ -1445,7 +1476,7 @@ bool Paragraph::isInset(pos_type pos) const bool Paragraph::isNewline(pos_type pos) const { return IsInsetChar(getChar(pos)) - && getInset(pos)->lyxCode() == InsetOld::NEWLINE_CODE; + && getInset(pos)->lyxCode() == InsetBase::NEWLINE_CODE; } @@ -1508,7 +1539,7 @@ bool Paragraph::isRightToLeftPar(BufferParams const & bparams) const return lyxrc.rtl_support && getParLanguage(bparams)->RightToLeft() && !(inInset() && inInset()->owner() && - inInset()->owner()->lyxCode() == InsetOld::ERT_CODE); + inInset()->owner()->lyxCode() == InsetBase::ERT_CODE); } @@ -1525,7 +1556,7 @@ void Paragraph::changeLanguage(BufferParams const & bparams, } -bool Paragraph::isMultiLingual(BufferParams const & bparams) +bool Paragraph::isMultiLingual(BufferParams const & bparams) const { Language const * doc_language = bparams.language; Pimpl::FontList::const_iterator cit = pimpl_->fontlist.begin(); @@ -1564,7 +1595,7 @@ string const Paragraph::asString(Buffer const & buffer, if (IsPrintable(c)) s += c; else if (c == META_INSET && - getInset(i)->lyxCode() == InsetOld::MATH_CODE) { + getInset(i)->lyxCode() == InsetBase::MATH_CODE) { ostringstream os; getInset(i)->plaintext(buffer, os, runparams); s += subst(STRCONV(os.str()),'\n',' '); @@ -1674,7 +1705,6 @@ bool Paragraph::isChangeEdited(pos_type start, pos_type end) const void Paragraph::setChange(lyx::pos_type pos, Change::Type type) { pimpl_->setChange(pos, type); - } @@ -1709,7 +1739,6 @@ Paragraph::value_type Paragraph::getChar(pos_type pos) const << id() << " of size " << siz << " is a bit silly !" << endl; BOOST_ASSERT(false); - return '\0'; } return text_[pos]; @@ -1725,8 +1754,8 @@ int Paragraph::id() const LyXLayout_ptr const & Paragraph::layout() const { /* - InsetOld * inset = inInset(); - if (inset && inset->lyxCode() == InsetOld::ENVIRONMENT_CODE) + InsetBase * inset = inInset(); + if (inset && inset->lyxCode() == InsetBase::ENVIRONMENT_CODE) return static_cast(inset)->layout(); */ return layout_; @@ -1775,9 +1804,9 @@ bool Paragraph::isFreeSpacing() const return true; // for now we just need this, later should we need this in some - // other way we can always add a function to InsetOld too. + // other way we can always add a function to InsetBase too. if (pimpl_->inset_owner && pimpl_->inset_owner->owner()) - return pimpl_->inset_owner->owner()->lyxCode() == InsetOld::ERT_CODE; + return pimpl_->inset_owner->owner()->lyxCode() == InsetBase::ERT_CODE; return false; } @@ -1787,7 +1816,7 @@ bool Paragraph::allowEmpty() const if (layout()->keepempty) return true; if (pimpl_->inset_owner && pimpl_->inset_owner->owner()) - return pimpl_->inset_owner->owner()->lyxCode() == InsetOld::ERT_CODE; + return pimpl_->inset_owner->owner()->lyxCode() == InsetBase::ERT_CODE; return false; } @@ -1804,6 +1833,30 @@ RowList::iterator Paragraph::getRow(pos_type pos) } +RowList::const_iterator Paragraph::getRow(pos_type pos) const +{ + RowList::const_iterator rit = rows.end(); + RowList::const_iterator const begin = rows.begin(); + + for (--rit; rit != begin && rit->pos() > pos; --rit) + ; + + return rit; +} + + +size_t Paragraph::row(pos_type pos) const +{ + RowList::const_iterator rit = rows.end(); + RowList::const_iterator const begin = rows.begin(); + + for (--rit; rit != begin && rit->pos() > pos; --rit) + ; + + return rit - begin; +} + + unsigned char Paragraph::transformChar(unsigned char c, pos_type pos) const { if (!Encodings::is_arabic(c))