]> git.lyx.org Git - features.git/blobdiff - src/Paragraph.cpp
Rework that way that font tags are handled in XHTML output. We need
[features.git] / src / Paragraph.cpp
index 3ed382a23ea96912bb6cf6c04f604a39efc7be70..a95163ef3924d249e9e0d68cdbe12b06566e7880 100644 (file)
@@ -593,8 +593,8 @@ void Paragraph::addChangesToToc(DocIterator const & cdit,
 
 bool Paragraph::isDeleted(pos_type start, pos_type end) const
 {
-       LASSERT(start >= 0 && start <= size(), /**/);
-       LASSERT(end > start && end <= size() + 1, /**/);
+       LASSERT(start >= 0 && start <= size(), return false);
+       LASSERT(end > start && end <= size() + 1, return false);
 
        return d->changes_.isDeleted(start, end);
 }
@@ -602,8 +602,8 @@ bool Paragraph::isDeleted(pos_type start, pos_type end) const
 
 bool Paragraph::isChanged(pos_type start, pos_type end) const
 {
-       LASSERT(start >= 0 && start <= size(), /**/);
-       LASSERT(end > start && end <= size() + 1, /**/);
+       LASSERT(start >= 0 && start <= size(), return false);
+       LASSERT(end > start && end <= size() + 1, return false);
 
        return d->changes_.isChanged(start, end);
 }
@@ -648,7 +648,7 @@ void Paragraph::setChange(Change const & change)
 
 void Paragraph::setChange(pos_type pos, Change const & change)
 {
-       LASSERT(pos >= 0 && pos <= size(), /**/);
+       LASSERT(pos >= 0 && pos <= size(), return);
        d->changes_.set(change, pos);
 
        // see comment in setChange(Change const &) above
@@ -660,15 +660,15 @@ void Paragraph::setChange(pos_type pos, Change const & change)
 
 Change const & Paragraph::lookupChange(pos_type pos) const
 {
-       LASSERT(pos >= 0 && pos <= size(), /**/);
+       LBUFERR(pos >= 0 && pos <= size());
        return d->changes_.lookup(pos);
 }
 
 
 void Paragraph::acceptChanges(pos_type start, pos_type end)
 {
-       LASSERT(start >= 0 && start <= size(), /**/);
-       LASSERT(end > start && end <= size() + 1, /**/);
+       LASSERT(start >= 0 && start <= size(), return);
+       LASSERT(end > start && end <= size() + 1, return);
 
        for (pos_type pos = start; pos < end; ++pos) {
                switch (lookupChange(pos).type) {
@@ -702,8 +702,8 @@ void Paragraph::acceptChanges(pos_type start, pos_type end)
 
 void Paragraph::rejectChanges(pos_type start, pos_type end)
 {
-       LASSERT(start >= 0 && start <= size(), /**/);
-       LASSERT(end > start && end <= size() + 1, /**/);
+       LASSERT(start >= 0 && start <= size(), return);
+       LASSERT(end > start && end <= size() + 1, return);
 
        for (pos_type pos = start; pos < end; ++pos) {
                switch (lookupChange(pos).type) {
@@ -738,7 +738,7 @@ void Paragraph::rejectChanges(pos_type start, pos_type end)
 void Paragraph::Private::insertChar(pos_type pos, char_type c,
                Change const & change)
 {
-       LASSERT(pos >= 0 && pos <= int(text_.size()), /**/);
+       LASSERT(pos >= 0 && pos <= int(text_.size()), return);
 
        // track change
        changes_.insert(change, pos);
@@ -767,10 +767,10 @@ void Paragraph::Private::insertChar(pos_type pos, char_type c,
 
 
 bool Paragraph::insertInset(pos_type pos, Inset * inset,
-                                  Change const & change)
+                           Font const & font, Change const & change)
 {
-       LASSERT(inset, /**/);
-       LASSERT(pos >= 0 && pos <= size(), /**/);
+       LASSERT(inset, return false);
+       LASSERT(pos >= 0 && pos <= size(), return false);
 
        // Paragraph::insertInset() can be used in cut/copy/paste operation where
        // d->inset_owner_ is not set yet.
@@ -778,13 +778,15 @@ bool Paragraph::insertInset(pos_type pos, Inset * inset,
                return false;
 
        d->insertChar(pos, META_INSET, change);
-       LASSERT(d->text_[pos] == META_INSET, /**/);
+       LASSERT(d->text_[pos] == META_INSET, return false);
 
        // Add a new entry in the insetlist_.
        d->insetlist_.insert(inset, pos);
 
        // Some insets require run of spell checker
        requestSpellCheck(pos);
+
+       setFont(pos, font);
        return true;
 }
 
@@ -846,8 +848,8 @@ bool Paragraph::eraseChar(pos_type pos, bool trackChanges)
 
 int Paragraph::eraseChars(pos_type start, pos_type end, bool trackChanges)
 {
-       LASSERT(start >= 0 && start <= size(), /**/);
-       LASSERT(end >= start && end <= size() + 1, /**/);
+       LASSERT(start >= 0 && start <= size(), return 0);
+       LASSERT(end >= start && end <= size() + 1, return 0);
 
        pos_type i = start;
        for (pos_type count = end - start; count; --count) {
@@ -1043,7 +1045,7 @@ void Paragraph::Private::latexInset(BufferParams const & bparams,
                                    unsigned int & column)
 {
        Inset * inset = owner_->getInset(i);
-       LASSERT(inset, /**/);
+       LBUFERR(inset);
 
        if (style.pass_thru) {
                odocstringstream ods;
@@ -1783,12 +1785,10 @@ void Paragraph::insertChar(pos_type pos, char_type c,
 
 
 bool Paragraph::insertInset(pos_type pos, Inset * inset,
-                           Font const & font, Change const & change)
+                           Change const & change)
 {
-       bool const success = insertInset(pos, inset, change);
-       // Set the font/language of the inset...
-       setFont(pos, font);
-       return success;
+       Font no_font;
+       return insertInset(pos, inset, no_font, change);
 }
 
 
@@ -1805,7 +1805,7 @@ Font const & Paragraph::getFontSettings(BufferParams const & bparams,
 {
        if (pos > size()) {
                LYXERR0("pos: " << pos << " size: " << size());
-               LASSERT(pos <= size(), /**/);
+               LBUFERR(false);
        }
 
        FontList::const_iterator cit = d->fontlist_.fontIterator(pos);
@@ -1830,9 +1830,9 @@ Font const & Paragraph::getFontSettings(BufferParams const & bparams,
 
 FontSpan Paragraph::fontSpan(pos_type pos) const
 {
-       LASSERT(pos <= size(), /**/);
-       pos_type start = 0;
+       LBUFERR(pos < size());
 
+       pos_type start = 0;
        FontList::const_iterator cit = d->fontlist_.begin();
        FontList::const_iterator end = d->fontlist_.end();
        for (; cit != end; ++cit) {
@@ -1849,8 +1849,8 @@ FontSpan Paragraph::fontSpan(pos_type pos) const
        }
 
        // This should not happen, but if so, we take no chances.
-       // LYXERR0("Paragraph::getEndPosOfFontSpan: This should not happen!");
-       return FontSpan(pos, pos);
+       LYXERR0("Paragraph::fontSpan: position not found in fontinfo table!");
+       LASSERT(false, return FontSpan(pos, pos));
 }
 
 
@@ -1881,7 +1881,7 @@ Font const & Paragraph::getFirstFontSettings(BufferParams const & bparams) const
 Font const Paragraph::getFont(BufferParams const & bparams, pos_type pos,
                                 Font const & outerfont) const
 {
-       LASSERT(pos >= 0, /**/);
+       LBUFERR(pos >= 0);
 
        Font font = getFontSettings(bparams, pos);
 
@@ -1974,7 +1974,7 @@ char_type Paragraph::getUChar(BufferParams const & bparams, pos_type pos) const
 
 void Paragraph::setFont(pos_type pos, Font const & font)
 {
-       LASSERT(pos <= size(), /**/);
+       LASSERT(pos <= size(), return);
 
        // First, reduce font against layout/label font
        // Update: The setCharFont() routine in text2.cpp already
@@ -2831,6 +2831,21 @@ void Paragraph::simpleDocBookOnePar(Buffer const & buf,
 }
 
 
+namespace {
+void doFontSwitch(XHTMLStream & xs, bool startrange,
+       bool & flag, FontState curstate, html::FontTypes type)
+{
+       if (curstate == FONT_ON) {
+               xs << html::FontTag(type);
+               flag = true;
+       } else if (flag && !startrange) {
+               xs << html::EndFontTag(type);
+               flag = false;
+       }
+}
+}
+
+
 docstring Paragraph::simpleLyXHTMLOnePar(Buffer const & buf,
                                    XHTMLStream & xs,
                                    OutputParams const & runparams,
@@ -2841,17 +2856,16 @@ docstring Paragraph::simpleLyXHTMLOnePar(Buffer const & buf,
 
        bool emph_flag = false;
        bool bold_flag = false;
+       bool noun_flag = false;
+       bool ubar_flag = false;
+       bool dbar_flag = false;
+       bool sout_flag = false;
+       bool wave_flag = false;
 
        Layout const & style = *d->layout_;
 
        xs.startParagraph(allowEmpty());
 
-       if (!runparams.for_toc && runparams.html_make_pars) {
-               // generate a magic label for this paragraph
-               string const attr = "id='" + magicLabel() + "'";
-               xs << html::CompTag("a", attr);
-       }
-
        FontInfo font_old =
                style.labeltype == LABEL_MANUAL ? style.labelfont : style.font;
 
@@ -2861,28 +2875,45 @@ docstring Paragraph::simpleLyXHTMLOnePar(Buffer const & buf,
                if (isDeleted(i))
                        continue;
 
-               Font font = getFont(buf.params(), i, outerfont);
+               Font const font = getFont(buf.masterBuffer()->params(), i, outerfont);
+               bool const at_start = (i == initial);
 
                // emphasis
-               if (font_old.emph() != font.fontInfo().emph()) {
-                       if (font.fontInfo().emph() == FONT_ON) {
-                               xs << html::StartTag("em");
-                               emph_flag = true;
-                       } else if (emph_flag && i != initial) {
-                               xs << html::EndTag("em");
-                               emph_flag = false;
-                       }
-               }
+               FontState curstate = font.fontInfo().emph();
+               if (font_old.emph() != curstate)
+                       doFontSwitch(xs, at_start, emph_flag, curstate, html::FT_EMPH);
+
+               // noun
+               curstate = font.fontInfo().noun();
+               if (font_old.noun() != curstate)
+                       doFontSwitch(xs, at_start, noun_flag, curstate, html::FT_NOUN);
+
+               // underbar
+               curstate = font.fontInfo().underbar();
+               if (font_old.underbar() != curstate)
+                       doFontSwitch(xs, at_start, ubar_flag, curstate, html::FT_UBAR);
+       
+               // strikeout
+               curstate = font.fontInfo().strikeout();
+               if (font_old.strikeout() != curstate)
+                       doFontSwitch(xs, at_start, sout_flag, curstate, html::FT_SOUT);
+
+               // double underbar
+               curstate = font.fontInfo().uuline();
+               if (font_old.uuline() != curstate)
+                       doFontSwitch(xs, at_start, dbar_flag, curstate, html::FT_DBAR);
+
+               // wavy line
+               curstate = font.fontInfo().uwave();
+               if (font_old.uwave() != curstate)
+                       doFontSwitch(xs, at_start, wave_flag, curstate, html::FT_WAVE);
+
                // bold
-               if (font_old.series() != font.fontInfo().series()) {
-                       if (font.fontInfo().series() == BOLD_SERIES) {
-                               xs << html::StartTag("strong");
-                               bold_flag = true;
-                       } else if (bold_flag && i != initial) {
-                               xs << html::EndTag("strong");
-                               bold_flag = false;
-                       }
-               }
+               // a little hackish, but allows us to reuse what we have.
+               curstate = (font.fontInfo().series() == BOLD_SERIES ? FONT_ON : FONT_OFF);
+               if (font_old.series() != font.fontInfo().series())
+                       doFontSwitch(xs, at_start, bold_flag, curstate, html::FT_BOLD);
+
                // FIXME XHTML
                // Other such tags? What about the other text ranges?
 
@@ -2890,12 +2921,13 @@ docstring Paragraph::simpleLyXHTMLOnePar(Buffer const & buf,
                if (inset) {
                        if (!runparams.for_toc || inset->isInToc()) {
                                OutputParams np = runparams;
+                               np.local_font = &font;
                                if (!inset->getLayout().htmlisblock())
                                        np.html_in_par = true;
                                retval += inset->xhtml(xs, np);
                        }
                } else {
-                       char_type c = getUChar(buf.params(), i);
+                       char_type c = getUChar(buf.masterBuffer()->params(), i);
 
                        if (style.pass_thru || runparams.pass_thru)
                                xs << c;
@@ -3132,7 +3164,8 @@ void Paragraph::forToc(docstring & os, size_t maxlen) const
 }
 
 
-docstring Paragraph::stringify(pos_type beg, pos_type end, int options, OutputParams & runparams) const
+docstring Paragraph::stringify(pos_type beg, pos_type end, int options,
+        OutputParams const & runparams) const
 {
        odocstringstream os;
 
@@ -3141,13 +3174,16 @@ docstring Paragraph::stringify(pos_type beg, pos_type end, int options, OutputPa
                && !d->params_.labelString().empty())
                os << d->params_.labelString() << ' ';
 
+       OutputParams op = runparams;
+       op.for_search = true;
+
        for (pos_type i = beg; i < end; ++i) {
                char_type const c = d->text_[i];
                if (isPrintable(c) || c == '\t'
                    || (c == '\n' && (options & AS_STR_NEWLINES)))
                        os.put(c);
                else if (c == META_INSET && (options & AS_STR_INSETS)) {
-                       getInset(i)->plaintext(os, runparams);
+                       getInset(i)->plaintext(os, op);
                }
        }
 
@@ -3208,8 +3244,7 @@ void Paragraph::setPlainOrDefaultLayout(DocumentClass const & tclass)
 
 Inset const & Paragraph::inInset() const
 {
-       LASSERT(d->inset_owner_, throw ExceptionMessage(BufferException,
-               _("Memory problem"), _("Paragraph not properly initialized")));
+       LBUFERR(d->inset_owner_);
        return *d->inset_owner_;
 }